使用ConvertTo-SecureString问题:是否可以使用Powershell重置多个ADUC密码?

时间:2019-07-09 12:56:03

标签: windows powershell server directory

对我对编程的粗鲁理解感到抱歉,希望有人可以看一眼,看看我的错误在哪里。我在尝试使用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

1 个答案:

答案 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-CsvGet-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文件的原因,它具有属性SamAccountNameImport-Csv的好处是,文件中可以有许多列和标题,并且可以选择忽略或选择有用的列和标题。