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

时间:2015-01-05 03:45:50

标签: powershell batch-file

是否可以使用dsmod computer设置netbootmachinefilepath

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

似乎dsmod是我唯一的希望,但它只有一些你可以改变的属性。

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

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

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

中看到的那样

1 个答案:

答案 0 :(得分:1)

以下是使用ADSI清除属性netbootMachineFilePath的示例。

在此示例中,我们将首先在给定域中找到计算机对象,然后我们将检索netbootMachineFilePath的值。如果不清楚,我们将使用方法PutEx,第一个参数设置为1,这意味着清除。然后我们将修改后的对象保存在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但是正如您所提到的,那里没有记录PutEx和SetInfo,为此,您需要查看herehere

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

其他修改

我想我明白属性被“删除”的部分是怎么回事。 事实上,该属性不会从AD中删除,只有在通过搜索机制或IADs :: Get和GetEx方法检索时才可用。 GetEx实际上返回The directory property cannot be found in the cache.

该属性仍然存在,并已清除,您可以通过ADSIEdit查看。

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

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

返回:The directory property cannot be found in the cache.

但是,我可以在该属性中设置一些内容:

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

这样可行,该属性在ADSIEdit中更新并可见。进一步搜索或调用上面的代码清除它,就可以找到它。