C# 使用管理员对root\MicrosoftiSV2的wmi查询的访问被拒绝

C# 使用管理员对root\MicrosoftiSV2的wmi查询的访问被拒绝,c#,.net,powershell,wmi,get-wmiobject,C#,.net,Powershell,Wmi,Get Wmiobject,我正在执行wmi查询以检查IIS池是否正在运行。 通过powershell,查询可以工作 Get-WmiObject ` -Credential (Get-Credential) ` -ComputerName MyMachine ` -Namespace root\MicrosoftIISV2 ` -Query "select * from IISApplicationPoolSetting where Name='W3SVC/APPPOLLS/MyPool'"

我正在执行wmi查询以检查IIS池是否正在运行。 通过powershell,查询可以工作

Get-WmiObject `
    -Credential (Get-Credential) `
    -ComputerName MyMachine `
    -Namespace root\MicrosoftIISV2 `
    -Query "select * from IISApplicationPoolSetting where Name='W3SVC/APPPOLLS/MyPool'"
通过C#,我得到一个带有ErrorCode
AccessDenied的
ManagementException

var ms = new ManagementScope($@"\\{myMachine}\root\MicrosoftIISV2", new ConnectionOptions
{
    Username = $".\\Administrator",
    SecurePassword = Secure("adminPwd")
});
var query = "SELECT * FROM IISApplicationPoolSetting where name='W3SVC/APPPOLLS/MyPool'";
using (var searcher = new ManagementObjectSearcher(ms, new SelectQuery(query)))
{
    var objects = searcher.Get(); // throws here
}
这两种情况下的用户都是机器管理员帐户。我希望通过设置正确的权限,这不是必需的

我还通过查询
root\cimv2
名称空间和
Win32\u服务
类来检查windows服务的状态,它在这两种方法中都非常有效

在我能让任何方法工作之前,我必须禁用远程UAC

Set-ItemProperty `
    -Path HKLM:\Software\Microsoft\Windows\CurrentVersion\Policies\System `
    -Name LocalAccountTokenFilterPolicy -Value 1 -Type DWORD
我的问题与权限/特权有关:

  • 为什么管理员用户会出现AccessDenied异常?我如何调试这个
  • 是否必须禁用远程UAC
  • 使用管理员帐户或管理员组中的用户是否不可避免

  • 我想我也有份

    new ConnectionOptions
    {
        Username = ".\\localAdministrator",
        SecurePassword = Secure("localAdminPwd"),
        Authentication = AuthenticationLevel.PacketPrivacy
    }
    
    有了PacketPrivacy选项,就没有例外了,我可以使用本地管理员(只是管理员组中的一个用户)

    我不确定这个选项的作用以及为什么需要它,但它解决了我的主要问题。如果有人能很好地理解这一点来解释,我仍然可以将答案标记为已接受


    我将继续探索权限,以确定所需的权限。

    我想我得到了其中的一部分

    new ConnectionOptions
    {
        Username = ".\\localAdministrator",
        SecurePassword = Secure("localAdminPwd"),
        Authentication = AuthenticationLevel.PacketPrivacy
    }
    
    有了PacketPrivacy选项,就没有例外了,我可以使用本地管理员(只是管理员组中的一个用户)

    我不确定这个选项的作用以及为什么需要它,但它解决了我的主要问题。如果有人能很好地理解这一点来解释,我仍然可以将答案标记为已接受


    我将继续探索权限,以确定需要哪些权限。

    您需要执行的操作:ms.Connect();在将其传递到ManagementObjectSearcher之前-最好在var查询行之前。您已经告诉它要使用什么凭据,但忘记尝试作为该用户进行连接。禁用UAC不应该是必要的——如果可能的话,您应该避免这样做。最后,这取决于呼叫机器登录的用户。如果应用程序以域/管理员(而非本地管理员)身份登录,则“管理员”将能够呼叫远程PC,并且不需要传递凭据。当然,任何具有访问这两台计算机权限的其他用户也应该可以工作,但这将是一个网络广告安全权限问题@斯科特,1岁。调用ms.Connect()对异常没有影响。此外,它在root\cimv2命名空间上不使用它也可以工作。2.的确,机器管理员不需要禁用远程UAC,但administrators组中的其他本地用户确实需要它3。我已经注意到这是一个安全许可,你需要做的事情:ms.Connect();在将其传递到ManagementObjectSearcher之前-最好在var查询行之前。您已经告诉它要使用什么凭据,但忘记尝试作为该用户进行连接。禁用UAC不应该是必要的——如果可能的话,您应该避免这样做。最后,这取决于呼叫机器登录的用户。如果应用程序以域/管理员(而非本地管理员)身份登录,则“管理员”将能够呼叫远程PC,并且不需要传递凭据。当然,任何具有访问这两台计算机权限的其他用户也应该可以工作,但这将是一个网络广告安全权限问题@斯科特,1岁。调用ms.Connect()对异常没有影响。此外,它在root\cimv2命名空间上不使用它也可以工作。2.的确,机器管理员不需要禁用远程UAC,但administrators组中的其他本地用户确实需要它3。我已经注意到这是安全许可的事情