Не смотря на всю мощь скриптовых языков, для подобных утилитарных задач предпочитаю использовать всё же не Powershell, и даже не VBScript, а простые узкоспециализированные консольные утилиты.
В частности для данной задачи я бы выбрал виндовую утилиту dsquery:
Если надо для списка из файла, то организовал бы простой цикл в батнике:
for /f %%i in (filename.txt) do (
...
)
В подобном альтернативном решении я вижу следующие плюсы:
1. Синтаксис простой и даже очевидный (и для написания, и для понимания, и для последующей модификации).
2. Написать такую команду в разы быстрее, чем ваш скрипт.
3. Работать это будет на Windows почти любой версии (от Win2k и выше точно).
4. Для работы этой команды не нужно устанавливать .NET Framework, Powershell и прочие тяжеловесные вещи.
Такой вот unix-way даже в администрировании windows-систем мне нравится больше, чем нагромождение длинных и неочевидных скриптов.
> Основной темой данного скрипта был не поиск по известному значению SID,
> а взять все эти атрибуты из пользователя.
> То есть на вход мы подаем пользователя, а не конкретный sID.
Да это непринципиально. Я просто показал сам подход.
В одном домене выгрузил список пользователей с их атрибутом sid или sidhistory, в другом домене нашёл соответствующих пользователей по SID'у Это не сильно сложнее. Работа с атрибутами объектов в LDAP через консольные утилиты dsquery, dsget, dsmod, dsmove, dsadd, dsrm а также csvde и ldifde во многих случаях действительно проще, быстрее, очевиднее и нагляднее, чем многострочные PS/VBS-скрипты.
Я ещё понимаю, если бы вы на вход скрипта давали UNC-путь виндовой шары, а на выходе получали список пользователей и групп из всех имеющихся доменов с указанием прав доступа к дереву каталогов. Это действительно стоило бы заскриптовать. Я и сам что-то подобное писал ранее на VBScript. Однако для таких элементарных задач как поиск объекта в AD по атрибутам специальная узкоспециализированная консольная утилита действительно проще и удобнее, чем скрипт.
В этом что-то есть, однако годного решения как это использовать в скрипте…
Я думаю, что критические к скорости части, можно переписать с командлетов powershell на использование утилит, однако обработку вести придется в powershell, иначе интегрировать нормально не получится на более высокие уровни.
И кстати, если интересно могу написать забор пользователей по UNC, c поиском по sIDHistory.
Работа с AD: Поиск по атрибуту SIDHistory