我正在写聚合所有各的几个不同的服务器的事件日志项的应用程序。 我可以通过传递获取事件日志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
大多数解决方案,像一个在这里 ,只有在用户当前执行的机器上的管理员检查。
Dim user As WindowsIdentity = WindowsIdentity.GetCurrent()
Dim principal As New WindowsPrincipal(user)
Dim isAdmin As Boolean = principal.IsInRole(WindowsBuiltInRole.Administrator)
我将分享部分解决,但我不与它完全满意,所以如果任何人有什么好,我会高兴地接受他们的答案。
下面的函数将返回羯羊或没有用户属于一个特定的用户组(在我的情况下, "Administrators"
)在任何机器上。
Imports System.DirectoryServices.AccountManagement
Public Shared Function IsMemberOfGroup(userName As String, machineName As String, memberGroup as String) As Boolean
Dim isMember As Boolean = False
Using rootContext As New PrincipalContext(ContextType.Machine, machineName), _
grp As GroupPrincipal = GroupPrincipal.FindByIdentity(rootContext, memberGroup), _
usr As UserPrincipal = UserPrincipal.FindByIdentity(rootContext, IdentityType.SamAccountName, userName)
If grp IsNot Nothing AndAlso usr IsNot Nothing Then
' Check if the user is a member of the group.
isMember = grp.GetMembers(True).Contains(usr)
Else
isMember = False
End If
End Using
Return isMember
End Function
该caviat是运行方法的用户必须以有权将此信息设置管理员PrincipalContext
。 我希望应用程序将能够确定是否运行应用程序的用户是管理员。
使这个超级有帮助的唯一方法是调用它,看看它是否想出了“拒绝访问”,类似于hometoast已经建议,但是这仍然没有手感超“干净”