2017-08-03 203 views
0

我正在做一个wmi查询来检查IIS池是否正在运行。 通过PowerShell中,查询工作访问被拒绝wmi查询root MicrosoftIISV2与管理员

Get-WmiObject ` 
    -Credential (Get-Credential) ` 
    -ComputerName MyMachine ` 
    -Namespace root\MicrosoftIISV2 ` 
    -Query "select * from IISApplicationPoolSetting where Name='W3SVC/APPPOLLS/MyPool'" 

通过C#,我得到一个ManagementException与错误码AccessDenied

var ms = new ManagementScope([email protected]"\\{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_Service类进行查询来检查windows服务的状态,并且它在两个方面都能很好地工作。

在我能得到任何方法的工作之前,我必须禁用远程UAC。

Set-ItemProperty ` 
    -Path HKLM:\Software\Microsoft\Windows\CurrentVersion\Policies\System ` 
    -Name LocalAccountTokenFilterPolicy -Value 1 -Type DWORD 

我的问题是有关权限/特权:

  1. 为什么我得到存取遭拒例外与管理员用户?我怎样才能调试呢?
  2. 是否严格禁用远程UAC?
  3. 正在使用管理员帐户或Administrators组中的用户无法避免?
+0

您需要:ms.Connect();在将它传递到ManagementObjectSearcher之前 - 理想情况下就在var查询行之前。你已经告诉它使用哪些凭证,但忘记尝试以该用户身份进行连接。禁用UAC不应该是必要的 - 如果可能的话,您应该避免这样做。最后,这取决于呼叫机器登录为的用户。如果应用程序以域名/管理员身份登录(不是本地管理员) - 那么“管理员”将能够呼叫远程PC,并且不需要传递凭证。 – Scott

+0

当然,任何其他有权访问这两台机器的用户也应该可以工作,但这将是网络AD安全许可的事情。 https://msdn.microsoft.com/en-us/library/system.management.managementscope(v=vs.110).aspx – Scott

+0

@Scott, 1.调用ms.Connect()对异常没有影响。此外,它在root \ cimv2命名空间中没有它。 2.的确,机器管理员不需要禁用远程UAC,但管理员组中的其他本地用户确实需要它。 3.我已经注意到这是安全许可的事情 – pitermarx

回答

0

我想我有一部分。

new ConnectionOptions 
{ 
    Username = ".\\localAdministrator", 
    SecurePassword = Secure("localAdminPwd"), 
    Authentication = AuthenticationLevel.PacketPrivacy 
} 

随着数据包保密选项,没有异常没有了,我可以使用本地管理员(Administrators组中只是一个用户)。

我不确定这个选项有什么作用,为什么需要它,但它解决了我的主要问题。如果任何人都明白这一点足以解释我仍然可以将答案标记为已接受。

我会继续探索权限以准确找出需要什么权限。