<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