Why does DirectoryEntry("WinNT://") not show group everyone?
The below function (is supposed to) lists all groups on the local machine.
Now the question: Why does the "everyone" group not show up ? If I change directory permissions as user, I see the "everyone" group, so it must be there, somewhere. 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()
' http://stackoverflow.com/questions/1040623/convert-a-username-to-a-sid-string-in-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
The Everyone
group isn't a standard group but rather an implicit group or built-in principal. If you open your local "Users and Groups" you won't see it listed there either. The same is true of other "groups" such as Authenticated Users
. If you want to access these you need to use the System.Security.Principal.WellKnownSidType
enumeration. This Windows 2008 article is really relevant for older versions of Windows, too.
精彩评论