Получите пользовательские детали от Active Directory с помощью SID

Кажется, что Вы хотите VPN больше, чем прокси-сервер - или по крайней мере, что Вы хотите, наиболее легко выполняется с сервером VPN, с которым соединяются все ноутбуки. Прокси-сервер не делает (за исключением некоторых определенных серверов приложений), шифруют трафик между его клиентами и им, в то время как это - разум d' etre сервера VPN.

Насколько сами серверы VPN идут, мне везло, работая openvpn с Linux, окнами и клиентами Mac.

8
задан 9 March 2010 в 15:42
4 ответа

"LDAP путь", чтобы сделать это должно было бы получить базовый объект с GUID (или SID), который получит только базовый объект и не иметь дополнительные присоединенные данные класса. Однако от этого базового объекта можно получить фактический "distinguishedName" для пользовательского объекта. Получение пользовательского объекта с помощью атрибута "distinguishedName" возвратит объект DirectoryEntry (.Net/C#/PowerShell) или объект iadsUser (VBScript) с полными данными класса и позволит Вам добираться безотносительно других данных атрибута, в которых Вы нуждаетесь.

Проблема получает начальный объект с GUID (или SID). Некоторые источники скажут, что необходимо преобразовать формат строки GUID (т.е. {28c67c50-9778-47a4-a77a-bf56f238a0c4}) в строковое представление массива байтов (т.е. "\50\7c\c6\28\78\97\a4\47\7a\a7\bf\56\f2\38\a0\c4") для передачи LDAP. Согласно документации Microsoft дело обстоит не так. Представление простой строки GUID/SID достаточно.

Вот образец того, как можно связать с объектом через GUID, затем получают фактический пользовательский объект с полными данными класса. Powershell на самом деле вытягивает полный объект, если Вы связываете с GUID. Если бы Вы используете VBScript, то необходимо было бы сделать два процесса шага.

Кроме того, обратите внимание на то, что хотя в документах Microsoft говорится, что несколько форматов строки GUID приемлемы, единственный, который я смог успешно использовать, должен разделить {} - символы. КРОМЕ ТОГО, обратите внимание, что это не корректная строка "массива байтов", но просто строка GUID, лишенная специальных символов.

$strGUID = "{28c67c50-9778-47a4-a77a-bf56f238a0c4}" -replace '-|{|}',''
$guid = [ADSI]"LDAP://<GUID=$strGUID>"
$user = [ADSI]$guid.distinguishedName

Тот же процесс может использоваться для SID, связывают. Страница MSDN, описывающая это, говорит, что существует несколько fstring доступных форматов, но наиболее распространенным будет s-1-5-...-...-...-... формат.

#Powershell
$strSID="S-1-5-21-500000003-1000000000-1000000003-1001"
$uSid = [ADSI]"LDAP://<SID=$uSid>"
$user = [ADSI]$user.distinguishedName

* ЗАПРОСЫ *

Если Вы собираетесь выполнить запрос LDAP для нахождения объекта (например, путем сравнения 'objectGUID' к массиву байтов или 'objectSID' к массиву байтов), это - когда необходимо будет сделать "корректное" преобразование массива байтов. Важно отметить, что массив байтов имеет другой порядок, чем строковое представление, поскольку это хранится как DWORD-WORD-WORD-WORD-BYTES для GUID и ДЕЙСТВИТЕЛЬНО принимает порядок порядка байтов во внимание. Преобразование массива байтов для SID имеет подобный condierations.

Существует несколько различных способов выполнить преобразование, Technet имеет простой vbScript алгоритм. Вы могли также сделать что-то более необычное с C#/VB.Net использование Системы. Гуид, или с помощью простого сценария в PowerShell (должен любить PowerShell!):

#Powershell
#   Creates a new System.GUID object from the supplied string.
#   Only need for this example.
$guid = [system.guid]"{28c67c50-9778-47a4-a77a-bf56f238a0c4}" 
$out=""
#Formats the array of integers as a backslash-delimited string of Hex values
$guid.ToByteArray() | %{ $out += $("\{0:x2}" -f $_) }

Необходимо затем смочь запросить для объекта с помощью стандартного фильтра LDAP:

(&(objectClass=User)(objectGUID=\50\7c\c6\28\78\97\a4\47\a7\7a\bf\56\f2\38\a0\c4))

... или независимо от того, что можно запрашивать для. Это должно работать на SID также.

4
ответ дан 2 December 2019 в 22:42
  • 1
    WOW! Спасибо за обширный ответ! I' ll дают ему попытку с ADSI и видят, работает ли это там также. Никогда не делал powershell прежде. –  er4z0r 9 March 2010 в 09:29
  • 2
    Мой первый удар в нем не был успешен. Взгляните на мое редактирование. –  er4z0r 9 March 2010 в 10:41
  • 3
    Извините, я don' t имеют время для полного ответа, но Ваша проблема состоит в том, что идентификатором, что у Вас есть в конечном счете данные, является SID, не GUID. Вы won' t смочь связать непосредственно с объектом с помощью SID, но можно искать каталог с помощью атрибута objectSid. –  pipTheGeek 9 March 2010 в 14:35
  • 4
    привет pipTheGeek. Оказывается, что я на самом деле могу связать использование SID. См. ответ для больше. –  er4z0r 9 March 2010 в 15:40
  • 5
    Круто. Мне нравится учиться, я don' t как то, чтобы быть неправильным, я изучаю больше всего, когда я неправ... :) –  pipTheGeek 9 March 2010 в 22:46

Хорошо. Я нашел способ сделать это через Active Directory. Поскольку compeleteness здесь является кодом:

REM Converts the SID into a format, that can be processed by ADSI or WMI
Function NormalizeSid(strSidToNormalize)
  Dim regEx,strReplace
  strReplace=""
  ' Create regular expression.
  Set regEx = New RegExp
  regEx.Global  = True
  regEx.Pattern = "(%|{|})"
  regEx.IgnoreCase = True

  ' Make replacement.
  NormalizeSid = regEx.Replace(strSidToNormalize, strReplace)
End Function

REM Searches for a SID the in the Message that was passed as argument
REM SID returned will be of the  form %{S-1-5-21-3968247570-3627839482-368725868-1110}
REM NOTE: Neither WMI nor ADSI will accept this. Use NormalizeSid like in FindUser
Function FindSidInMessage(Message)
    Dim strAccountRegex
    Dim objRegex
    Dim objMatch
    Dim strSID

    strAccountRegex = "(\%\{S\-[,0-9,\-]*\})"
    Set objRegex    = new RegExp
    objRegex.Pattern= strAccountRegex

    for each objMatch in objRegex.Execute(Message)
            REM Wscript.StdOut.writeLine "Found an Account ID: " & objMatch.value
            strSID=objMatch.value
    next

    FindSidInMessage=strSID
End Function 

REM Searches Directory for the User matching the SID passed as parameter
Function FindUser(userSID)
    Dim normalizedSID
    Dim objUser

    normalizedSID=NormalizeSid(userSID)
    Wscript.Echo "SID after escaping: " & normalizedSID

    Wscript.StdOut.writeLine "Querying AD to retrieve user-data" 
    Set objUser = GetObject("LDAP://<SID="& normalizedSID & ">")
    FindUser=objUser.EmailAddress
End Function

Надежда это будет полезно для других.

2
ответ дан 2 December 2019 в 22:42

Разожгите Windows PowerShell и работайте:

$strSID="S-1-5-21-500000003-1000000000-1000000003-1001"
$uSid = [ADSI]"LDAP://<SID=$strSID>"
echo $uSid

Вывод должен выглядеть примерно так,

distinguishedName : {CN=John Doe,OU=Domain Admins,OU=People,OU=xxx,DC=xxx}
Path              : LDAP://<SID=S-1-5-21-500000003-1000000000-1000000003-1001>
21
ответ дан 2 December 2019 в 22:42

Использовать PS:

$SID = "S-X-X-XX-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXX-XXXX"
Get-ADObject -IncludeDeletedObjects -Filter * -Properties * | where{$_.objectSid -eq $SID}
1
ответ дан 2 December 2019 в 22:42

Теги

Похожие вопросы