C# 使用管理员对root\MicrosoftiSV2的wmi查询的访问被拒绝
我正在执行wmi查询以检查IIS池是否正在运行。 通过powershell,查询可以工作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'"
Get-WmiObject `
-Credential (Get-Credential) `
-ComputerName MyMachine `
-Namespace root\MicrosoftIISV2 `
-Query "select * from IISApplicationPoolSetting where Name='W3SVC/APPPOLLS/MyPool'"
通过C#,我得到一个带有ErrorCodeAccessDenied的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。我已经注意到这是安全许可的事情