使用 dsmod 将 netbootmachinefilepath 属性设置为空白

Using dsmod To Set netbootmachinefilepath Attribute To Blank

是否可以使用dsmod computer设置netbootmachinefilepath

我无法使用 ActiveDirectory commandlet,System.DirectoryServices.DirectoryEntry 不允许我清除该值,它只允许我删除属性(请参阅 Powershell - Unable to retrieve active directory attribute after clearing it)。

似乎 dsmod 是我唯一的希望,但它只有几个您可以更改的属性。

更新: 似乎此属性可以为非空白或已删除(不能为空白)。 我必须弄清楚如何在 "cleared" 之后重新创建该属性。 当我使用 Active Directory GUI 清除该值然后使用 Powershell 读取该值时,它说该属性不存在。因此,我无法使用 Powershell 更新该值,因为它已被删除。但是我可以使用 AD GUI 来更新它。所以从逻辑上讲,当我 "update" 它时,GUI 实际上必须重新创建属性。

更新: 我错误地认为 $result.Properties.Contains("netbootmachinefilepath") = false 意味着该属性不存在。 $result.Properties.Contains("netbootmachinefilepath") 如果属性存在且其值为 null,则等于 false。

System.DirectoryServices.DirectoryEntry 会让我清除一个值,而不是删除它,就像我在另一个 post

中看到的那样

这是一个使用 ADSI 的示例,它将清除属性 netbootMachineFilePath

在此示例中,我们将首先在给定域中找到计算机对象,然后我们将检索 netbootMachineFilePath 的值。如果不清楚,我们将使用第一个参数设置为 1 的方法 PutEx,这意味着清除。然后我们将修改后的对象保存在AD中。

function Clear-NetbootMachineFilepath
{
    param([Parameter(Mandatory=$true)] [string]$Domain,
          [Parameter(Mandatory=$true)] [string]$Computer
         )

    $obj = $domain.Replace(',','\,').Split('/')
    $obj[0].split(".") | ForEach-Object { $domainDN += ",DC=" + $_}
    $domainDN = $domainDN.Substring(1)

    $ldap = "LDAP://"+ $domainDN
    try
    {
        $search = New-Object System.DirectoryServices.DirectorySearcher([ADSI]($ldap))      
        $search.Filter = "(&(objectCategory=computer)(cn=$Computer))"
        $search.PropertiesToLoad.Add("netbootmachinefilepath") |Out-Null
        $result = $search.FindOne()
    }
    catch
    {
        write-error $_.Exception.Message 
    }

    $ADS = [string]$result.Properties["adspath"]
    $netboot = $result.Properties["netbootmachinefilepath"]
    if ($netboot -ne $null)
    {
        $machine = New-Object System.DirectoryServices.DirectoryEntry $ADS
        $machine.PutEx(1,'netbootMachineFilePath', "")
        $machine.setinfo()
    }
}


Clear-NetbootMachineFilepath mydomain.ad.local testcomputer

编辑

一些带有记录选项的参考资料:

可以找到 DirectoryEntry here however as you mentioned, PutEx and SetInfo are not documented there, for this, you need look here and here

最后,作为参数传递的值 1 是 Clear,如前所述 here。删除为 4.

额外编辑

我想我了解属性是 "deleted" 部分的情况。 事实上,该属性并未从 AD 中删除,只是在通过搜索机制或通过 IADs::Get 和 GetEx 方法检索时不可用。 GetEx 实际上 returns The directory property cannot be found in the cache.

属性还在,而且被清除了,通过ADSIEdit可以看到

我在清除上面代码中的 属性 后添加了几行:

        $machine = New-Object System.DirectoryServices.DirectoryEntry $ADS
        $machine.GetEx('netbootMachineFilePath')

这个returns:The directory property cannot be found in the cache.

不过,我可以在其中设置一些东西 属性:

        $machine = New-Object System.DirectoryServices.DirectoryEntry $ADS
        $machine.Put('netbootMachineFilePath', "Hello World")
        $machine.setinfo()

这有效,属性 已更新并在 ADSIEdit 中可见。进一步搜索或调用上面的代码清除它,都会找到它。