INetSharingConfiguration->EnableSharing( ICSSHARINGTYPE_PUBLIC ) returns 0x80040201

6

I am trying to programmatically enable sharing with the sharing type public on a device that matches a known GUID on a windows 7 machine.

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

The list of errors show the following: E_ABORT, E_FAIL, E_INVALIDARG, E_NOINTERFACE, E_NOTIMPL, E_OUTOFMEMORY, E_POINTER, and E_UNEXPECTED.

The error code I am getting back is 0x80040201 which resolves to: "An event was unable to invoke any of the subscribers." which doesn't seem to match any of the above listed error codes.

If I manually go into the network adapters properties and go to the sharing tab and enable sharing and select the private network and click ok, sharing gets enabled properly.

After this my above code runs without issue.

I can even manually set sharing on another adapter (public) and a different private network and then run my code and see that my code updates the public and private networks to what I want. This only seems to work after first manually enabling sharing through the network properties pane.

The issue has been duplicated on two different computer running windows 7 64 bit. It seems to happen after uninstalling the network adapter driver from the system when sharing is enabled on it and then re-installing the network adapter driver.

I've tried making the uninstaller disable sharing during uninstall but this seems to be hit or miss.

The windows network sharing property pane is doing something behind the scenes that this API call does not do since manually setting sharing on the adapter works every time.

Does anyone have any ideas what that might be?

c++
windows-7
sharing
asked on Stack Overflow Apr 11, 2012 by Stephen Hankinson • edited Sep 25, 2012 by TZHX

1 Answer

1

I had the same issue on windows 8.1 and ended up fixing it after reading:https://support.microsoft.com/kb/828807

My code is C# but I´m sure you can do the same thing in 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;
     }
  }
}
answered on Stack Overflow Dec 7, 2014 by karl

User contributions licensed under CC BY-SA 3.0