2017-08-03 209 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組中只是一個用戶)。

我不確定這個選項有什麼作用,爲什麼需要它,但它解決了我的主要問題。如果任何人都明白這一點足以解釋我仍然可以將答案標記爲已接受。

我會繼續探索權限以準確找出需要什麼權限。