C# 获取Wi-Fi配置文件信息
我使用的是Windows 8.1,它没有管理wifi网络配置文件的工具(带有GUI)。所以我正在写一篇对我有帮助的文章。我在谷歌上搜索了一下,找到了,在一个教程的帮助下,我成功地将以下代码组合在一起:C# 获取Wi-Fi配置文件信息,c#,xml,encryption,wifi,wlanapi,C#,Xml,Encryption,Wifi,Wlanapi,我使用的是Windows 8.1,它没有管理wifi网络配置文件的工具(带有GUI)。所以我正在写一篇对我有帮助的文章。我在谷歌上搜索了一下,找到了,在一个教程的帮助下,我成功地将以下代码组合在一起: foreach (WlanClient.WlanInterface wlanIface in client.Interfaces) { foreach (Wlan.WlanProfileInfo profileInfo in wlanIface.GetProfiles()) {
foreach (WlanClient.WlanInterface wlanIface in client.Interfaces)
{
foreach (Wlan.WlanProfileInfo profileInfo in wlanIface.GetProfiles())
{
string profileName = profileInfo.profileName;
ListViewItem item = new ListViewItem(profileName);
string profileXML = wlanIface.GetProfileXml(profileInfo.profileName);
XmlDocument doc = new XmlDocument();
doc.LoadXml(profileXML);
var NSManager = new XmlNamespaceManager(doc.NameTable);
NSManager.AddNamespace("d", "http://www.microsoft.com/networking/WLAN/profile/v1");
XmlNode node = doc.DocumentElement.SelectSingleNode("//d:WLANProfile/d:MSM/d:security/d:authEncryption/d:authentication", NSManager);
item.SubItems.Add(node.InnerText);
Profiles.Items.Add(item);
}
}
获取已保存的网络配置文件列表并在ListView上打印它们。我有两个问题。一是如何使用托管Wifi API获取完整的配置文件信息?因为我唯一能得到的就是档案名。该站点中没有文档
第二个问题是,因为我无法使用API获得完整的网络信息,所以我使用API以XML格式打印概要信息,然后解析XML并读取它。XML示例:
<?xml version="1.0"?>
<WLANProfile xmlns="http://www.microsoft.com/networking/WLAN/profile/v1">
<name>MEDO PUB</name>
<SSIDConfig>
<SSID>
<hex>4D45444F20505542</hex>
<name>MEDO PUB</name>
</SSID>
</SSIDConfig>
<connectionType>ESS</connectionType>
<connectionMode>manual</connectionMode>
<MSM>
<security>
<authEncryption>
<authentication>WPA2PSK</authentication>
<encryption>AES</encryption>
<useOneX>false</useOneX>
</authEncryption>
<sharedKey>
<keyType>passPhrase</keyType>
<protected>true</protected>
<keyMaterial>someReallyLongStringLike500+chars</keyMaterial>
</sharedKey>
</security>
</MSM>
</WLANProfile>
梅多酒吧
4D45444F205542
梅多酒吧
嵌入式安全子系统
手册
但我不确定它们是否有效,或者更确切地说,如何在C#中实现它们。正如我在评论中提到的,您可以使用
netsh wlan show profiles
然后
netsh wlan显示配置文件“”键=清除
如果仍要在代码中执行此操作,请继续阅读:
您正在使用的托管WiFi API没有此功能,但您可以轻松添加它
将Interop.cs中的WlanProfileFlags枚举修改为:
[Flags]
public enum WlanProfileFlags
{
/// <remarks>
/// The only option available on Windows XP SP2.
/// </remarks>
AllUser = 0,
GroupPolicy = 1,
User = 2,
GetPlaintextKey = 4
}
[标志]
公共枚举WlanProfileFlags
{
///
///Windows XP SP2上唯一可用的选项。
///
AllUser=0,
GroupPolicy=1,
用户=2,
GetPlaintextKey=4
}
将此函数添加到WlanApi.cs文件中,可能靠近GetProfileXml函数(为了组织起见)
//
///获取配置文件的XML规范。密钥未加密。
///
///配置文件的名称。
///XML文档。
公共字符串GetProfileXmlUnencrypted(字符串profileName)
{
IntPtr-profileXmlPtr;
Wlan.WlanProfileFlags flags=Wlan.WlanProfileFlags.GetPlaintextKey;
Wlan.WlanAccess接入;
Wlan.throwiferor(
Wlan.WlanGetProfile(client.clientHandle,info.interfaceGuid,profileName,IntPtr.Zero,out profileXmlPtr,out flags,out access));
尝试
{
返回Marshal.PtrToStringUni(profileXmlPtr);
}
最后
{
Wlan.wlanfreemory(profileXmlPtr);
}
}
您可以调用此函数来获取未加密的密钥
我还没有测试过这个,但它应该可以工作。如果您有任何问题,请告诉我。忘记破解密码吧。您可以使用如下网页上的代码递归添加xml:@jdweng我不知道您的意思。我不想读取XML值。我想解密加密或“哈希”XML值,即wifi密码。它是一个密码,设计为不被解密。@jdweng第三方应用程序可以解密密码,例如,或以某种方式访问密码。此外,“Windows 8.1没有管理wifi网络配置文件的工具”——这句话是不正确的。您可以使用cmd工具netsh执行此操作。以管理员身份打开cmd窗口并键入:netsh wlan show profiles
,然后从中获取密码:netsh wlan show profile“key=clear
您提供的代码示例工作正常。我有一个问题,tho。你怎么知道的?我试图查找有关托管Wifi API的文档和教程,但找不到任何文档和教程。它是来自经验还是有某种来源?我可能需要关于我正在构建的这个工具的进一步帮助,所以我想知道。我一直在使用本机WiFi API,所以我只是查看了托管API在做什么,并添加了缺失的功能。以下是相关本机函数的链接。请注意,第四个参数pdwFlags的值为WLAN\u PROFILE\u GET\u PLAINTEXT\u KEY。这对应于我添加的4个参数。哎呀,我是指第6个参数。因为我看到了很多关于这个托管WiFi API的问题,而且它似乎很流行,所以我决定将它克隆到github。好的,我知道这只是Codeplex上的一个副本,但是如果您还有任何问题,请随时打开一个问题,我会帮助您。我很高兴您这样做,因为我想我会改进我的工具,并且肯定需要帮助:)
[Flags]
public enum WlanProfileFlags
{
/// <remarks>
/// The only option available on Windows XP SP2.
/// </remarks>
AllUser = 0,
GroupPolicy = 1,
User = 2,
GetPlaintextKey = 4
}
/// <summary>
/// Gets the profile's XML specification. Key is unencrypted.
/// </summary>
/// <param name="profileName">The name of the profile.</param>
/// <returns>The XML document.</returns>
public string GetProfileXmlUnencrypted(string profileName)
{
IntPtr profileXmlPtr;
Wlan.WlanProfileFlags flags = Wlan.WlanProfileFlags.GetPlaintextKey;
Wlan.WlanAccess access;
Wlan.ThrowIfError(
Wlan.WlanGetProfile(client.clientHandle, info.interfaceGuid, profileName, IntPtr.Zero, out profileXmlPtr, out flags, out access));
try
{
return Marshal.PtrToStringUni(profileXmlPtr);
}
finally
{
Wlan.WlanFreeMemory(profileXmlPtr);
}
}