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 で、「イベントはサブスクライバーを呼び出すことができませんでした」に解決されます。上記のエラー コードのいずれとも一致しないようです。

手動でネットワーク アダプタのプロパティに移動し、共有タブに移動して共有を有効にし、プライベート ネットワークを選択して [OK] をクリックすると、共有が適切に有効になります。

この後、上記のコードは問題なく実行されます。

別のアダプター (パブリック) と別のプライベート ネットワークで手動で共有を設定し、コードを実行して、コードがパブリック ネットワークとプライベート ネットワークを希望どおりに更新することを確認することもできます。これは、最初にネットワーク プロパティ ペインで共有を手動で有効にした後にのみ機能するようです。

この問題は、Windows 7 64 ビットを実行している 2 台の異なるコンピューターで再現されています。共有がシステムで有効になっているときにシステムからネットワーク アダプター ドライバーをアンインストールし、ネットワーク アダプター ドライバーを再インストールした後に発生するようです。

アンインストーラーでアンインストール中に共有を無効にしようとしましたが、これはヒットまたはミスのようです。

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 に答える