Назад | Перейти на главную страницу

Powershell, как сравнить вводимые пользователем данные

Я делаю "ярлык" PS1 скрипт для обновления пароля пользователя домена. Я хотел бы дважды запросить у пользователя новый пароль, не показывая пароль на экране. Когда я использую $Text1=Read-Host ; $Text2=Read-Host ; $Text1 -eq $Text2 при том же вводе - например, «1» - вывод этого однострочника будет «True». Тем не мение,

$Text1=Read-Host -AsSecureString ; $Text2=Read-Host -AsSecureString ; $Text1 -eq $Text2

и

$Text1=Read-Host -AsSecureString ; $Text2=Read-Host -AsSecureString ; (ConvertFrom-SecureString $Text1) -eq (ConvertFrom-SecureString $Text2)

вернуть False.

Скрипт в том виде, в каком он есть сейчас, без двойных запросов и сравнения вводимых пользователем данных, представлен ниже, и он работает для сброса пароля пользователя.

$UserName = Read-Host "User name "
$NewPass = Read-Host -AsSecureString
Set-ADAccountPassword `
    -NewPassword $NewPass `
    -Verbose `
    -Identity ( (Get-ADUser -Filter "SamAccountName -like '$UserName'").DistinguishedName )
$NewPass.Dispose()

В соответствии с Технет, вам необходимо «расшифровать» secureString следующим методом:

$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($text1)
$PlainPassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)

Во-первых, это преобразует защищенную строку в тип данных «Базовая строка» (BSTR), а затем обратно в читаемую строку. Это даст вам простой текстовый пароль, введенный пользователем. Вы можете, например, поместить это в небольшую функцию, которую вы можете вызывать для обоих паролей следующим образом:

 function Decrypt-Password ($secureString){
   $BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($secureString)
   $PlainPassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
   return $PlainPassword
  }

$Text1=Read-Host -AsSecureString
$Text2=Read-Host -AsSecureString    
(Decrypt-Password -secureString $text1) -eq (Decrypt-Password -secureString $text2)

Это будет работать, как ожидалось.

Вы также можете создать функцию, которая будет напрямую сравнивать два заданных SecureString, но я оставлю вам точную реализацию.