2017-05-25 19 views
0

我希望有人能够帮助我在这里。我正在尝试使用一个csv文件来创建新的AD用户帐户。 csv看起来像这样。新的ADUser脚本。无法验证参数

“ID”, “DEPT”, “FN”, “LN”, “BDATE”, “GRD”
“111111”, “1480”, “测试”, “HS”, “19980601” “2018”
“222222”, “1479”, “测试”, “ELEM”, “19980522”,写着 “2025年”

当运行下面的代码,我越来越对 '路径' 错误为空或空。提供一个非空或空的参数。

任何帮助,将不胜感激。

# 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} 

错误代码如下

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

+1

请将您收到的错误消息的确切文本粘贴到您的问题中。它确定哪条线投掷错误,我们需要这些信息能够进一步帮助您。 –

回答

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 
} 

一个说明,我怀疑使用生日作为密码的智慧。

+0

我使用bdate作为学生的密码。学生们在第一次登录时被迫改变它。 –

+0

@JustinMerwin是的,只是意识到这意味着每个学生在更改之前都会知道所有其他学生的密码。 – BenH

+0

@BeH我明白了。你会推荐什么?我有意见建议:-) –

-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中使用字符串。

+1

我们不要忘记他们正在重新使用变量。首先导入它们的CSV并将其分配给变量'$ ADUsers',然后他们将该变量设置为散列表,这甚至不是有效的。我认为这个脚本需要从头开始重新评估和重写。它有一些好的想法,只是结构和执行都很差。 – TheMadTechnician

+0

@TheMadTechnician第一次尝试这样的事情,所以我不知道我在做什么。只是想把事情拼凑起来。 –