web-dev-qa-db-ja.com

New-ADUserで使用するためにStringをSecure Stringに変換できません

Primal Forms Community Editionを使用して、秘書向けの新しい学生作成プロセスを合理化するGUIを作成しています。下位レベルの学校では、生徒は自分の誕生日をパスワードとして使用するため、覚えやすくなっています。

「誕生日」フィールドとラベル付けされたテキスト入力ボックスがあります。私がやろうとしているのは、そのフィールドを取得して、New-ADUserの-AccountPasswordに使用することです。ただし、何を試しても、スクリプトで新しいユーザーを作成しようとすると、常にこのエラーが発生します。

New-ADUser : Cannot bind parameter 'AccountPassword'. Cannot convert the "System.Security.SecureString" value of type 
"System.String" to type "System.Security.SecureString".
At C:\Users\pomeroyt\Google Drive\Work\Scripts\Powershell\student_creation_gui.ps1:377 char:12
+ New-ADUser @User
+            ~~~~~
    + CategoryInfo          : InvalidArgument: (:) [New-ADUser], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.ActiveDirectory.Management.Commands.NewADUser

私が使用しているコードは次のようになります。

$password = $dob.text | ConvertTo-SecureString -AsPlainText -Force
$user = @{
    Description = "Student"
    UserPrincipalName = "[email protected]"
    Name = "$lname.text, $fname.text"
    SamAccountName = "$username"
    Surname = "$lname.text" 
    GivenName = "$fname.text" 
    EmailAddress = "$email" 
    HomeDrive = H: 
    HomeDirectory = "\\$server\Students\$yog\$username" 
    ScriptPath = "$script" 
    ChangePasswordAtLogon = 0 
    CannotChangePassword = 1 
    PasswordNeverExpires = 1 
    AccountPassword = "$password"
    Enabled = 1
    Path = "OU=$yog,OU=$group,OU=STUDENTS,DC=domain,DC=local"
    }
New-ADUser @User

私はここで本当に困っています

編集-

以下の解決策は、パスワードの問題を解決しました。ただし、実際にコードに追加の問題が発生していることに気付きませんでした。

何が起こっているのかを確認するために-verboseをオンにし、Nameフィールドが正しく出力されていないことを発見しました。 Name =に「$ lname、$ fname」を入力すると、何らかの理由で$ lnameの完全な出力が発生しました。 $ nameという新しい文字列を作成し、= $ lname.text + "、" + $ fname.textに設定します。

これでName = $ nameになり、コマンドが期待どおりに起動します。

15
ParadoxCTRL

変化する

AccountPassword = "$password"

AccountPassword = $password

変数を引用符で囲むと、安全な文字列ではなく通常の文字列として扱われます。証明:

$plainText = "Plain text"
$secureString = ConvertTo-SecureString $plainText -AsPlainText -Force
$quotedSecureString = "$secureString"
$plainText.GetType()
$secureString.GetType()
$quotedSecureString.GetType()

結果として

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object
True     False    SecureString                             System.Object
True     True     String                                   System.Object
16