1

В моей компании у нас есть пользовательский HMI. Этот HMI может войти в систему, используя домен компьютера, если пользователь захочет. Вот сценарий, мы в настоящее время пытаются решитьКак получить список доменных групп Active Directory, когда они не подключены к домену

  1. С пользователь вошел в Windows, как пользователь домена, они войти в HMI, используя одни и те же окна учетные данные - все идет гладко.

  2. Сетевое подключение отключается, и пользователь перезагружает компьютер.

  3. Пользователь может войти в Windows, как и раньше, используя тот же учетные данные домена (с кэшированным пользователем Windows, что позволяет это)

  4. пользователя пытается войти в наш 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, если не подключен к сети.

Я провел много поиска, и я не смог выяснить, где хранятся эти кэшированные учетные данные. Любая помощь была бы оценена, и если бы я не был достаточно ясен, дайте мне знать, и я постараюсь объяснить, насколько это возможно.

ответ

0

Я знаю, что он старый, но для меня это было актуально. В качестве знакомого сообщения я свяжу это: Determine User Active Directory Groups from Local Machine off Network

Предлагаемое решение состояло в том, чтобы сохранить SID в локальном пространстве, которое, по-видимому, является лучшей идеей.

+0

Знаешь, я действительно забыл обновить это, но это то, что я закончил делать. Я зашифровал SIDS в нашей базе данных и, похоже, работает. Спасибо за ответ, хотя. – chris84948