对我对编程的粗鲁理解感到抱歉,希望有人可以看一眼,看看我的错误在哪里。我在尝试使用Powershell在测试2008 R2域中批量重置密码时遇到问题。我将AD模块导入了Powershell。我有一个包含sAMAccountName(ADUC用户名)的.csv文件,我通过分配对象$ UserFile =“ c:\ 2019StudentsB115.csv”将其导入Powershell。然后,我使用一个foreach循环来遍历并重置每个帐户的密码,但这似乎总是失败了。
我尝试将密码作为第二列添加到.csv文件,但是没有用。然后,我删除了第二列并删除了密码的相应代码。我尝试使用ConvertTo-SecureString为所有这些帐户提供通用密码“ Qwerty10”。这些帐户都获得了1个通用密码,我不希望用户在首次登录时必须重置密码。我以为可以使用foreach循环轻松地做到这一点,但是无论我做什么我都会出错。
我尝试过的代码如下:
尝试1:无休止的错误循环“无法将参数绑定到String,因为它为null”
foreach ($Account in $Resetpassword) {
$Account.sAMAccountName
$Account.Password
Set-ADAccountPassword -Identity $Account.sAMAccountName -NewPassword (ConvertTo-SecureString $Account.Password -AsPlainText "Qwerty10" -force) -Reset
}
尝试2:错误“无法验证参数'Identity'上的参数。参数为空。”青柠:3字符:40
$UserFile = "c:\2019StudentsB115.csv"
foreach ($Account in $Resetpassword) {
$Account.sAMAccountName
Set-ADAccountPassword -Identity $Account.sAMAccountName -NewPassword (ConvertTo-SecureString "Qwerty19" -AsPlainText -force) -Reset
}
我以为可能是使用Set-AdAccountPassword
的语法,但是后来我尝试了一下,并且效果很好:Set-AdAccountPassword -Identity "math1-1" -NewPassword (ConvertTo-SecureString -AsPlainText "Qwerty10" -force)
我正在将身份Math1-1和密码Qwerty10作为新密码传递给此cmdlet,并且该密码有效,所以为什么不能使用.csv文件传递此密码?任何提示或指示,将不胜感激。我在Google搜索中打开了大约20个标签,但没有任何帮助。我查看了Get / set ADAddcount和ConvertTo-SecureString的语法,但这并不能真正帮助我确定如何从此.csv文件分配对象。
亚历克斯
我尝试跑步:
foreach ($Account in $Resetpassword) {
Set-ADAccountPassword $Account -NewPassword (ConvertTo-SecureString -AsPlainText "Qwerty19" -force) -Reset
}
其中1个帐户的结果:
Set-ADAccountPassword:无法绑定参数“ Identity”。不能 转换类型的“ @ {sAMAccountName = math5-3}”值 键入“ System.Management.Automation.PSCustomObject” “ Microsoft.ActiveDirectory.Management.ADAccount”。在线:2字符:30 + Set-ADAccountPassword <<<< $ Account -NewPassword(ConvertTo-SecureString -AsPlainText“ Qwerty19” -force)-重新设置 + CategoryInfo:InvalidArgument:(:) [Set-ADAccountPassword],ParameterBindingException + FullyQualifiedErrorId:CannotConvertArgumentNoMessage,Microsoft.ActiveDirectory.Management.Commands.SetADAccoun tPassword
答案 0 :(得分:1)
示例1(CSV文件包含标题SamAccountName):
我们假设2019StudentsB115.csv
包含以下内容:
SamAccountName
Math9-9
Math1-1
User3
以下代码应该起作用:
$Accounts = Import-Csv "c:\2019StudentsB115.csv"
foreach ($Account in $Accounts) {
Set-ADAccountPassword -Identity $Account.SamAccountName -NewPassword (ConvertTo-SecureString "Qwerty19" -AsPlainText -force) -Reset
}
示例2(CSV文件不包含标题):
如果您的CSV文件不包含标题,并且您不想使用标题,则不要使用Import-Csv
。 Get-Content
适用于每行只有一个值的文本文件。假设2019StudentsB115.csv
包含以下内容:
Math9-9
Math1-1
User3
此处CSV文件不包含标题。现在,为简单起见,我们可以跳过使用Import-Csv
。代码如下,注意如何不再需要.SamAccountName
属性。
$Accounts = Get-Content "c:\2019StudentsB115.csv"
foreach ($Account in $Accounts) {
Set-ADAccountPassword -Identity $Account -NewPassword (ConvertTo-SecureString "Qwerty19" -AsPlainText -force) -Reset
}
说明:
如果您有一个用Import-Csv
读取的文件,它将假定第一行包含标题而不是值。例外情况是,如果您使用-Header
开关,它将自动为您创建一个标题并将文件内容视为所有值。
使用Import-Csv
时,结果对象是对象数组,其中每个对象都包含每个标头的属性。在PowerShell中检索单个属性的值时,您需要直接访问该属性。一种这样的方法是使用语法object.property
。如果从对象数组访问属性,它将为数组中的每个对象返回该属性的值。这就是foreach
循环的用处,因为它将遍历数组中的每个对象。在我的示例中,$Accounts
是对象数组。 $Account
是当前迭代的对象,由于构造CSV文件的原因,它具有属性SamAccountName
。 Import-Csv
的好处是,文件中可以有许多列和标题,并且可以选择忽略或选择有用的列和标题。