Powershell 创建广告会导致脚本问题

Powershell 创建广告会导致脚本问题,powershell,Powershell,我做了一个大量的广告脚本,但似乎不工作的原因。有人能帮我吗 $ADUsers = Import-csv C:\Users\Deng\Desktop\newusers.csv foreach ($User in $ADUsers) { $Username = $Users.username $Firstname = $Users.firstname $Password = $Users.password $Lastname = $Users.lastname $OU

我做了一个大量的广告脚本,但似乎不工作的原因。有人能帮我吗

$ADUsers = Import-csv C:\Users\Deng\Desktop\newusers.csv

foreach ($User in $ADUsers)
{
$Username  = $Users.username
   $Firstname = $Users.firstname
   $Password  = $Users.password
   $Lastname  = $Users.lastname
   $OU        = $Users.ou

         New-ADUser `
        -SamAccountName $Username `
        -UserPrincipalName $Username@aptushealth.com `
        -Name $Firstname $Lastname `
        -GivenName $Firstname `
        -Surname $Lastname `
        -Enabled $True `
        -ChangePasswordAtLogon $false `
        -DisplayName $Lastname, $Firstname `
        -Path $OU `
        -AccountPassword (convertto-securestring $Password -AsPlainText -Force)
}
我在下面得到了这个错误:

ConvertTo SecureString:无法将参数绑定到参数“String” 因为它是空的。第24行字符:54 + ... -AccountPassword(转换为securestring$Password-AsPlai。。。 + ~~~~~~~~~ +CategoryInfo:InvalidData:(:)[ConvertTo SecureString],参数BindingValidationException +FullyQualifiedErrorId:参数ArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.ConvertToSecurityCommand

另请参见CSV的内容

usersname firstname password lastname ou
efranklin Edward P@s$word Franklin "OU=PII Users,DC=PII,DC=net"
bjackson Bill P@s$word Jackson "OU=PII Users,DC=PII,DC=net"

我已经做出了改变,这就是我得到的——大卫


ConvertTo SecureString:无法将参数绑定到参数“String”,因为它为空。在第24行char:54+…-AccountPassword(ConvertTo SecureString$Password-AsPlai…-


仍然得到相同的错误

您的错误,即在foreach循环中,您通过对象
$user
操作而不是
$users
,因此您必须编写:

   $Username  = $User.username
   $Firstname = $User.firstname
   $Password  = $User.password
   $Lastname  = $User.lastname
   $OU        = $User.ou
逐行导入Csv读取文件,因此第一行必须包含以下列的名称:

username;firstname;password;lastname;ou
然后可能是您的数据:

efranklin;Edward;P@s$word;Franklin;"OU=PII Users,DC=PII,DC=net"
附加的 您必须具有类似的内容(并且不要忘记在csv文件中必须是“;”分隔符!!!分隔参数):


添加一些额外的建议

在原始代码中,您分配了错误的值。正如一些参与者所提到的(请参阅@Vad)$Users在您提交的代码中可能为null。这会导致专门引用null值的错误。此错误非常严重,因为SecureString不会接受-String参数的null值

您使用了迭代变量$User,但进行了如下变量赋值:

$Password = $Users.password
$Users(注意“s”)在示例中为空,您应该使用
$User.password

现在,如果您执行了所有这些操作,但仍然会出现错误。我的建议是在执行
New ADUser
之前后退一步并检查数据。我首先要注释掉
New ADUser
。然后您可以执行如下检查:

$ADUsers = Import-Csv C:\Users\Deng\Desktop\newusers.csv
$ADUsers | Where-Object($_.Password -eq $null) | Format-Table
这将为您提供具有null password属性的所有对象。在您尝试将内容用作
New ADUser
的输入之前,需要修复这些对象

注意:您也可以使用Excel进行此类检查

密码只是属性之一。我将引用
Where{}
子句中的其他属性重复测试。您必须确保数据完全干净


补充其他答案的原始评论:

我认为这已经得到了回答,但为了可读性,我认为这是一个很好的参数设置用例

未经测试的示例:

$ADUsers = Import-Csv C:\Users\Deng\Desktop\newusers.csv

foreach ($User in $ADUsers)
{
    $Params =
    @{
        samAccountName        = $User.username
        UserPrincipalName     = ($User.username + '@aptushealth.com')
        GivenName             = $User.FirstName
        SurName               = $User.LastName
        Name                  = ($User.FirstName + ' ' + $User.lastname)
        DisplayName           = ($User.lastname + ' ' + $User.FirstName)
        Enabled               = $true
        Path                  = $User.ou
        AccountPassword       = (ConvertTo-SecureString $User.password -AsPlainText -Force)
        ChangePasswordAtLogon = $false

    }

    New-ADUser @Params
}

这将使您免于所有通常被认为是危险的后滴答逃逸。

什么是
$Users
?@Caramiriel$Users是csvI中定义用户的变量。我认为@Caramiriel的要点是它应该是$User,因为这是您在ForEachI中指定的。我开始认为您的输入CSV文件根本不是CSV文件,但确切的(列表)中有一个文本文件格式如您在此处所示。请编辑您的问题并添加输入文件的前三行或四行,以显示其真实外观。我已编辑您的问题,将其作为可读的格式化文本。我认为CSV使用空格字符作为字段分隔符是否正确?在这种情况下,只需将其添加到
导入CSV
cmdlet作为参数
-分隔符“”
,并接受@Steven的建议,使用Splatting来消除这些可怕的反勾号。我已经做了更改,这就是我获取ConvertTo SecureString:无法将参数绑定到参数“String”,因为它为空。第24行:char:54+…-AccountPassword(convertto securestring$Password-AsPlai…您必须编辑您的post问题,并显示您的实际代码和csv文件VAD中的前3行。--默认分隔符是csv的逗号,而不是带引号的字符串的分号。因此,文件类型为“逗号分隔值”。您可以使用分号等,但需要特别传递-Deli斜接开关以使用该选项。@DavidNG如果您想对答案发表评论,请以评论的形式进行。不要试图用注释编辑答案。谢谢您的建议。
$ADUsers = Import-Csv C:\Users\Deng\Desktop\newusers.csv

foreach ($User in $ADUsers)
{
    $Params =
    @{
        samAccountName        = $User.username
        UserPrincipalName     = ($User.username + '@aptushealth.com')
        GivenName             = $User.FirstName
        SurName               = $User.LastName
        Name                  = ($User.FirstName + ' ' + $User.lastname)
        DisplayName           = ($User.lastname + ' ' + $User.FirstName)
        Enabled               = $true
        Path                  = $User.ou
        AccountPassword       = (ConvertTo-SecureString $User.password -AsPlainText -Force)
        ChangePasswordAtLogon = $false

    }

    New-ADUser @Params
}