Powershell - 根据 JSON 文件更新 Active Directory 中的属性

Powershell - update attributes in Active Directory based on JSON file

这是我的 json 文件的提取:

[
    {
        "ProductionSubfolders": "XYZ",      
        "ProductionSubfoldersDN": "OU=XYZ,DC=bla,DC=root,DC=local"
    }
]

ProductionSubfolders = 值是 Active Directory 中组织单位的名称

ProductionSubfoldersDN = 值是组织单位的关联可分辨名称

我想为 json 文件中列出的组织单位的名为“描述”的 Active Directory 属性添加条目 - 在本例中为“ABC”和“XYZ”。

Active Directory 中属性“description”的新值应该是“Test + OU 的名称”,所以在这种情况下:“Test-ABC”和“Test-XYZ”。

这是我的:

$json = Get-Content "C:\prod.json" |ConvertFrom-JSON


foreach ($item in $json) {
    
    foreach {$item1 in $item.ProductionSubfoldersDN} {
       $name = $item.ProductionSubfolder
       $p= Get-ADOrganizationalUnit -Identity $item1 -Properties description| Select description
       if ($p.description -notlike "*Test*") {Set-ADObject -Identity $item1 -Add 
       @{description="Test-$name}
    }
}

有效。对于 OU“ABC”,在 AD 中有一个新的描述属性值,对于 OU“XYZ”,在 AD 中也是一个新的描述属性值。 但是属性的名称是错误的。对于两个 OU,它都是“Test-ABCXYZ”,而不是 OU“ABC”的“Test-ABC”和 OU“XYZ”的“Test-XYZ”。

我知道这是因为 $item.ProductionSubfolder 包含两个名称:“ABC”和“XYZ”。但我不知道如何更改它,如何分隔名称并将它们正确匹配到关联的 ProductionSubfolderDN。

提前致谢!!

解决link子文件夹的值到子文件夹DN:

foreach ($item in $json)
{
    foreach ($name in $item.ProductionSubfolders)
    {
        foreach($ou in $item.ProductionSubfoldersDN)
        {
            if ($ou -like 'OU=' + $name + '*')
            {
                $n = 'Test-{0}' -f $name
                
                $name + ' is inside ' + $ou;
                $ou;
                $n;
                #Set-ADOrganizationalUnit $ou -Description $n
            }
        }   
    }
}


ABC is inside OU=ABC,DC=bla,DC=root,DC=local
OU=ABC,DC=bla,DC=root,DC=local
Test-ABC
XYZ is inside OU=XYZ,DC=bla,DC=root,DC=local
OU=XYZ,DC=bla,DC=root,DC=local
Test-XYZ

我使用不区分大小写的 like 测试 OU 是否包含来自子文件夹的 OU 名称(使用 clike 区分大小写)

无论 OU 的顺序如何,此解决方案都有效..

您的 Json 由 2 个属性组成,并且它们都是数组,您可以 正确地 迭代它们的方法是使用 for 循环.我个人认为使用这种对象来更新 AD 对象不是一个好主意,但您可以按照以下方法进行操作。

首先您需要获取数组中元素的数量,然后使用 for 循环计算该数量:

$ErrorActionPreference = 'Stop'
$count = $json.ProductionSubfoldersDN.Count

for($i = 0; $i -lt $count; $i++) {
    $dn = @($json.ProductionSubfoldersDN)[$i]
    $description = 'Test-{0}' -f @($json.ProductionSubfolders)[$i]
    try {
        Set-ADOrganizationalUnit $dn -Description $description
    }
    catch {
        Write-Warning $_.Exception.Message
    }
}

以上代码假定您的 Json 的属性将具有相同的计数($json.ProductionSubfoldersDN.Count 必须等于 $json.ProductionSubfolders.count)。