无法将String转换为安全字符串以在New-ADUser中使用

Par*_*TRL 15 powershell powershell-2.0 powershell-3.0

我正在使用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
Run Code Online (Sandbox Code Playgroud)

我使用的代码看起来像这样.

$password = $dob.text | ConvertTo-SecureString -AsPlainText -Force
$user = @{
    Description = "Student"
    UserPrincipalName = "$username@domain.local"
    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
Run Code Online (Sandbox Code Playgroud)

我真的很茫然,因为我所看到的一切都说我正在做的事应该奏效

编辑 -

下面的解决方案确实解决了密码问题.但是,我没有意识到我实际上看到了我的代码的其他问题.

我打开-verbose看看发生了什么,发现Name字段输出不正确.为Name =输入"$ lname,$ fname"时由于某种原因导致$ lname的完整输出.我创建了一个名为$ name的新字符串,并将其设置为= $ lname.text +","+ $ fname.text.

现在Name = $ name,命令按预期触发.

Ben*_*ard 16

更改

AccountPassword = "$password"
Run Code Online (Sandbox Code Playgroud)

AccountPassword = $password
Run Code Online (Sandbox Code Playgroud)

如果您在变量周围有引号,则将其视为常规字符串而不是安全字符串.证明:

$plainText = "Plain text"
$secureString = ConvertTo-SecureString $plainText -AsPlainText -Force
$quotedSecureString = "$secureString"
$plainText.GetType()
$secureString.GetType()
$quotedSecureString.GetType()
Run Code Online (Sandbox Code Playgroud)

结果是

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object
True     False    SecureString                             System.Object
True     True     String                                   System.Object
Run Code Online (Sandbox Code Playgroud)


jim*_*098 6

我遇到了与 OP 相同的问题,其中安全字符串将被解析为字符串。本杰明的回答似乎很可靠,所以我通过运行来测试它:

$plainText = "Plain text"
$secureString = ConvertTo-SecureString $plainText -AsPlainText -Force
$quotedSecureString = "$secureString"
$plainText.GetType()
$secureString.GetType()
$quotedSecureString.GetType()
Run Code Online (Sandbox Code Playgroud)

在终端和 PowerShell 中。

本杰明密码

然而,我的尝试包含一个环境变量(我正在构建一个 docker 容器),它的反应似乎有所不同。

$env:SVCUSER="testuser"
$env:SVCPASS="testpass"
$env:SITENAME="test.com"
$env:SecurePass=ConvertTo-SecureString $env:SVCPASS -AsPlainText -Force
New-LocalUser -Name "$env:SVCUSER" -Password $env:SecurePass -Description "$env:SITENAME Site User"
Run Code Online (Sandbox Code Playgroud)

这会导致与 OP 相同的错误。

Cannot bind parameter 'Password'. Cannot convert the "System.Security.SecureString" value of type "System.String" to type "System.Security.SecureString".
Run Code Online (Sandbox Code Playgroud)

我的类似代码(和错误)

为了解决这个问题,我需要使用我认为是本地脚本变量而不是环境变量:

$env:SVCUSER="testuser"
$env:SVCPASS="testpass"
$env:SITENAME="test.com"
$SecurePass=ConvertTo-SecureString $env:SVCPASS -AsPlainText -Force
New-LocalUser -Name "$env:SVCUSER" -Password $SecurePass -Description "$env:SITENAME Site User"
Run Code Online (Sandbox Code Playgroud)

我认为这是有道理的,因为写入环境变量意味着(尽管安全)字符串一直存在,直到这些变量被重置。

当我分析第一个和第二个方法的输出(即本地变量和环境变量)的类型时,我可以看到两者具有不同的类型,正如错误所暗示的那样:

使用局部变量

为了将来的参考,我使用 Powershell 5.1.19041.1。我知道他们正在用 PS 改变相当大的功能,所以将来可能会改变。这可能是最好的,但在我的情况下却没有!