使用 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 中可见。进一步搜索或调用上面的代码清除它,都会找到它。
是否可以使用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 中可见。进一步搜索或调用上面的代码清除它,都会找到它。