Powershell 尝试使用脚本批量创建广告用户,并将其添加到CSV文件中列出的组中。不确定我是什么';我失踪了

Powershell 尝试使用脚本批量创建广告用户,并将其添加到CSV文件中列出的组中。不确定我是什么';我失踪了,powershell,Powershell,我正在编写一个powershell脚本,用于根据CSV中的信息添加和分组成员。我以前用过类似的方法,在较小的规模上做过这件事,它对我很有效。然而,这一次,它抛出了一个非常非特定的错误,我不知道如何继续 $userlist = Import-Csv C:\Users\Administrator\Desktop\olygearusers.csv $surname = $userlist.surname $passwds = $userlist.accountpassword $enabled = $

我正在编写一个powershell脚本,用于根据CSV中的信息添加和分组成员。我以前用过类似的方法,在较小的规模上做过这件事,它对我很有效。然而,这一次,它抛出了一个非常非特定的错误,我不知道如何继续

$userlist = Import-Csv C:\Users\Administrator\Desktop\olygearusers.csv
$surname = $userlist.surname
$passwds = $userlist.accountpassword
$enabled = $userlist.enabled
$givennames = $userlist.givenname
$paths = $userlist.path
$city = $userlist.city
$addresses = $userlist.street
$phones = $userlist.phone
$group = $userlist.group

