T
Tomas Nilsson
Working code below (paying back to the groups
/Tomas
Class SidFunctions
Enum SID_NAME_USE
SidTypeUser = 1
SidTypeGroup
SidTypeDomain
SidTypeAlias
SidTypeWellKnownGroup
SidTypeDeletedAccount
SidTypeInvalid
SidTypeUnknown
SidTypeComputer
End Enum 'SID_NAME_USE
Declare Function LookupAccountName Lib "advapi32.dll" Alias
"LookupAccountNameA" (ByVal lpSystemName As String, ByVal
lpAccountName As String,
<System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPArray)>
ByVal Sid() As Byte, ByRef cbSid As System.UInt32, ByVal
ReferencedDomainName As System.Text.StringBuilder, ByRef
cchReferencedDomainName As System.UInt32, ByRef peUse As SID_NAME_USE)
As Boolean
Public Function ConvertUsernameToSidString(ByVal i_AccountName As
String, Optional ByVal i_Domain As String = "") As String
'*********************************************************************
'* Source of example:
http://pinvoke.net/default.aspx/advapi32.LookupAccountName
'*********************************************************************
Dim resultAsByte As Byte() = Nothing
Dim result As String
Dim m_resultAsByteCapacity As System.UInt32 =
UInt32.Parse("0")
Dim m_StringBuilder As New System.Text.StringBuilder
Dim m_StringBuilderCapacity As System.UInt32 =
UInt32.Parse(m_StringBuilder.Capacity)
Dim m_SID_NAME_USE As SID_NAME_USE
'*********************************************************************
'* Lookup
'*********************************************************************
Call LookupAccountName(i_Domain, i_AccountName, resultAsByte,
m_resultAsByteCapacity, m_StringBuilder, m_StringBuilderCapacity,
m_SID_NAME_USE)
'*********************************************************************
'* We should get ERROR_INSUFFICIENT_BUFFER
'*********************************************************************
If System.Runtime.InteropServices.Marshal.GetLastWin32Error =
122 Then 'ERROR_INSUFFICIENT_BUFFER
'*********************************************************************
'* Allocate the exact amount of needed space
'*********************************************************************
resultAsByte = New
Byte(CLng(m_resultAsByteCapacity.ToString)) {}
m_StringBuilder.EnsureCapacity(CLng(m_StringBuilderCapacity.ToString))
'*********************************************************************
'* And fetch the information
'*********************************************************************
If LookupAccountName(i_Domain, i_AccountName,
resultAsByte, m_resultAsByteCapacity, m_StringBuilder,
m_StringBuilderCapacity, m_SID_NAME_USE) = True Then
'*********************************************************************
'* Store result (all OK)
'*********************************************************************
result = BitConverter.ToString(resultAsByte)
'Call ConvertSidFromByteToString(resultAsByte, result)
Debug.WriteLine("Type=" & m_SID_NAME_USE.ToString &
vbTab & "SID=" & result)
End If
End If
Return result
End Function
End Class
/Tomas
Class SidFunctions
Enum SID_NAME_USE
SidTypeUser = 1
SidTypeGroup
SidTypeDomain
SidTypeAlias
SidTypeWellKnownGroup
SidTypeDeletedAccount
SidTypeInvalid
SidTypeUnknown
SidTypeComputer
End Enum 'SID_NAME_USE
Declare Function LookupAccountName Lib "advapi32.dll" Alias
"LookupAccountNameA" (ByVal lpSystemName As String, ByVal
lpAccountName As String,
<System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPArray)>
ByVal Sid() As Byte, ByRef cbSid As System.UInt32, ByVal
ReferencedDomainName As System.Text.StringBuilder, ByRef
cchReferencedDomainName As System.UInt32, ByRef peUse As SID_NAME_USE)
As Boolean
Public Function ConvertUsernameToSidString(ByVal i_AccountName As
String, Optional ByVal i_Domain As String = "") As String
'*********************************************************************
'* Source of example:
http://pinvoke.net/default.aspx/advapi32.LookupAccountName
'*********************************************************************
Dim resultAsByte As Byte() = Nothing
Dim result As String
Dim m_resultAsByteCapacity As System.UInt32 =
UInt32.Parse("0")
Dim m_StringBuilder As New System.Text.StringBuilder
Dim m_StringBuilderCapacity As System.UInt32 =
UInt32.Parse(m_StringBuilder.Capacity)
Dim m_SID_NAME_USE As SID_NAME_USE
'*********************************************************************
'* Lookup
'*********************************************************************
Call LookupAccountName(i_Domain, i_AccountName, resultAsByte,
m_resultAsByteCapacity, m_StringBuilder, m_StringBuilderCapacity,
m_SID_NAME_USE)
'*********************************************************************
'* We should get ERROR_INSUFFICIENT_BUFFER
'*********************************************************************
If System.Runtime.InteropServices.Marshal.GetLastWin32Error =
122 Then 'ERROR_INSUFFICIENT_BUFFER
'*********************************************************************
'* Allocate the exact amount of needed space
'*********************************************************************
resultAsByte = New
Byte(CLng(m_resultAsByteCapacity.ToString)) {}
m_StringBuilder.EnsureCapacity(CLng(m_StringBuilderCapacity.ToString))
'*********************************************************************
'* And fetch the information
'*********************************************************************
If LookupAccountName(i_Domain, i_AccountName,
resultAsByte, m_resultAsByteCapacity, m_StringBuilder,
m_StringBuilderCapacity, m_SID_NAME_USE) = True Then
'*********************************************************************
'* Store result (all OK)
'*********************************************************************
result = BitConverter.ToString(resultAsByte)
'Call ConvertSidFromByteToString(resultAsByte, result)
Debug.WriteLine("Type=" & m_SID_NAME_USE.ToString &
vbTab & "SID=" & result)
End If
End If
Return result
End Function
End Class