1

いくつかの異なるサーバーのそれぞれにあるすべてのイベント ログ エントリを集約するアプリを作成しています。MachineNametoを渡すことで、イベント ログを取得できます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)
4

1 に答える 1

0

これが試みです。

次の関数は、ユーザーが任意のマシンの特定のユーザー グループ (私の場合は ) に属しているかどうかを返します"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

注意点は、メソッドを実行するユーザーが で設定されたこの情報に対する権限を持つためには管理者である必要があるということPrincipalContextです。アプリケーションを実行しているユーザーが管理者であるかどうかをアプリケーションが判断できることを期待していました。

これを非常に便利にする唯一の方法は、それを呼び出して、既に提案されているホームトーストと同様に「アクセスが拒否されました」が表示されるかどうかを確認することですが、それでも「クリーン」とは感じられません。

于 2013-02-26T20:17:25.027 に答える