ForEach($givennames in $userlist){
    if ($city -eq "calgary")
        {new-aduser -AccountPassword (ConvertTo-SecureString $passwds -asplaintext -force) `
        -Enabled:([bool]([int]$Enabled )) `
        -GivenName $givennames `
        -surName $surname `
        -Name "'$givenname' '$surname'" `
        -path $paths `
        -SamAccountName "'$givennames'.'$surname'.'C'" `
        -UserPrincipalName "'$givennames'.'$surname'.'C'.'@olygear.ca'" `
        -streetaddress $addresses `
        -homephone $phones `
        -city $city `
        -HomeDirectory '\\calgary3\homefolders\%username%' `
        -HomeDrive 'S' `
        -PassThru | Add-ADGroupMember -identity $group -Members $_.samaccountname}
    else
        {...}
}

Cannot convert the "System.Object[]" value of type "System.Object[]" to type "System.Int32".
At line:14 char:10
+         {new-aduser -AccountPassword (ConvertTo-SecureString $passwds ...
+          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [], RuntimeException
    + FullyQualifiedErrorId : ConvertToFinalInvalidCastException

同样,我以前也使用过这种方法(虽然简单得多,并且在这个过程中不尝试添加组成员),但我不确定如何继续。任何帮助都将不胜感激。

只要重新安排代码元素,您就可以完成您想要的:

$userlist = Import-Csv C:\Users\Administrator\Desktop\olygearusers.csv
ForEach($user in $userlist){
    $surname = $user.surname
    $passwds = $user.accountpassword
    $enabled = $user.enabled
    $givennames = $user.givenname
    $paths = $user.path
    $city = $user.city
    $addresses = $user.street
    $phones = $user.phone
    $group = $user.group
    if ($city -eq "calgary")
    {
    $NewUser = @{
      AccountPassword = ConvertTo-SecureString $passwds -asplaintext -force
      Enabled = [bool][int]$enabled
      GivenName = $givennames
      surName = $surname
      Name = "$givenname $surname"
      Path = $paths
      SamAccountName = "$givennames.$surname.C"
      UserPrincipalName = "$givennames.$surname.C.@olygear.ca"
      streetaddress = $addresses
      homephone = $phones
      city = $city
      HomeDirectory = '\\calgary3\homefolders\%username%'
      HomeDrive = 'S'
    }
    New-ADUser @NewUser
    Add-ADGroupMember -identity $group -Members $samaccountname
    }
    else
        {...}
}

您的代码当前只分配一次所有变量。在每个赋值中,您将创建一个值数组。运行foreach循环时,每次迭代都使用相同的数组值。许多参数不能接受数组,因此会抛出错误。在foreach循环的每次迭代中使用当前对象(
$user
)可以避免此问题。

只要重新排列代码元素,就可以完成您想要的:

$userlist = Import-Csv C:\Users\Administrator\Desktop\olygearusers.csv
ForEach($user in $userlist){
    $surname = $user.surname
    $passwds = $user.accountpassword
    $enabled = $user.enabled
    $givennames = $user.givenname
    $paths = $user.path
    $city = $user.city
    $addresses = $user.street
    $phones = $user.phone
    $group = $user.group
    if ($city -eq "calgary")
    {
    $NewUser = @{
      AccountPassword = ConvertTo-SecureString $passwds -asplaintext -force
      Enabled = [bool][int]$enabled
      GivenName = $givennames
      surName = $surname
      Name = "$givenname $surname"
      Path = $paths
      SamAccountName = "$givennames.$surname.C"
      UserPrincipalName = "$givennames.$surname.C.@olygear.ca"
      streetaddress = $addresses
      homephone = $phones
      city = $city
      HomeDirectory = '\\calgary3\homefolders\%username%'
      HomeDrive = 'S'
    }
    New-ADUser @NewUser
    Add-ADGroupMember -identity $group -Members $samaccountname
    }
    else
        {...}
}

您的代码当前只分配一次所有变量。在每个赋值中,您将创建一个值数组。运行foreach循环时,每次迭代都使用相同的数组值。许多参数不能接受数组,因此会抛出错误。在foreach循环的每次迭代中使用当前对象(
$user
)可以避免此问题。

您需要将变量赋值从脚本顶部移动到foreach循环内部,因为您希望它们在每次迭代中都发生更改。唯一应该留在循环之外的是
$userlist
分配,但我会将其重命名为类似
$users
的其他内容。然后可以将foreach循环更改为
foreach($userlist in$users){
并保留当前的变量分配语法。您需要将变量分配从脚本顶部移动到foreach循环内部,因为您希望它们在每次迭代时都发生更改。循环外部唯一应该保留的是
$userlist
分配,但我会将其重命名为类似于
$users
。然后可以将foreach循环更改为
foreach($users中的userlist){
并保留您当前的变量辅助语法。我能说服您使用splatting参数而不是使用行连续反勾号吗?splatting使代码在我看来可读性更好,而反勾号很容易被忽略。请想一想。@Theo已进行了更新。谢谢您的建议。您好!谢谢用于答复,但当我运行此命令时,会收到不同的错误代码。
Add ADGroupMember:无法验证参数'Members'上的参数。该参数为null或空。请提供一个不为null或空的参数,然后重试该命令。在第29行char:81+…到| Add ADGroupMember-identity$group-Members$\ samaccountname}+FullyQualifiedErrorId:ParameterArgumentValidationError,Microsoft.ActiveDirectory.Manageme.Commands.AddADGroupMember
@LeviFM,该错误现在应该已修复。我已将管道删除到
AddADGroupMember
cmdlet中。我是否可以说服您使用splatting参数,而不是使用行继续倒勾?Splatting使代码在我看来可读性更好,而backticks很容易被忽略。这只是一个想法。@Theo已进行了更新。感谢您的建议。您好!感谢您的回复,但当我运行此操作时,我得到了一个不同的错误代码。
Add-ADGroupMember:无法验证参数“Members”上的参数。参数为null或空。请提供一个不为null或空的参数,然后重试该命令。在第29行char:81+…到| Add ADGroupMember-identity$group-Members$\ u0.samaccountname}+FullyQualifiedErrorId:ParameterArgumentValidationError,Microsoft.ActiveDirectory.Manageme.Commands.AddADGroupMember
@LeviFM,该错误现在应该已修复。我已将管道删除到
add-adgroupmember
cmdlet中。