【问题标题】:Using ConvertTo-SecureString issues: Can I reset multiple ADUC passwords using powershell?使用 ConvertTo-SecureString 问题:我可以使用 powershell 重置多个 ADUC 密码吗?
【发布时间】:2019-07-09 12:56:03
【问题描述】:

请原谅我对编程的生疏理解,希望有人能看一眼,看看我的错误在哪里。我在尝试使用 Powershell 在测试 2008 R2 域中批量重置密码时遇到问题。我将 AD 模块导入 Powershell。我有一个包含 sAMAccountName(ADUC 用户名)的 .csv 文件,我通过分配对象 $UserFile = "c:\2019StudentsB115.csv" 将其导入到 powershell 中。然后我使用 foreach 循环遍历并重置每个帐户的密码,但这似乎总是失败。

我尝试将密码作为第二列添加到 .csv 文件中,但没有成功。然后我删除了第二列并删除了密码的相应代码。我尝试使用 ConvertTo-SecureString 为所有这些帐户提供通用密码“Qwerty10”。这些帐户都获得了 1 个通用密码,我不希望用户在第一次登录时必须重置它。我以为我可以使用 foreach 循环轻松做到这一点,但无论我做什么都会出错。

我试过的代码如下:

尝试1:错误“无法将参数绑定到字符串,因为它为空”的无限循环


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 文件传递​​它呢?任何提示或指针将不胜感激。我通过谷歌搜索打开了大约 20 个标签,但没有任何帮助。我查看了 Get/set ADAddcount 和 ConvertTo-SecureString 的语法,但这并不能真正帮助我弄清楚如何从这个 .csv 文件中分配对象。

亚历克斯

我试过跑步:

foreach ($Account in $Resetpassword) {
        Set-ADAccountPassword  $Account -NewPassword (ConvertTo-SecureString -AsPlainText "Qwerty19" -force) -Reset
}

其中 1 个帐户的结果:

Set-ADAccountPassword:无法绑定参数“身份”。不能 转换类型的“@{sAMAccountName=math5-3}”值 “System.Management.Automation.PSCustomObject”键入 “Microsoft.ActiveDirectory.Management.ADAAccount”。在行:2 字符:30 + 设置-ADAccountPassword

【问题讨论】:

  • 您的 foreach 循环包含 $account.SamAccountName 。这会带回您期望看到的用户名吗? Identity eq $null 表示缺少的位
  • 如果您的 CSV 仅包含帐户名称,请删除 ...Samaccount 名称并使用 $account。喜欢foreach ( $account in $resetpasswords ) { Set-adAccountPassword $account -NewPassword (ConvertTo-SecureString -AsPlainText "Qwerty10" -force) -Reset }
  • 谢谢你的建议,我试过了。一旦我删除了 SamAccountName 部分,它就会给出一个新错误,但现在似乎正在通过 .csv 文件。错误是“无法绑定参数“Identity”。无法转换“System.Management.Automation.PSCustomObject”类型的“@(sAMAccountName=USERNAME)”值键入“Microsoft.ActiveDirectory.Management.Commands.SetADAccountPassword”如果我读这个错误对我无法将 AD 用户名转换为我在此脚本中创建的自定义对象?
  • 我也在想也许我没有正确使用 Set-AdAccountPassword 中的 -Identity
  • 天知道。您是否有机会编辑您的帖子以包含此结果? $resetpassword[1]。随意更改任何可识别的内容,这是我要查找的变量名。

标签: windows powershell server directory


【解决方案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 的好处是您的文件中可以有许多列和标题,您可以选择忽略或选择有用的。

【讨论】:

  • 感谢您的详细评论。你的解释很有道理。代码确实有效哇谢谢!所以我对 Set-AdAccountPassword 部分没有错。该对象似乎是正确的 $Account.SamAccountName 我认为我必须将该对象 SamAccountName 与存储在数组中的值“绑定”,但我不确定如何做到这一点。因此,您导入了 .csv 并在一步中为其分配了自己的数组对象,而不是在我原来的代码中将其分开,并且一些对象是在循环内与循环外定义的。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多