【问题标题】:Can not convert String to Secure String for use in New-ADUser无法将字符串转换为安全字符串以在 New-ADUser 中使用
【发布时间】:2013-10-11 21:31:29
【问题描述】:

我正在使用 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 = "$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

我真的很茫然,因为我所看到的一切都表明我正在做的事情应该有效

编辑 --

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

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

现在 Name = $name 并且命令按预期触发。

【问题讨论】:

    标签: powershell powershell-2.0 powershell-3.0


    【解决方案1】:

    改变

    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
    

    【讨论】:

    • 当我这样做时,我最终得到了这个错误:New-ADUser : A value for the attribute was not in the acceptable range of values At C:\Users\****\Google Drive\Work\Scripts\Powershell\student_creation_gui.ps1:377 char:1 + New-ADUser @User + ~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (CN=System.Windo...afford,DC=local:String) [New-ADUser], ADException + FullyQualifiedErrorId : ActiveDirectoryServer:8322,Microsoft.ActiveDirectory.Management.Commands.NewADUser
    【解决方案2】:

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

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

    在终端和 PowerShell 中。

    Benjamin's Code

    但是,我的尝试包含一个环境变量(我正在构建一个 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"
    

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

    Cannot bind parameter 'Password'. Cannot convert the "System.Security.SecureString" value of type "System.String" to type "System.Security.SecureString".
    

    My similar code (and the error)

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

    $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"
    

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

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

    Working with local variables

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

    【讨论】:

      猜你喜欢
      • 2010-12-06
      • 2018-05-11
      • 2021-03-30
      • 1970-01-01
      • 2012-09-19
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      相关资源
      最近更新 更多