【问题标题】:Powershell: Attempting to update all sAMAccountNames in an OU; nothing past the initial "if" is workingPowershell:尝试更新 OU 中的所有 sAMAccountNames;最初的“如果”没有任何效果
【发布时间】:2021-04-08 19:43:43
【问题描述】:

由于最近组织标准发生了一些变化,我不得不更新我所在位置的用户 OU 中每个用户的 sAMAccountName。我已经编写并运行了代码,并针对我自己的帐户进行了多次测试,但在使用 else、Write-Host 和 Export-CSV 命令时遇到了一致的问题。

$OU = 'users ou'

$users = Get-ADObject -Filter * -SearchBase $OU -Properties sn,givenName,userPrincipalName,sAMAccountName,employeeType

$newPre2K = ''

$memberName = ''

foreach($user in $users)
{
    $memberName = $user.sn + ", " + $user.givenName
    $newPre2K = (($user.userPrincipalName).Split(".")[0]) + $user.employeeType
    Try
    {        
        if($user.sAMAccountName -ne $newPre2K)
        {
            $user.sAMAccountName = $newPre2K
            Set-ADObject -Instance $user 
            Write-Host $memberName + ": sAMAccountName change successful." -ForegroundColor Green | Export-CSV -Path "C:\Users\(me)\Desktop\sAMAccUpdate.csv" -NoTypeInformation -Append
        }
        else
        {
            Write-Host $memberName + ": Member sAMAccountName has already been updated." -ForegroundColor Yellow | Export-CSV -Path "C:\Users\(me)\Desktop\sAMAccUpdate.csv" -NoTypeInformation -Append
        }
    }
    Catch
    {
        Write-Host $memberName + ": Unknown Error. Review CSV to identify failed changes and attempt to remediate." -ForegroundColor Red | Export-CSV -Path "C:\Users\(me)\Desktop\sAMAccUpdate.csv" -NoTypeInformation -Append
    }
}

最初的if 语句完全按照我的意愿运行,Write-Host 也是如此。然而,之后的Export-CSV,虽然它至少创建了 CSV 文件,但并没有在其中放入任何内容。此外,即使在连续运行几次之后,这基本上会强制产生“else”结果,因为我的 sAMAccountName 已经更新,因此不满足 if 语句中的 -ne 参数,我不明白来自Write-Host 的任何输出,并且没有任何内容进入 CSV——尽管如果它不存在,它会创建它。

我尝试将 else 语句更改为 elseif($user.sAMAccountName -eq $newPre2K),结果是一样的:Write-Host 中没有任何内容,CSV 中没有任何内容。我已经尝试完全删除Try...Catch 以及将其放在初始if 中,但仍然没有任何变化。我尝试将Write-Host/Export-CSVWrite-Output/Out-File 交换,但这也没有给我任何帮助。

如果有人能帮我找出我所犯的可能非常明显的错误,对于else/elseif 声明和Write-Host/Export-CSV 部分,我将不胜感激。

【问题讨论】:

  • Write-Host 默认不输出到成功流。因此,没有任何内容可以通过管道传输到 Export-Csv
  • 您的错误在这里$user.sAMAccountName = $newPre2K。试试这个Set-ADUser -Identity $user -SamAccountName $newPre2K
  • @SantiagoSquarzon 查看我发布的答案;代码完全按照我的预期工作; else 声明“不起作用”的原因纯粹是用户错误。
  • 我很确定你会通过尝试$user.sAMAccountName = $newPre2K 得到一个System.Management.Automation.RuntimeException 例外,但适合你自己。
  • 否定。当我说代码按预期工作时,我的意思是它可以正常工作。只要我不破坏自己,就是这样。但是,出于好奇,什么会导致该错误发生?这是您的猜测,还是您自己尝试做类似的事情并得到了错误?

标签: powershell if-statement active-directory try-catch


【解决方案1】:

我是对的,很明显我错过了一些东西。

当我针对自己的帐户测试代码时,我在$users = Get-ADObject -Filter * ...-Filter 参数中指定了自己。然而,else 声明“不起作用”的原因纯粹是因为我没有在参数中更改我的 sAMAccountName 以反映它已被更改的事实,所以它正在寻找一个没有存在。显然,如果您明确告诉它要查找的内容已不存在,则程序无法告诉您是否已经更改了某些内容。

至于Write-Host/Export-CSV 部分,我刚刚用Write-Output/Out-File 再次做了一遍,现在它可以工作了。以前没有,所以我一定是搞砸了,但我不确定是什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 2016-06-28
    • 2018-06-14
    • 2019-06-19
    • 2017-07-18
    • 2010-10-17
    • 2012-11-25
    相关资源
    最近更新 更多