|
-
Oct 26th, 2004, 05:57 PM
#1
Thread Starter
Lively Member
List Logged On users [Resolved]
Hello, I've looked many places but I still can't make this work. Everything seems to work right until the LookupAccountSid.
I adapted the code from PSLoggedOn which is in C
I don't know what's wrong.
I call the last function from the main one. As it is just debugging, don't care of the argument for that function and it doesn't return anything.
VB Code:
Declare Function GetLastError Lib "kernel32" () As Integer
Declare Function LookupAccountSid Lib "advapi32.dll" Alias "LookupAccountSidA" (ByVal lpSystemName As String, ByVal Sid As Integer, ByVal Name As String, ByRef cbName As Integer, ByVal ReferencedDomainName As String, ByRef cbReferencedDomainName As Integer, ByRef peUse As Integer) As Integer
Declare Function AllocateAndInitializeSid Lib "advapi32.dll" (ByVal pIdentifierAuthority As SID_IDENTIFIER_AUTHORITY, ByVal nSubAuthorityCount As Byte, ByVal nSubAuthority0 As Int32, ByVal nSubAuthority1 As Int32, ByVal nSubAuthority2 As Int32, ByVal nSubAuthority3 As Int32, ByVal nSubAuthority4 As Int32, ByVal nSubAuthority5 As Int32, ByVal nSubAuthority6 As Int32, ByVal nSubAuthority7 As Int32, ByRef lpPSid As Integer) As Integer
Declare Function IsValidSid Lib "advapi32.dll" (ByVal pSid As Integer) As Integer
Declare Sub FreeSid Lib "advapi32.dll" (ByVal pSid As Integer)
Public Structure SID_IDENTIFIER_AUTHORITY
Dim Value() As Byte
End Structure
Public Sub Init_Sid_Authority(ByVal Value As SID_IDENTIFIER_AUTHORITY)
Value.Value = New Byte() {0, 0, 0, 0, 0, 0}
End Sub
Public Function myValue(ByVal int1 As Integer, ByVal int2 As Integer) As Integer
If int1 = -1 Then
Return int2
Else
Return int1
End If
End Function
Public Function myValue2(ByVal int1 As Integer) As Integer
If int1 = 0 Then
Return 10
Else
Return int1
End If
End Function
Public Function swscanf(ByVal SubKeyName As String, ByRef AuthorityVal As Integer, ByRef SubAuthorityVal0 As Integer, ByRef SubAuthorityVal1 As Integer, ByRef SubAuthorityVal2 As Integer, ByRef SubAuthorityVal3 As Integer, ByRef SubAuthorityVal4 As Integer, ByRef SubAuthorityVal5 As Integer, ByRef SubAuthorityVal6 As Integer, ByRef SubAuthorityVal7 As Integer) As Integer
Dim SubAuthorityCount As Integer = 0
Try
SubKeyName = SubKeyName.Substring(SubKeyName.IndexOf("-") + 1)
Catch
Return SubAuthorityCount
End Try
Try
SubKeyName = SubKeyName.Substring(SubKeyName.IndexOf("-") + 1)
SubAuthorityCount += 1
Catch
Return SubAuthorityCount
End Try
Try
AuthorityVal = CInt(SubKeyName.Substring(0, myValue(SubKeyName.IndexOf("-"), SubKeyName.Length)))
SubAuthorityCount += 1
SubKeyName = SubKeyName.Substring(myValue2(SubKeyName.IndexOf("-") + 1))
Catch
Return SubAuthorityCount
End Try
Try
SubAuthorityVal0 = CInt(SubKeyName.Substring(0, myValue(SubKeyName.IndexOf("-"), SubKeyName.Length)))
SubAuthorityCount += 1
SubKeyName = SubKeyName.Substring(myValue2(SubKeyName.IndexOf("-") + 1))
Catch
Return SubAuthorityCount
End Try
Try
SubAuthorityVal1 = CInt(SubKeyName.Substring(0, myValue(SubKeyName.IndexOf("-"), SubKeyName.Length)))
SubAuthorityCount += 1
SubKeyName = SubKeyName.Substring(myValue2(SubKeyName.IndexOf("-") + 1))
Catch
Return SubAuthorityCount
End Try
Try
SubAuthorityVal2 = CInt(SubKeyName.Substring(0, myValue(SubKeyName.IndexOf("-"), SubKeyName.Length)))
SubAuthorityCount += 1
SubKeyName = SubKeyName.Substring(myValue2(SubKeyName.IndexOf("-") + 1))
Catch
Return SubAuthorityCount
End Try
Try
SubAuthorityVal3 = CInt(SubKeyName.Substring(0, myValue(SubKeyName.IndexOf("-"), SubKeyName.Length)))
SubAuthorityCount += 1
SubKeyName = SubKeyName.Substring(myValue2(SubKeyName.IndexOf("-") + 1))
Catch
Return SubAuthorityCount
End Try
Try
SubAuthorityVal4 = CInt(SubKeyName.Substring(0, myValue(SubKeyName.IndexOf("-"), SubKeyName.Length)))
SubAuthorityCount += 1
SubKeyName = SubKeyName.Substring(myValue2(SubKeyName.IndexOf("-") + 1))
Catch
Return SubAuthorityCount
End Try
Try
SubAuthorityVal5 = CInt(SubKeyName.Substring(0, myValue(SubKeyName.IndexOf("-"), SubKeyName.Length)))
SubAuthorityCount += 1
SubKeyName = SubKeyName.Substring(myValue2(SubKeyName.IndexOf("-") + 1))
Catch
Return SubAuthorityCount
End Try
Try
SubAuthorityVal6 = CInt(SubKeyName.Substring(0, myValue(SubKeyName.IndexOf("-"), SubKeyName.Length)))
SubAuthorityCount += 1
SubKeyName = SubKeyName.Substring(myValue2(SubKeyName.IndexOf("-") + 1))
Catch
Return SubAuthorityCount
End Try
Try
SubAuthorityVal7 = CInt(SubKeyName.Substring(0, myValue(SubKeyName.IndexOf("-"), SubKeyName.Length)))
SubAuthorityCount += 1
SubKeyName = SubKeyName.Substring(myValue2(SubKeyName.IndexOf("-") + 1))
Catch
Return SubAuthorityCount
End Try
Return SubAuthorityCount
End Function
Public Function IsUserLoggedOn(ByVal UserNameToCheck As String) As Boolean
Dim i As Integer
Dim usersKey As Microsoft.Win32.RegistryKey
Dim ServerName As String = "\\MATT3011-SERVER"
Dim SubAuthorityCount As Integer
Dim SubAuthorityVal() As Integer
Dim AuthorityVal As Integer
Dim authority As SID_IDENTIFIER_AUTHORITY
Dim sid As Integer
Dim UserNameSize As Integer
Dim DomainNameSize As Integer
Dim UserName As String
Dim DomainName As String
Dim sidType As Integer
Dim res As Integer
usersKey = Microsoft.Win32.RegistryKey.OpenRemoteBaseKey(Microsoft.Win32.RegistryHive.Users, ServerName)
For i = 0 To usersKey.SubKeyCount - 1
If usersKey.GetSubKeyNames(i).ToLower <> ".default" And usersKey.GetSubKeyNames(i).ToLower.IndexOf("classes") = -1 Then
'Initialize variables
SubAuthorityCount = 0
SubAuthorityVal = New Integer() {0, 0, 0, 0, 0, 0, 0, 0}
AuthorityVal = 0
Init_Sid_Authority(authority)
sid = 0
sidType = 0
UserNameSize = 1024
DomainNameSize = 1024
UserName = New String(" ", UserNameSize)
DomainName = New String(" ", DomainNameSize)
SubAuthorityCount = swscanf(usersKey.GetSubKeyNames(i), AuthorityVal, SubAuthorityVal(0), SubAuthorityVal(1), SubAuthorityVal(2), SubAuthorityVal(3), SubAuthorityVal(4), SubAuthorityVal(5), SubAuthorityVal(6), SubAuthorityVal(7))
If SubAuthorityCount >= 3 Then
SubAuthorityCount -= 2
ReDim Preserve authority.Value(5)
authority.Value(5) = AuthorityVal And &HFF
authority.Value(4) = (AuthorityVal And &HFF00) / &HFF
authority.Value(3) = (AuthorityVal And &HFF0000) / &HFFFF
authority.Value(2) = (AuthorityVal And &HFF000000) / &HFFFFFF
authority.Value(1) = 0
authority.Value(0) = 0
If AllocateAndInitializeSid(authority, SubAuthorityCount, SubAuthorityVal(0), SubAuthorityVal(1), SubAuthorityVal(2), SubAuthorityVal(3), SubAuthorityVal(4), SubAuthorityVal(5), SubAuthorityVal(6), SubAuthorityVal(7), sid) Then
If IsValidSid(sid) Then
res = LookupAccountSid(ServerName, sid, UserName, UserNameSize, DomainName, DomainNameSize, sidType)
If res Then
MsgBox(DomainName.TrimEnd & "\" & UserName.TrimEnd)
Else
MsgBox(GetLastError)
End If
End If
End If
If sid Then FreeSid(sid)
End If
End If
Next
End Function
Last edited by matt3011; Oct 27th, 2004 at 03:41 AM.
-
Oct 27th, 2004, 03:40 AM
#2
Thread Starter
Lively Member
It's Working now. Here is the code :
VB Code:
<DllImport("advapi32")> Public Function LookupAccountSidA(ByVal lpSystemName As String, ByVal Sid As Integer, ByVal Name As Stringbuilder, ByRef cbName As Integer, ByVal ReferencedDomainName As Stringbuilder, ByRef cbReferencedDomainName As Integer, ByRef peUse As Integer) As Integer
End Function
<DllImport("advapi32")> Public Function AllocateAndInitializeSid(ByRef pIdentifierAuthority As SID_IDENTIFIER_AUTHORITY, ByVal nSubAuthorityCount As Byte, ByVal nSubAuthority0 As Integer, ByVal nSubAuthority1 As Integer, ByVal nSubAuthority2 As Integer, ByVal nSubAuthority3 As Integer, ByVal nSubAuthority4 As Integer, ByVal nSubAuthority5 As Integer, ByVal nSubAuthority6 As Integer, ByVal nSubAuthority7 As Integer, ByRef lpPSid As Integer) As Integer
End Function
<DllImport("advapi32")> Public Function IsValidSid(ByVal pSid As Integer) As Integer
End Function
<DllImport("advapi32")> Public Sub FreeSid(ByVal pSid As Integer)
End Sub
<StructLayout(LayoutKind.Sequential)> Public Structure SID_IDENTIFIER_AUTHORITY
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=6, ArraySubType:=UnmanagedType.AsAny)> Public Value() As Byte
End Structure
Public Sub Init_Sid_Authority(ByVal Value As SID_IDENTIFIER_AUTHORITY)
Value.Value = New Byte() {0, 0, 0, 0, 0, 0}
End Sub
Public Function myValue(ByVal int1 As Integer, ByVal int2 As Integer) As Integer
If int1 = -1 Then
Return int2
Else
Return int1
End If
End Function
Public Function myValue2(ByVal int1 As Integer) As Integer
If int1 = 0 Then
Return 10
Else
Return int1
End If
End Function
Public Function swscanf(ByVal SubKeyName As String, ByRef AuthorityVal As Integer, ByRef SubAuthorityVal0 As Integer, ByRef SubAuthorityVal1 As Integer, ByRef SubAuthorityVal2 As Integer, ByRef SubAuthorityVal3 As Integer, ByRef SubAuthorityVal4 As Integer, ByRef SubAuthorityVal5 As Integer, ByRef SubAuthorityVal6 As Integer, ByRef SubAuthorityVal7 As Integer) As Integer
Dim SubAuthorityCount As Integer = 0
Try
SubKeyName = SubKeyName.Substring(SubKeyName.IndexOf("-") + 1)
Catch
Return SubAuthorityCount
End Try
Try
SubKeyName = SubKeyName.Substring(SubKeyName.IndexOf("-") + 1)
SubAuthorityCount += 1
Catch
Return SubAuthorityCount
End Try
Try
AuthorityVal = CInt(SubKeyName.Substring(0, myValue(SubKeyName.IndexOf("-"), SubKeyName.Length)))
SubAuthorityCount += 1
SubKeyName = SubKeyName.Substring(myValue2(SubKeyName.IndexOf("-") + 1))
Catch
Return SubAuthorityCount
End Try
Try
SubAuthorityVal0 = CInt(SubKeyName.Substring(0, myValue(SubKeyName.IndexOf("-"), SubKeyName.Length)))
SubAuthorityCount += 1
SubKeyName = SubKeyName.Substring(myValue2(SubKeyName.IndexOf("-") + 1))
Catch
Return SubAuthorityCount
End Try
Try
SubAuthorityVal1 = CInt(SubKeyName.Substring(0, myValue(SubKeyName.IndexOf("-"), SubKeyName.Length)))
SubAuthorityCount += 1
SubKeyName = SubKeyName.Substring(myValue2(SubKeyName.IndexOf("-") + 1))
Catch
Return SubAuthorityCount
End Try
Try
SubAuthorityVal2 = CInt(SubKeyName.Substring(0, myValue(SubKeyName.IndexOf("-"), SubKeyName.Length)))
SubAuthorityCount += 1
SubKeyName = SubKeyName.Substring(myValue2(SubKeyName.IndexOf("-") + 1))
Catch
Return SubAuthorityCount
End Try
Try
SubAuthorityVal3 = CInt(SubKeyName.Substring(0, myValue(SubKeyName.IndexOf("-"), SubKeyName.Length)))
SubAuthorityCount += 1
SubKeyName = SubKeyName.Substring(myValue2(SubKeyName.IndexOf("-") + 1))
Catch
Return SubAuthorityCount
End Try
Try
SubAuthorityVal4 = CInt(SubKeyName.Substring(0, myValue(SubKeyName.IndexOf("-"), SubKeyName.Length)))
SubAuthorityCount += 1
SubKeyName = SubKeyName.Substring(myValue2(SubKeyName.IndexOf("-") + 1))
Catch
Return SubAuthorityCount
End Try
Try
SubAuthorityVal5 = CInt(SubKeyName.Substring(0, myValue(SubKeyName.IndexOf("-"), SubKeyName.Length)))
SubAuthorityCount += 1
SubKeyName = SubKeyName.Substring(myValue2(SubKeyName.IndexOf("-") + 1))
Catch
Return SubAuthorityCount
End Try
Try
SubAuthorityVal6 = CInt(SubKeyName.Substring(0, myValue(SubKeyName.IndexOf("-"), SubKeyName.Length)))
SubAuthorityCount += 1
SubKeyName = SubKeyName.Substring(myValue2(SubKeyName.IndexOf("-") + 1))
Catch
Return SubAuthorityCount
End Try
Try
SubAuthorityVal7 = CInt(SubKeyName.Substring(0, myValue(SubKeyName.IndexOf("-"), SubKeyName.Length)))
SubAuthorityCount += 1
SubKeyName = SubKeyName.Substring(myValue2(SubKeyName.IndexOf("-") + 1))
Catch
Return SubAuthorityCount
End Try
Return SubAuthorityCount
End Function
Public Function IsUserLoggedOn(ByVal ServerName As String, ByVal UserNameToCheck As String) As Boolean
Dim i As Integer
Dim usersKey As Microsoft.Win32.RegistryKey
Dim SubAuthorityCount As Integer
Dim SubAuthorityVal() As Integer
Dim AuthorityVal As Integer
Dim authority As SID_IDENTIFIER_AUTHORITY
Dim sid As Integer
Dim UserNameSize As Integer
Dim DomainNameSize As Integer
Dim UserName As StringBuilder
Dim DomainName As StringBuilder
Dim sUserName As String
Dim sDomainName As String
Dim sidType As Integer
Dim res As Integer
Try
usersKey = Microsoft.Win32.RegistryKey.OpenRemoteBaseKey(Microsoft.Win32.RegistryHive.Users, ServerName)
For i = 0 To usersKey.SubKeyCount - 1
If usersKey.GetSubKeyNames(i).ToLower <> ".default" And usersKey.GetSubKeyNames(i).ToLower.IndexOf("classes") = -1 Then
'Initialize variables
SubAuthorityCount = 0
SubAuthorityVal = New Integer() {0, 0, 0, 0, 0, 0, 0, 0}
AuthorityVal = 0
Init_Sid_Authority(authority)
sid = 0
sidType = 0
UserNameSize = 1024
DomainNameSize = 1024
UserName = New StringBuilder(UserNameSize)
DomainName = New StringBuilder(DomainNameSize)
SubAuthorityCount = swscanf(usersKey.GetSubKeyNames(i), AuthorityVal, SubAuthorityVal(0), SubAuthorityVal(1), SubAuthorityVal(2), SubAuthorityVal(3), SubAuthorityVal(4), SubAuthorityVal(5), SubAuthorityVal(6), SubAuthorityVal(7))
If SubAuthorityCount >= 3 Then
SubAuthorityCount -= 2
ReDim Preserve authority.Value(5)
authority.Value(5) = AuthorityVal And &HFF
authority.Value(4) = (AuthorityVal And &HFF00) / &HFF
authority.Value(3) = (AuthorityVal And &HFF0000) / &HFFFF
authority.Value(2) = (AuthorityVal And &HFF000000) / &HFFFFFF
authority.Value(1) = 0
authority.Value(0) = 0
If AllocateAndInitializeSid(authority, SubAuthorityCount, SubAuthorityVal(0), SubAuthorityVal(1), SubAuthorityVal(2), SubAuthorityVal(3), SubAuthorityVal(4), SubAuthorityVal(5), SubAuthorityVal(6), SubAuthorityVal(7), sid) Then
res = LookupAccountSidA(ServerName, sid, UserName, UserNameSize, DomainName, DomainNameSize, sidType)
If res Then
sUserName = UserName.ToString
sDomainName = DomainName.ToString
If UserNameToCheck.ToLower = sDomainName.ToLower & "\" & sUserName.ToLower Then
Return True
End If
'MsgBox(UserNameSize & vbCrLf & DomainNameSize)
'MsgBox(sUserName & vbCrLf & sDomainName)
'MsgBox(sDomainName.TrimEnd & "\" & sUserName.TrimEnd)
'Else
'MsgBox(Marshal.GetLastWin32Error())
End If
End If
If sid Then FreeSid(sid)
End If
End If
Next
Catch ex As Exception
End Try
Return False
End Function
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|