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