C# WMI Win32“网络适配器配置”;EnableStatic“;调用失败,返回结果为0x80041003

C# WMI Win32“网络适配器配置”;EnableStatic“;调用失败,返回结果为0x80041003,c#,wmi,C#,Wmi,我无法为连接到我的系统并播发网络适配器的设备分配静态IP地址。每当我使用IP和子网掩码在设备上调用EnableStatic时,它都会返回错误代码0x80041003,我认为这意味着“访问被拒绝”。我可以在Windows中更改IP地址,而无需提升 我用来设置IP地址的代码如下所示: /// <summary> /// Set's a new IP Address and subnet mask for the adapter with the given descriptio

我无法为连接到我的系统并播发网络适配器的设备分配静态IP地址。每当我使用IP和子网掩码在设备上调用EnableStatic时,它都会返回错误代码0x80041003,我认为这意味着“访问被拒绝”。我可以在Windows中更改IP地址,而无需提升

我用来设置IP地址的代码如下所示:

 /// <summary>
    /// Set's a new IP Address and subnet mask for the adapter with the given description.
    /// </summary>
    /// <param name="description">Description string used to ID the adapter.</param>
    /// <param name="ip_address">The IP Address.</param>
    /// <param name="subnet_mask">The Submask IP Address</param>
    public static void SetIP(string description, string ip, string mask)
    {
        ManagementClass findAdapters = 
                                    new ManagementClass("Win32_NetworkAdapterConfiguration");
        ManagementObjectCollection adapters = findAdapters.GetInstances();

        foreach (ManagementObject adapter in adapters)
        {
            string name = (string)adapter["Description"];

            if (name != description)
            {
                continue;
            }

            try
            {
                ManagementBaseObject newIP = 
                                           adapter.GetMethodParameters("EnableStatic");

                newIP["IPAddress"] = new string[] { ip };
                newIP["SubnetMask"] = new string[] { mask };

                ManagementBaseObject setIP = 
                                            adapter.InvokeMethod("EnableStatic", newIP, null);

                UInt32 result = (UInt32)(setIP["returnValue"]);
            }
            catch (Exception)
            {
                throw;
            }                
        }
    }
//
///设置具有给定描述的适配器的新IP地址和子网掩码。
/// 
///用于标识适配器的描述字符串。
///IP地址。
///子掩码IP地址
公共静态void SetIP(字符串描述、字符串ip、字符串掩码)
{
ManagementClass findAdapters=
新的管理类(“Win32_网络适配器配置”);
ManagementObjectCollection适配器=findAdapters.GetInstances();
foreach(适配器中的ManagementObject适配器)
{
字符串名称=(字符串)适配器[“说明”];
如果(名称!=说明)
{
继续;
}
尝试
{
ManagementBaseObject新IP=
adapter.GetMethodParameters(“EnableStatic”);
newIP[“IPAddress”]=新字符串[]{ip};
newIP[“子网掩码”]=新字符串[]{mask};
ManagementBaseObject设置IP=
InvokeMethod(“EnableStatic”,newIP,null);
UInt32结果=(UInt32)(setIP[“returnValue”]);
}
捕获(例外)
{
投掷;
}                
}
}
我在互联网上四处寻找解决方案。看起来最有可能的是,在一切都启动并运行之前,我需要做一些类似于CoInitializeSecurity的事情。但我觉得这很奇怪。我使用的是WMI名称空间,如果WMI以某种方式依赖于这样的东西,那么它肯定也应该在名称空间中吗

我在这里遗漏了一些东西


顺便说一句,在域上以用户身份运行Windows 7,但如果有帮助,我是本地管理员

您需要以管理员身份运行

如果您想避免UAC提示,可以执行以下操作

创建并安装一个能够更改IP的服务,并以管理员身份运行


必要时将新IP告知服务部门

完全正确。我们昨天设法解决了这个问题。遗憾的是,没有时间为这个版本编写服务,但我们将在下一个版本中编写服务。