我目前正在为课程分配工作,我们需要使用Dsadd命令将CSV用户列表导入Active Directory。
这是我的剧本:
$CSV = Import-Csv -Delimiter "," -Path "$PWD\TestCSV.csv"
foreach ($user in $CSV)
{
$Member = $User.Title + ","
$Domain = $User.Domain + ", DC=Domains" + ", DC=com" + "`""
$Name = $User.Firstname + " " + $User.Lastname + ","
$Password = $User.Password
write-host Dsadd user `"CN=$Name"" DC=$Domain -pwd $User.Password -memberof `"CN=$Member" CN=Users, DC=$Domain"
}
当我执行它时,它会将以下内容输出到powershell窗口:
Dsadd用户“CN = Abruaba Rodriguez,DC = CoolDomain,DC =域名,DC = Com”-pwd密码
-memberof“CN = gk_students,CN = Users,DC = CoolDomain,DC = Domains,DC = com”
这是添加具有该名称的用户的正确语法,就像我自己调用该行一样,它可以正常工作。但是如果我删除 write-host ,命令就会失败,说“dsadd failed:'DC = Domains,'是一个未知参数。
有什么建议吗?提前谢谢。
编辑:我让我的脚本通过一种解决方法,但我不认为这是运行此脚本的最佳方式。我改变了最后一行,又增加了两行。我没有写入主机,而是写出变量,然后将输出放在一行上。然后我只是调用变量并成功!它起作用了:
$Execute = write-output Dsadd user `"CN=$Name"" DC=$Domain -pwd $User.Password -memberof `"CN=$Member" CN=Users, DC=$Domain"
$Fields="{0} {1} {2} {3} {4} {5} {6} {7}" -f $Execute
Invoke-Expression $Fields
有没有更好的方法来使用PowerShell执行此任务?
答案 0 :(得分:2)
我认为你的困难来自于Powershell如何解析传统命令的参数。由于您没有包含引号中包含空格的参数,因此Powershell不会认为它们是同一个字符串的一部分。它会将其作为单独的参数传递。
尝试以不同方式构建命令行
$CSV = Import-Csv -Delimiter "," -Path "$PWD\TestCSV.csv"
foreach ($user in $CSV)
{
$Domain = "DC={0},DC=Domains,DC=com" -f $User.Domain
$MemberOfDn = """CN={0}, CN=Users,{1}""" -f $user.Title,$domain
$UserDn = """CN={0} {1},{2}""" -f $User.Firstname, $User.Lastname, $Domain
Dsadd user $UserDn -pwd $User.Password -memberof $MemberOfDn
}
通过这种方式,您可以在开头构建所需的所有字符串,并根据需要将它们组合在一起。此外,在双引号字符串中,""
与转义的双引号字符相同,无论您喜欢哪种方式。您可以像我一样使用-f
格式运算符,也可以像原始示例一样直接插入变量,但我发现格式运算符有助于整体可读性,特别是如果其他人必须维护/更改你的脚本。