1
我正在編寫一個應用程序,它聚合了幾個不同服務器上的所有事件日誌條目。我可以通過傳遞MachineName
到EventLog.GetEventLogs
來獲取事件日誌。這通常會在某個階段失敗,因爲用戶不是該機器上的本地管理員,所以我想提前檢查並跳到下一組服務器(如果情況如此)檢查用戶是否是外部計算機上的本地管理員
For Each svr As String In Servers
'TODO: check to see if they are a local administrator, else continue for
Dim logs As List(Of EventLog) = EventLog.GetEventLogs(svr).ToList
For Each log As EventLog In logs
LoadEachOSLogEntry(log)
Next
Next
大多數解決方案(如here)只會檢查用戶是否是當前正在執行的計算機上的管理員。
Dim user As WindowsIdentity = WindowsIdentity.GetCurrent()
Dim principal As New WindowsPrincipal(user)
Dim isAdmin As Boolean = principal.IsInRole(WindowsBuiltInRole.Administrator)
旁白:處理偶爾的失敗不是更容易嗎?而不是對目標機器執行一些WMI調用並解析該用戶的權限。 這只是我作爲「我怎麼能告訴我是否可以寫入文件?」的同一類型的問題罷了。答案是「做到這一點,並處理錯誤」 – hometoast 2013-02-26 18:44:33
我認爲在發生錯誤之前最好先處理容易避免的錯誤。如果我可以提前檢查priveleges,我寧願不承擔處理一長串服務器中幾乎所有服務器的異常的成本。另外,我現在擁有結構化的方式,可以將權限信息臨時保存在服務器列表中,因此不需要進行兩次調用即可檢查。在catch塊中很難做到這一點,除了權限之外的任何數量的問題都可能在手邊。 – KyleMit 2013-02-26 19:01:00
@Kyle:異常的成本比單個網絡呼叫便宜幾個數量級。 – 2013-02-27 18:40:05