Я пишу приложение, которое объединяет все записи журнала событий на каждом из нескольких разных серверов. Я могу получить журналы событий, перейдя в 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
Я считаю, что обычно лучше всего справляться с легко устраняемыми ошибками до их возникновения. Я бы предпочел не брать на себя затраты на обработку исключения для почти каждого сервера в длинном списке серверов, если я могу проверить привилегии раньше времени. Кроме того, способ, которым я в настоящее время структурирован, я могу временно сохранить информацию о разрешении в моем списке серверов, поэтому вам не нужно дважды проверять вызов. Это сложнее сделать в блоке catch, где может возникнуть любое количество проблем, связанных с разрешениями. – KyleMit
@Kyle: стоимость исключения на несколько порядков дешевле одного сетевого вызова. –