检查用户是否是外部计算机上的本地管理员(Check if user is a local admin

2019-09-29 13:13发布

我正在写聚合所有各的几个不同的服务器的事件日志项的应用程序。 我可以通过传递获取事件日志MachineNameEventLog.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)

Answer 1:

我将分享部分解决,但我不与它完全满意,所以如果任何人有什么好,我会高兴地接受他们的答案。

下面的函数将返回羯羊或没有用户属于一个特定的用户组(在我的情况下, "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已经建议,但是这仍然没有手感超“干净”



文章来源: Check if user is a local admin on external machine