Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取Wi-Fi配置文件信息_C#_Xml_Encryption_Wifi_Wlanapi - Fatal编程技术网

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

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()) {

我使用的是Windows 8.1,它没有管理wifi网络配置文件的工具(带有GUI)。所以我正在写一篇对我有帮助的文章。我在谷歌上搜索了一下,找到了,在一个教程的帮助下,我成功地将以下代码组合在一起:

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);
    }
}