6

我正在尝试以编程方式启用与 Windows 7 机器上已知 GUID 匹配的设备上的共享类型 public 的共享。

API 位于: http: //msdn.microsoft.com/en-us/library/windows/desktop/aa365944 (v=vs.85).aspx

错误列表显示如下:E_ABORT、E_FAIL、E_INVALIDARG、E_NOINTERFACE、E_NOTIMPL、E_OUTOFMEMORY、E_POINTER 和 E_UNEXPECTED。

我得到的错误代码是 0x80040201,它解析为:“事件无法调用任何订阅者。” 这似乎与上面列出的任何错误代码都不匹配。

如果我手动进入网络适配器属性并转到共享选项卡并启用共享并选择专用网络并单击确定,共享将正确启用。

在此之后,我上面的代码运行没有问题。

我什至可以在另一个适配器(公共)和不同的专用网络上手动设置共享,然后运行我的代码并查看我的代码将公共和专用网络更新为我想要的。这似乎仅在首先通过网络属性窗格手动启用共享后才有效。

该问题已在运行 windows 7 64 位的两台不同计算机上重复出现。这似乎是在启用共享时从系统中卸载网络适配器驱动程序然后重新安装网络适配器驱动程序后发生的。

我试过让卸载程序在卸载期间禁用共享,但这似乎是命中或错过。

Windows 网络共享属性窗格在后台执行此 API 调用不执行的操作,因为每次手动设置适配器上的共享都有效。

有谁知道那可能是什么?

4

1 回答 1

1

我在 Windows 8.1 上遇到了同样的问题,并在阅读后最终修复了它:https: //support.microsoft.com/kb/828807

我的代码是 C# 但我相信你可以在 C++ 中做同样的事情

// Disable ICS on any network iterfaces which may no longer be present in the system
public void Disable_ICS_WMI()
{
  ManagementScope scope = new ManagementScope("\\\\.\\ROOT\\Microsoft\\HomeNet");

  //create object query
  ObjectQuery query = new ObjectQuery("SELECT * FROM HNet_ConnectionProperties ");

  //create object searcher
  ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
  //get a collection of WMI objects
  ManagementObjectCollection queryCollection = searcher.Get();

  //enumerate the collection.
  foreach (ManagementObject m in queryCollection)
  {
    // access properties of the WMI object
    Console.WriteLine("Connection : {0}", m["Connection"]);
    try
    {
       PropertyDataCollection properties = m.Properties;
       foreach(PropertyData  prop in properties)
       {
         if (prop.Name == "IsIcsPrivate" && ((Boolean) prop.Value ) == true)
         {
            prop.Value = false;
            m.Put();
         }
       }          
     } catch (Exception e)
     {
       Console.WriteLine("ex " + e.Message);
       continue;
     }
  }
}
于 2014-12-07T15:23:11.683 回答