使用PowerShell批量导入来自csv的AD用户,无需用户干预

时间:2017-07-01 02:23:07

标签: powershell active-directory

我尝试使用ADUser powershell cmdlet从csv文件导入用户,这里是脚本

Import-Module ActiveDirectory
$csvcontent = Import-CSV -Path "C:\Program Files (x86)\AWS Tools\PowerShell\AWSPowerShell\import_create_ad_users_2a.csv"

foreach ($user in $csvcontent) {
$samAccountName = $user.GivenName.substring(0,1).ToLower()+$user.LastName.ToLower()
$userPrincinpal = $samAccountName+"@mmc.local"
New-ADUser
-AccountPassword (ConvertTo-SecureString -AsPlainText $user.Password -force)`
-ChangePasswordAtLogon $false`
-Company “mmc LLP.”`
-DisplayName ($user.GivenName+""+$user.Lastname)`
-userprincipalname $userPrincinpal`
-SamAccountName $samAccountName`    -Name ($user.GivenName+""+$user.Lastname)`
-Path “CN=Users,DC=mmc,DC=local”`
-state $user.County`
-givenname $user.GivenName`
-surname $user.Lastname`
-description ($user.Description)`
-Enabled $true`

Add-ADGroupMember "mmc_Users" $samAccountName;
}

但是当我在powershell中运行命令时,我得到如下所示的提示,我想导入csv文件中列出的所有用户而无需任何用户干预。

cmdlet New-ADUser at command pipeline position 1
Supply values for the following parameters:
Name:

请查看脚本并告诉我如何解决此问题。

仅供参考 - Powershell初学者

谢谢,

KARTHIK

2 个答案:

答案 0 :(得分:2)

反引号通常值得避免。它们通过转义下一个字符来工作,该字符在一行的末尾是换行符,因此它允许命令继续。然而,它太容易在你看不到的反击之后留下一个空格,然后最终变得逃脱而不是换行符。上面的情况似乎并非如此,但正如TessellatingHeckler指出你在New-ADUser之后错过了一个。

更好的解决方案(以防止代码过于横向)将使用splatting,如下所示:

Import-Module ActiveDirectory
$csvcontent = Import-CSV -Path "C:\Program Files (x86)\AWS Tools\PowerShell\AWSPowerShell\import_create_ad_users_2a.csv"

foreach ($user in $csvcontent) {

    $samAccountName = $user.GivenName.substring(0,1).ToLower()+$user.LastName.ToLower()
    $userPrincinpal = $samAccountName+"@mmc.local"

    $NewUserParams = @{
        AccountPassword = (ConvertTo-SecureString -AsPlainText $user.Password -Force)
        ChangePasswordAtLogon = $false
        Company = “mmc LLP.”
        DisplayName = ($user.GivenName+""+$user.Lastname)
        userprincipalname = $userPrincinpal
        SamAccountName = $samAccountName  
        Name = ($user.GivenName+""+$user.Lastname)
        Path = “CN=Users,DC=mmc,DC=local”
        state = $user.County
        givenname = $user.GivenName
        surname = $user.Lastname
        description = ($user.Description)
        Enabled = $true
    }

    New-ADUser @NewUserParams
    Add-ADGroupMember "mmc_Users" $samAccountName
}

这可以通过创建一个哈希表@{ },其中包含您要设置的每个参数,然后将该哈希表发送到具有特殊@字符的cmdlet。

答案 1 :(得分:0)

我觉得很少看错了,但我们试着解决它。最好在创建用户后更改名称。这将限制脚本失败。 反引号可以用于正在学习如何编码的人,它允许您以更合理的方式查看代码。您也可以按照建议创建一个数组,但这可能会变得复杂并且无法给出正确的结果。

让我们分解下面的脚本。首先我们调用ActiveDirectory Module,然后调用CSV。那部分效果很好。

我们可以使用以下提供的代码对其进行测试:

Import-Module ActiveDirectory
$csvcontent = Import-CSV -Path "C:\Program Files (x86)\AWS Tools\PowerShell\AWSPowerShell\import_create_ad_users_2a.csv"
$csvcontent | Out-GridView

这应该显示原始数据,但一个例子是:

GivenName |姓氏|密码|说明|国家

Karthik | CSVScript | 79HKJ#p8 | UserTest |挪威

一旦我们确认列是正确的。我们可以运行脚本

使用Import-CSV时,它会导入您定义为pipline的列($ _。GivenName)。这允许我们不要创建另一个变量。从Import-CSV cmdlet调用它只会使用您在原始数据(CSV文件)中提供的字段。

您可以将以下内容另存为名为NewUser_CSV.ps1

的PS_Script

下面的脚本只会查看您放入列中的内容。如果某些内容不正确,则表示CSV中的数据错误。这是使用CSV文件的基本添加AD用户,没有重大错误处理。

我们将使用Transcript cmdlet收集日志

#RUN AS ADMIN!
Start-Transcript -Path "C:\Program Files (x86)\AWS Tools\PowerShell\AWSPowerShell\import_create_ad_users_2a.log"
Import-Module ActiveDirectory
$csvcontent = Import-CSV -Path "C:\Program Files (x86)\AWS Tools\PowerShell\AWSPowerShell\import_create_ad_users_2a.csv"
$csvcontent | ForEach-Object {
$sam = $_.GivenName.substring(0,1)+$_.Lastname
$setpass = ConvertTo-SecureString -AsPlainText $_.Password -force
 Try
 {
 New-ADUser $samAccountName `
 -Path "CN=_s,DC=mmc,DC=local" `
 -GivenName $_.GivenName `
 -Surname $_.LastName `
 -UserPrincipalName ($samAccountName + "@mmc.local")`
 -DisplayName ($_.GivenName + " " + $_.LastName) `
 -Description $_.Description `
 -Enabled $TRUE `
 -Company "mmc LLP." `
 -State $_.Country `
 -AccountPassword $setpass `
 -ChangePasswordAtLogon $False `
 -AccountPassword $setpass 

  $newdn = (Get-ADUser $samAccountName).DistinguishedName
            Rename-ADObject -Identity $newdn -NewName ($_.GivenName + " " + $_.LastName)
 }
  Catch
{
 Write-Host "[ERROR]`t Oops, something went wrong: $($_.Exception.Message)`r`n"
}
}
Stop-Transcript

我真的希望这可以帮助你完成任务并完成任务。学习PowerShell祝你好运。