获取 Wi-Fi 配置文件信息
Getting Wi-Fi profile information
我正在使用 Windows 8.1,它没有工具(带有 GUI)来管理 wifi 网络配置文件。所以我正在写一篇对我有帮助的文章。我做了一些谷歌搜索并找到了 Managed Wifi API,并且在教程的帮助下我设法将这段代码放在一起:
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 上。我有两个问题。一是如何使用 Managed 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>
我需要获取 wifi 密码,但我认为它已加密。如何获取真实密码或解密加密后的密码?
更新: 我找到了两个链接:Exposing the WiFi Password Secrets and [C++] Dump wireless passwords 但我不确定它们是否有效,或者不确定如何在 C# 中实现它们。
正如我在评论中提到的,您可以使用
netsh wlan show profiles
然后
netsh wlan show profile "<a profile from the last step>" key=clear
如果您仍想在代码中执行此操作,请继续阅读:
您使用的托管WiFiAPI没有此功能,但您可以轻松添加。
将 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
}
将此函数添加到 WlanApi.cs 文件中,可能靠近 GetProfileXml 函数(为了便于组织)。
/// <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);
}
}
您可以调用此函数获取未加密的密钥。
我还没有测试过这个,但它应该可以工作。如果您有任何问题,请告诉我。
我正在使用 Windows 8.1,它没有工具(带有 GUI)来管理 wifi 网络配置文件。所以我正在写一篇对我有帮助的文章。我做了一些谷歌搜索并找到了 Managed Wifi API,并且在教程的帮助下我设法将这段代码放在一起:
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 上。我有两个问题。一是如何使用 Managed 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>
我需要获取 wifi 密码,但我认为它已加密。如何获取真实密码或解密加密后的密码?
更新: 我找到了两个链接:Exposing the WiFi Password Secrets and [C++] Dump wireless passwords 但我不确定它们是否有效,或者不确定如何在 C# 中实现它们。
正如我在评论中提到的,您可以使用
netsh wlan show profiles
然后
netsh wlan show profile "<a profile from the last step>" key=clear
如果您仍想在代码中执行此操作,请继续阅读:
您使用的托管WiFiAPI没有此功能,但您可以轻松添加。
将 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
}
将此函数添加到 WlanApi.cs 文件中,可能靠近 GetProfileXml 函数(为了便于组织)。
/// <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);
}
}
您可以调用此函数获取未加密的密钥。
我还没有测试过这个,但它应该可以工作。如果您有任何问题,请告诉我。