В моей компании у нас есть пользовательский HMI. Этот HMI может войти в систему, используя домен компьютера, если пользователь захочет. Вот сценарий, мы в настоящее время пытаются решитьКак получить список доменных групп Active Directory, когда они не подключены к домену
С пользователь вошел в Windows, как пользователь домена, они войти в HMI, используя одни и те же окна учетные данные - все идет гладко.
Сетевое подключение отключается, и пользователь перезагружает компьютер.
Пользователь может войти в Windows, как и раньше, используя тот же учетные данные домена (с кэшированным пользователем Windows, что позволяет это)
пользователя пытается войти в наш HMI, и они не могут, потому что у меня нет выяснили, как получить доступ к этим кэшированным пользователям активного каталога.
Вот код, который я использую прямо сейчас, чтобы определить, является ли пользователь членом одной из групп, разрешенных для входа в HMI. Эти группы сохраняются в нашей базе данных SQL, и хранятся в виде строк, как, например SERVER\BUILDER
If DuplicateToken(token, 2, tokenDuplicate) <> 0 Then
tempWindowsIdentity = New WindowsIdentity(tokenDuplicate)
AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal)
WinPrincipal = New WindowsPrincipal(tempWindowsIdentity)
End If
If WinPrincipal.IsInRole(user.Group) Then
'Success - obviously there's more code after this
End If
Проблема заключается в том, что, когда пользователь не подключен к домену, я получаю исключение по методу IsInRole
. Я взглянул на перегрузку в методе и попытался использовать SID-эквивалент user.Group вместо литеральной строки. Это похоже на работу, но теперь возникает другая проблема. Когда пользователь не находится в сети, я не могу перевести имя группы (строку из SQL) в эти идентификаторы безопасности.
Мое текущее обходное решение заключается в том, что когда пользователь подключен к домену, я сохраняю идентификаторы безопасности и группы в таблицу поиска (зашифрован), а затем, когда сеть не подключена, я беру имя группы из базы данных и буквально найдите строку SID в таблице.
код, я использую, чтобы преобразовать имя группы SID имеет следующий
'' Get all groups available to the user
For i As Integer = 0 To WindowsIdentity.GetCurrent.Groups.Count - 1
Dim ir As IdentityReference = WindowsIdentity.GetCurrent.Groups(i)
sid(i) = New SecurityIdentifier(ir.Value)
sidName(i) = CType(ir.Translate(GetType(NTAccount)), NTAccount).Value
' Write to file as csv
writer.WriteLine(sidName(i) + "," + sid(i).ToString)
Next
Тогда я подстановки имя группы, как так
If File.Exists(FILEPATH) = True Then
Dim reader As New StreamReader(FILEPATH)
While Not reader.EndOfStream
Dim sTemp() As String = reader.ReadLine.Split(",")
If groupName.Equals(sTemp(0)) Then
Return New SecurityIdentifier(sTemp(1))
End If
End While
End If
Причину я не могу перевести имя группы в SID, если нет в сети, потому что IdentityReference.Translate
выдает исключение, потому что он не может видеть домен.
Итак, наконец, после всего этого объяснения, вот что я ищу. Я думаю, что для меня должен быть доступ, чтобы получить идентификатор SID от имени группы, потому что окна ДОЛЖНЫ хранить его где-то, иначе я не смог бы войти в Windows, если не подключен к сети.
Я провел много поиска, и я не смог выяснить, где хранятся эти кэшированные учетные данные. Любая помощь была бы оценена, и если бы я не был достаточно ясен, дайте мне знать, и я постараюсь объяснить, насколько это возможно.
Знаешь, я действительно забыл обновить это, но это то, что я закончил делать. Я зашифровал SIDS в нашей базе данных и, похоже, работает. Спасибо за ответ, хотя. – chris84948