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