Почему DirectoryEntry ("WinNT: //") не показывает группу всем? - PullRequest
2 голосов
/ 18 февраля 2011

В приведенной ниже функции (предполагается) перечисляются все группы на локальном компьютере.
Теперь вопрос: почему группа «все» не появляется?
Если я изменяю права доступа к каталогу как пользователь, я вижу группу «все», поэтому она должна быть где-то там.

    Public Shared Function GetAllGroups() As DataTable
        Return GetAllGroups(System.Environment.MachineName)
    End Function


    ' Tools.Permissions.Local.GetAllGroups() '
    Public Shared Function GetAllGroups(ByVal strDomain As String) As DataTable
        Dim dt As New DataTable
        Dim dr As DataRow = Nothing

        Try
            Dim bException As Boolean = False
            Dim deLocalMachine As System.DirectoryServices.DirectoryEntry = New System.DirectoryServices.DirectoryEntry("WinNT://" + strDomain)
            'Dim deRootObject As System.DirectoryServices.DirectoryEntry = GetDirectoryEntry(strPath, strUserName, strPassword, bException) '
            If bException Then
                Return Nothing
            End If


            For Each child As System.DirectoryServices.DirectoryEntry In deLocalMachine.Children
                Try

                    If StringComparer.OrdinalIgnoreCase.Equals(child.SchemaClassName, "group") Then

                        If Not dt.Columns.Contains("Members") Then
                            dt.Columns.Add("Members", GetType(System.String))
                        End If

                        For Each strPropertyName As String In child.Properties.PropertyNames
                            If Not dt.Columns.Contains(strPropertyName) Then
                                dt.Columns.Add(strPropertyName, GetType(System.String))
                            End If
                        Next strPropertyName

                        dr = dt.NewRow

                        Dim strMembers As String = ""
                        For Each member As Object In DirectCast(child.Invoke("Members"), IEnumerable)
                            Using memberEntry As New System.DirectoryServices.DirectoryEntry(member)

                                Try
                                    strMembers += memberEntry.Properties("Name").Value.ToString() + Environment.NewLine
                                    Console.WriteLine(memberEntry.Path)
                                Catch exFixMeIsNotNullNotWorking As Exception

                                End Try

                            End Using
                        Next

                        dr("Members") = strMembers

                        For Each strPropertyName As String In child.Properties.PropertyNames

                            If StringComparer.OrdinalIgnoreCase.Equals(strPropertyName, "objectSid") Then
                                Dim strSID As String = ""
                                Try
                                    Dim sidThisSid As New System.Security.Principal.SecurityIdentifier(child.Properties(strPropertyName).Value, 0)
                                    strSID = sidThisSid.ToString()
                                    ' /1201843/preobrazovat-imya-polzovatelya-v-stroku-sid-v-c-net '
                                    '  NTAccount ntAccount = (NTAccount)sid.Translate( typeof( NTAccount ) ); '
                                    ' Dim ntAccount As Security.Principal.NTAccount = CType(sidThisSid.Translate(GetType(Security.Principal.NTAccount)), Security.Principal.NTAccount) '
                                Catch ex As Exception

                                End Try

                                dr(strPropertyName) = strSID
                            Else
                                dr(strPropertyName) = child.Properties(strPropertyName).Value.ToString()
                            End If



                        Next strPropertyName
                        dt.Rows.Add(dr)

                    End If

                Catch ex As Exception ' Don't finish just because one fails
                    Console.WriteLine(ex.Message.ToString & vbLf & vbLf & ex.StackTrace.ToString, MsgBoxStyle.Critical, "FEHLER ...")
                End Try
            Next
        Catch ex As Exception
            Console.WriteLine(ex.Message.ToString & vbLf & vbLf & ex.StackTrace.ToString, MsgBoxStyle.Critical, "FEHLER ...")
        End Try

        Return dt
    End Function ' ListEverything

1 Ответ

2 голосов
/ 18 февраля 2011

Группа Everyone - это не стандартная группа, а неявная группа или встроенный принципал. Если вы откроете свои локальные «Пользователи и группы», вы также не увидите их в списке. То же самое относится и к другим «группам», таким как Authenticated Users. Если вы хотите получить к ним доступ, вам нужно использовать перечисление System.Security.Principal.WellKnownSidType. Эта статья о Windows 2008 действительно актуальна и для более старых версий Windows.

...