【问题标题】:Powershell Loops - New to PowershellPowershell 循环 - Powershell 的新功能
【发布时间】:2020-12-01 07:16:32
【问题描述】:

每个人。对于熟悉 Powershell 而我没有经验的人来说,这个问题将是一个简单的答案。

由于无意的原因,我们有大量用户在其帐户上更改了某个属性 (adminCount)。我希望清除此属性而不是 1,并找到了执行此操作的脚本:

set-aduser <username> -remove @{adminCount=1}

$user = get-aduser <username> -properties ntsecuritydescriptor

$user.ntsecuritydescriptor.SetAccessRuleProtection($false,$true)

set-aduser <username> -replace @{ntsecuritydescriptor=$user.ntsecuritydescriptor}

我现在需要做的是为某个 OU(有数千个)中的每个用户运行此命令。如果有人能帮我想出一个如下所示的循环,我将不胜感激:

For each user in (Certain Searchbase/OU)
     Run script

提前谢谢大家!

编辑:目前,我有以下但担心测试它,因为我是一个 Powershell 菜鸟,我现在只有一个生产环境:

$users = Get-ADUser -ldapfilter “(objectclass=user)” -searchbase “ou=companyusers,dc=enterpriseit,dc=co”
ForEach($user in $users)
{
set-aduser $user -remove @{adminCount=1}

$user = get-aduser $user -properties ntsecuritydescriptor

$user.ntsecuritydescriptor.SetAccessRuleProtection($false,$true)

set-aduser $user -replace @{ntsecuritydescriptor=$user.ntsecuritydescriptor}

 
}

【问题讨论】:

  • 如果你担心,那就测试一下吧!如果您只有一个环境,请至少创建一个独立的 OU 并对其进行测试。
  • 我在下面的示例中添加了 WhatIf 参数,您可以使用它来查看会发生什么操作而不是实际执行它,但我不会用它来代替正确的测试。跨度>

标签: powershell active-directory user-management windows-server-2019


【解决方案1】:

您可以在调用 Get-Aduser cmdlet 时使用 SearchBase 参数指定 OU。通过管道将其传送到 ForEach-Object cmdlet,然后执行您的操作。

注意:我将 $_ 变量分配给变量 $user 只是为了更清楚地演示,因为您提到您是 PS 新手。

Get-Aduser -Filter * -SearchBase 'OU=foo,OU=bar,DC=domain,DC=com' -properties ntsecuritydescriptor | 
ForEach-Object { 

$user = $_; 
Write-Host "Performing operations on: $($user.Name)"

# DO Stuff with the user identity. 

$user | Set-ADUser -Remove @{adminCount=1} -WhatIf

$user.ntsecuritydescriptor.SetAccessRuleProtection($false,$true)

$user | Set-ADUser -Replace @{ntsecuritydescriptor=$user.ntsecuritydescriptor} -WhatIf

}

【讨论】:

  • @WilliamBonanno - 像任何东西一样,在运行之前对其进行测试。
猜你喜欢
  • 2021-09-29
  • 1970-01-01
  • 2018-03-12
  • 1970-01-01
  • 2018-12-21
  • 1970-01-01
  • 2020-01-27
  • 2011-12-09
  • 1970-01-01
相关资源
最近更新 更多