2015-01-05 37 views
0

是否可以使用dsmod computer來設置netbootmachinefilepath使用dsmod將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意味着該屬性不存在。如果該屬性存在且其值爲空,則$result.Properties.Contains("netbootmachinefilepath")等於false。

System.DirectoryServices.DirectoryEntry讓我明確的值,而不是刪除它在看到我的其他post

+0

您可以使用[ADSI](http://social.technet.microsoft.com/wiki/contents/articles/4231.working-with-active-directory-using-powershell-adsi-adapter.aspx)適配器代替?使用LDAP搜索對象,然後將該屬性設置爲$ null或某種其他值?爲什麼你需要先清除它,你還在做其他事情嗎? – Matt

+0

我想要做的就是將netbootmachinefilepath設置爲空,就是這樣。我會看看你正在談論的ADSI事情。謝謝。 –

+0

嗨馬特,ADSI也幫不了我。我試着把第一個參數等於1的PutEx清除它,但是刪除了這個屬性。我試圖用2來更新它與一個空字符串,但是會引發異常。 –

回答

1

下面是使用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但正如你所說,PutEx和SetInfo沒有記錄都在這裏,對於這一點,你需要看看herehere

最後,作爲參數傳遞的值爲1,如前所述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中可見。進一步搜索或調用上面的代碼來清除它,會發現它。

+0

嗨米奇,刪除屬性,而不是清除它。 –

+0

另外我看不到任何用於System.DirectoryServices.DirectoryEntry的PutEx()或SetInfo()方法? –

+0

看起來像PutEx()和SetInfo()正在工作,因爲它們不會引發異常,並且它確實刪除了屬性,只是想知道爲什麼它們沒有記錄在msdn上。 –