Использовать объект пароля 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 непосредственно без необходимости преобразования в обычный текст.

Другие вопросы по тегам