Использовать объект пароля SecureString в аутентификации команды dsquery
Я следовал следующему руководству, чтобы создать пароль SecureString. Теперь мне нужно войти в чужой контроллер домена с опциями dsquery -s (сервер) -u (пользователь) и -p (пароль).
dsquery group -name $group -s $rmSrv -u $user -p $pass | dsget group -members -expand -c -s $rmSrv -u $user -p $pass | dsget user -samid -c -s $rmSrv -u $user -p $pass > $filename
Когда я ввожу пароль в виде открытого текста, я аутентифицируюсь. После использования объекта SecureString я не могу пройти проверку подлинности. Я попробовал несколько вариантов, но не смог запустить его.
У тебя есть идеи?
1 ответ
Единственный способ сделать это - расшифровать SecureString
объект и получить его в виде строки.
Вот пример функции:
function ConvertTo-String {
param(
[Security.SecureString] $secureString
)
try {
$bstr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($secureString)
[Runtime.InteropServices.Marshal]::PtrToStringAuto($bstr)
}
finally {
if ( $bstr -ne [IntPtr]::Zero ) {
[Runtime.InteropServices.Marshal]::ZeroFreeBSTR($bstr)
}
}
}
Осторожно: расшифровка SecureString
объект обходит защиту, которая SecureString
объекты предоставляют.
Если вы настаиваете на использовании dsquery
команда, это единственная опция, потому что для нее требуется простой текстовый пароль в командной строке. Это по своей сути небезопасно.
Вместо этого я бы рекомендовал использовать командлеты Active Directory, которые могут использовать SecureString
непосредственно без необходимости преобразования в обычный текст.