Комментарии 4
Не смотря на всю мощь скриптовых языков, для подобных утилитарных задач предпочитаю использовать всё же не Powershell, и даже не VBScript, а простые узкоспециализированные консольные утилиты.
В частности для данной задачи я бы выбрал виндовую утилиту dsquery:
Если надо для списка из файла, то организовал бы простой цикл в батнике:
В подобном альтернативном решении я вижу следующие плюсы:
1. Синтаксис простой и даже очевидный (и для написания, и для понимания, и для последующей модификации).
2. Написать такую команду в разы быстрее, чем ваш скрипт.
3. Работать это будет на Windows почти любой версии (от Win2k и выше точно).
4. Для работы этой команды не нужно устанавливать .NET Framework, Powershell и прочие тяжеловесные вещи.
Такой вот unix-way даже в администрировании windows-систем мне нравится больше, чем нагромождение длинных и неочевидных скриптов.
В частности для данной задачи я бы выбрал виндовую утилиту dsquery:
dsquery * -filter (sidHistory=S-1-5-21-1234567890-123456789-987654321-12345)
Если надо для списка из файла, то организовал бы простой цикл в батнике:
for /f %%i in (filename.txt) do (
...
)
В подобном альтернативном решении я вижу следующие плюсы:
1. Синтаксис простой и даже очевидный (и для написания, и для понимания, и для последующей модификации).
2. Написать такую команду в разы быстрее, чем ваш скрипт.
3. Работать это будет на Windows почти любой версии (от Win2k и выше точно).
4. Для работы этой команды не нужно устанавливать .NET Framework, Powershell и прочие тяжеловесные вещи.
Такой вот unix-way даже в администрировании windows-систем мне нравится больше, чем нагромождение длинных и неочевидных скриптов.
+1
Основной темой данного скрипта был не поиск по известному значению SID, а взять все эти атрибуты из пользователя.
То есть на вход мы подаем пользователя, а не конкретный sID.
Если раскручивать тему *.CMD, то синтаксис будет еще более не очевиден, чем в моем примере.
То есть на вход мы подаем пользователя, а не конкретный sID.
Если раскручивать тему *.CMD, то синтаксис будет еще более не очевиден, чем в моем примере.
+1
> Основной темой данного скрипта был не поиск по известному значению SID,
> а взять все эти атрибуты из пользователя.
> То есть на вход мы подаем пользователя, а не конкретный sID.
Да это непринципиально. Я просто показал сам подход.
В одном домене выгрузил список пользователей с их атрибутом sid или sidhistory, в другом домене нашёл соответствующих пользователей по SID'у Это не сильно сложнее. Работа с атрибутами объектов в LDAP через консольные утилиты dsquery, dsget, dsmod, dsmove, dsadd, dsrm а также csvde и ldifde во многих случаях действительно проще, быстрее, очевиднее и нагляднее, чем многострочные PS/VBS-скрипты.
Я ещё понимаю, если бы вы на вход скрипта давали UNC-путь виндовой шары, а на выходе получали список пользователей и групп из всех имеющихся доменов с указанием прав доступа к дереву каталогов. Это действительно стоило бы заскриптовать. Я и сам что-то подобное писал ранее на VBScript. Однако для таких элементарных задач как поиск объекта в AD по атрибутам специальная узкоспециализированная консольная утилита действительно проще и удобнее, чем скрипт.
> а взять все эти атрибуты из пользователя.
> То есть на вход мы подаем пользователя, а не конкретный sID.
Да это непринципиально. Я просто показал сам подход.
В одном домене выгрузил список пользователей с их атрибутом sid или sidhistory, в другом домене нашёл соответствующих пользователей по SID'у Это не сильно сложнее. Работа с атрибутами объектов в LDAP через консольные утилиты dsquery, dsget, dsmod, dsmove, dsadd, dsrm а также csvde и ldifde во многих случаях действительно проще, быстрее, очевиднее и нагляднее, чем многострочные PS/VBS-скрипты.
Я ещё понимаю, если бы вы на вход скрипта давали UNC-путь виндовой шары, а на выходе получали список пользователей и групп из всех имеющихся доменов с указанием прав доступа к дереву каталогов. Это действительно стоило бы заскриптовать. Я и сам что-то подобное писал ранее на VBScript. Однако для таких элементарных задач как поиск объекта в AD по атрибутам специальная узкоспециализированная консольная утилита действительно проще и удобнее, чем скрипт.
0
dsquery * «OU=OU,DC=DC,DC=ru» -filter "(sAMAccountName=SAM)" -attr sAMAccountName sIDHistory -limit 0
sAMAccountName sIDHistory
SAM S-1-5-21-0000000000-000000000-000000000-00000
В этом что-то есть, однако годного решения как это использовать в скрипте…
Я думаю, что критические к скорости части, можно переписать с командлетов powershell на использование утилит, однако обработку вести придется в powershell, иначе интегрировать нормально не получится на более высокие уровни.
И кстати, если интересно могу написать забор пользователей по UNC, c поиском по sIDHistory.
sAMAccountName sIDHistory
SAM S-1-5-21-0000000000-000000000-000000000-00000
В этом что-то есть, однако годного решения как это использовать в скрипте…
Я думаю, что критические к скорости части, можно переписать с командлетов powershell на использование утилит, однако обработку вести придется в powershell, иначе интегрировать нормально не получится на более высокие уровни.
И кстати, если интересно могу написать забор пользователей по UNC, c поиском по sIDHistory.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Работа с AD: Поиск по атрибуту SIDHistory