c#-获取Wi-Fi配置文件信息

我使用的是Windows 8.1,它没有用于管理wifi网络配置文件的工具(带有GUI).所以我正在写一篇对我有帮助的书.我进行了一次谷歌搜索,发现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[C++] Dump wireless passwords,但是我不确定它们是否有效,或者不确定如何在C#中实现它们.

解决方法:

正如我在评论中提到的,您可以使用

netsh wlan show profiles

然后

netsh wlan show profile "<a profile from the last step>" key=clear

如果您仍然想在代码中执行此操作,请继续阅读:

您使用的托管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
}

将此功能添加到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);
    }
}

您可以调用此函数以获取未加密的密钥.

我没有测试过,但是应该可以.如果您有任何疑问,请告诉我.

上一篇:java-如何将任务分配给每个处理器核心?


下一篇:如何使用Rijndael在iOS中对C#中的解密字符串进行加密