是否可以使用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
答案 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,为此,您需要查看here和here。
最后,作为参数传递的值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中更新并可见。进一步搜索或调用上面的代码清除它,就可以找到它。