【问题标题】:delete/clear AD attribute value if attribute contains value like val*如果属性包含像 val* 这样的值,则删除/清除 AD 属性值
【发布时间】:2022-02-17 17:31:00
【问题描述】:

美好的一天!

我想清除名为 aaccountroles 的 AD 属性的特定值 像这样的概念: 如果此属性“aaccountroles”包含以“S4P any”开头的值,这意味着 S4P*,它应该删除这样的值

AD 中属性的屏幕

导入-csv-路径 .\test.csv | foreach{Set-ADUser $_.sAMAccountName -Clear aaccountroles}

此脚本清除所有值,但我想清除特定值 我的 test.csv 文件

我尝试创建这个脚本:

导入-csv-路径 .\test.csv | foreach{Set-ADUser $_.sAMAccountName -Clear @{aaccountroles="S4P*"}

但它给出了一个错误

Set-ADUser : 指定的目录服务属性或值不存在 参数名称:System.Collections.Hashtable 在 line:1 char:39

  • ... v | foreach{Set-ADUser $_.sAMAccountName -Clear @{aaccountroles="S ...
  •             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    • CategoryInfo : InvalidArgument: (test.user1:ADUser) [Set-ADUser], ArgumentException
    • FullyQualifiedErrorId : ActiveDirectoryCmdlet:System.ArgumentException,Microsoft.ActiveDirectory.Management.Commands.SetADUser

【问题讨论】:

    标签: powershell active-directory


    【解决方案1】:

    Set-ADUser-Clear 参数需要 字符串字符串数组,而不是哈希表。

    您需要首先找到具有“S4P*”等属性的用户,如果找到则清除该属性:

    Import-Csv -Path .\test.csv | ForEach-Object {
        $user = Get-ADUser -Filter "SamAccountName -eq '$($_.sAMAccountName)' -and aaccountroles -like 'S4P*'" -Properties aaccountroles -ErrorAction SilentlyContinue
        if ($user) {
            Write-Host "Clearing the aaccountroles attribute for user $($user.Name)"
            $user | Set-ADUser -Clear aaccountroles
        }
    }
    

    -Remove-Add-Replace-Clear 与 Set-ADUser 一起使用,您必须使用 LDAP 显示名称。我更喜欢使用正确的 LDAP 大小写,所以如果该属性被称为 aaccountRoles(大写 R),在这里也可以这样做


    我不清楚您是否想完全清空该属性(如上所示)只是取出以“S4P”开头的项目..

    假设aaccountroles 是一个数组

    Import-Csv -Path .\test.csv | ForEach-Object {
        $user = Get-ADUser -Filter "SamAccountName -eq '$($_.sAMAccountName)' -and aaccountroles -like 'S4P*'" -Properties aaccountroles -ErrorAction SilentlyContinue
        if ($user) {
            $roles = @($user.aaccountroles | Where-Object { $_ -match '\S' -and $_ -notlike 'S4P*' })
            if ($roles.Count) {
                Write-Host "Removing the 'S4P*' aaccountroles items for user $($user.Name)"
                $user | Set-ADUser -Replace @{aaccountroles = [string[]]$roles}
            }
            else {
                Write-Host "Clearing the aaccountroles attribute for user $($user.Name)"
                $user | Set-ADUser -Clear aaccountroles
            }
        }
    }
    

    假设该属性是一个多行字符串,而不是一个数组,你可以这样做:

    Import-Csv -Path .\test.csv | ForEach-Object {
        $user = Get-ADUser -Filter "SamAccountName -eq '$($_.sAMAccountName)' -and aaccountroles -like 'S4P*'" -Properties aaccountroles -ErrorAction SilentlyContinue
        if ($user) {
            # split the multiline string into an array and filter out the items that do not start with 'S4P'
            $roles = @($user.aaccountroles -split '\r?\n' | Where-Object { $_ -match '\S' -and $_ -notlike 'S4P*' })
            if ($roles.Count) {
                Write-Host "Removing the 'S4P*' aaccountroles items for user $($user.Name)"
                # rejoin the left over array items into a multiline string
                $newRoles = $roles -join [environment]::NewLine
                $user | Set-ADUser -Replace @{aaccountroles = $newRoles}
            }
            else {
                Write-Host "Clearing the aaccountroles attribute for user $($user.Name)"
                $user | Set-ADUser -Clear aaccountroles
            }
        }
    }
    

    【讨论】:

    • 你好,西奥,我们这里不显示 sAMAccountName 吗?该脚本如何从 csv 文件中找到 sAMAccountName?
    • @Jonibek 对不起,忘了这一切。现在编辑答案。
    • 感谢您的回答,但您的脚本清除了所有值 我想清除的不是所有值,而是以 S4P* 开头的特定值
    • @Jonibek 请看我的编辑
    • 我收到此错误:Set-ADUser:无法验证参数“替换”上的参数。参数为 null 或参数集合的元素包含 null 值。在 line:6 char:37 + ... $user | Set-ADUser -Replace @{aaccountroles = [string[]]$roles} + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~ + CategoryInfo : InvalidData: (:) [Set-ADUser], ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.ActiveDirectory.Management.Commands.SetADUser
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多