新的ADUser脚本。无法验证参数

时间:2017-05-25 16:55:13

标签: powershell active-directory

我希望有人可以帮助我。我有一个csv文件,我试图用来制作新的AD用户帐户。 csv看起来像这样。

  

" ID"" DEPT"" FN"" LN"" BDATE"&# 34; GRD"
  " 111111"" 1480""试验"" HS"" 19980601"" 2018& #34;
  " 222222"" 1479""试验"" ELEM"" 19980522"" 2025& #34;

运行以下代码时,我收到有关'路径'的错误为null或为空。提供非null或空的参数。

任何帮助都将不胜感激。

# Import active directory module for running AD cmdlets
 Import-Module activedirectory

 #Store the data from ADUsers.csv in the $ADUsers variable
 $ADUsers = Import-csv adusers.csv

 #Store report in log file in the $log variable
 $log = "log.txt"

 #Set Additional Variables
 $Password = (ConvertTo-SecureString -AsPlainText "$User.BDATE" -Force)
 $DisplayName = "$User.FN+ ' ' + $user.LN"
 $SCHID = $User.DEPT

 # Choose OU

Switch ($SCHID)
{
    "1480" {$OU = 'OU=students,OU=users,ou=hs,dc=clasd,dc=net'}
    "1479" {$OU = 'OU=students,OU=users,ou=elem,dc=clasd,dc=net'}
    "1480" {$Folder = '\\hs-ss\students\hs'}
    "1479" {$Folder = '\\hs-ss\students\elem'}
}


#Create Hash Table for New User Creation

 $ADUsers = @{

'SamAccountName' = "$User.ID"
'UserPrincipalName' = "$User.ID + '@clasd.net'"
'GivenName' = "$User.FNAME"
'SurName' = "$User.LNAME"
'EmailAddress' = "$User.ID = '@clasd.net'"
'Path' = "$OU"
'Department' = "$User.GRD"
'Company' = "$User.DEPT"
'AccountPassword' = $Password
'ChangePasswordAtLogon' = $true
'Enabled' = $true
'DisplayName' = "$DisplayName"
'Name' = $Displayname
'Homedrive' = "Z"
'Homedirectory' = "$Folder\'$User.ID'"
}

#Call New-ADUser with the parameters Above
Foreach ($User in $ADUsers) {
New-ADUser @ADUsers}

错误代码在

之下
  

New-ADUser:无法验证参数' Path'的参数。参数为null或空。提供非null或空的参数,然后再次尝试该命令。   在C:\ Users \ jmerwin \ Desktop \ testUser.ps1:49 char:12   +新ADUser @ADUsers}   + ~~~~~~~~       + CategoryInfo:InvalidData:(:) [New-ADUser],ParameterBindingValidationException       + FullyQualifiedErrorId:ParameterArgumentValidationError,Microsoft.ActiveDirectory.Management.Commands.NewADUser

2 个答案:

答案 0 :(得分:1)

首先,正如@TheMadTechnician所说,你的循环和你的CSV被保存在同一个变量中。更进一步,您将要为CSV中的每个用户循环。这样就可以在查找属性时定义$user

为了清晰起见,我没有尽早定义像$password这样的几个变量,而是将它们移动到调用它们的位置,如参数哈希表。

接下来,我将Switch块合并了重复的语句。

最后,在你的参数块中,@Swonkie注意到当你将$variable.property放入双引号时,变量将被展开.property,而不仅仅是获取属性的值。要评估双引号内部,可以使用子表达式$()这将评估内部的所有内容然后构建字符串。但是如果某个属性已经是一个字符串,那么您可以将""关闭。

$ImportedCSV = Import-csv adusers.csv
$log = "log.txt"

ForEach ($User in $ImportedCSV) {
    Switch ($User.DEPT) {
        "1480" {
            $OU = 'OU=students,OU=users,ou=hs,dc=clasd,dc=net'
            $Folder = '\\hs-ss\students\hs'
        }
        "1479" {
            $OU = 'OU=students,OU=users,ou=elem,dc=clasd,dc=net'
            $Folder = '\\hs-ss\students\elem'
        }
    }

    $ADUserParams = @{
        'SamAccountName' = $User.ID
        'UserPrincipalName' = "$($User.ID)@clasd.net"
        'GivenName' = $User.FNAME
        'SurName' = $User.LNAME
        'EmailAddress' = "$($User.ID)@clasd.net"
        'Path' = $OU
        'Department' = $User.GRD
        'Company' = $User.DEPT
        'AccountPassword' = (ConvertTo-SecureString -AsPlainText $User.BDATE -Force)
        'ChangePasswordAtLogon' = $true
        'Enabled' = $true
        'DisplayName' = "$($User.FN) $($User.LN)"
        'Name' = "$($User.FN) $($User.LN)"
        'Homedrive' = "Z"
        'Homedirectory' = "$Folder\$($User.ID)"
    }
    New-ADUser @ADUserParams
}

另外一点,我质疑使用生日作为密码的智慧。

答案 1 :(得分:-1)

您使用" $ User.BDATE"," $ User.ID"和其他人一样。出于两个原因,这是错误的。 $用户此时不包含任何内容。你的probabyl意味着在这样的循环中这样做:

foreach ($User in $ADUsers) {
    # do something
    $User.ID
}

这是错误的另一个原因:你在变量周围有双引号。删除它们。否则,PowerShell会进行变量扩展以创建字符串,但您做错了。你应该做" $($ User.ID)"但通过做" $ User.ID"只会扩展$ User对象和文字" .ID"将结束。

还有更多错误。这不会像你期望的那样工作:

"$User.FN+ ' ' + $user.LN"

可能还有更多东西。我不会试图找到你在剧本中遇到的每一个错误。

我建议你阅读如何使用PowerShell中的字符串。