2016-04-14 84 views
2

ドメインに接続されておらず、モジュールもなく、PS 2.0を実行しているリモートコンピュータでPowershellを実行しています。Active DirectoryからAD-Computerをリモートで削除する方法 - Powershell

私のドメインのActive Directoryに連絡して、このコンピュータのエントリがあるかどうかを確認します。はいの場合は、そのエントリを削除します。

ADSI経由でコンピュータの存在を確認するのは簡単です。ただし、削除は何とか機能しません。ここで

は、これまでの私のコードです:

# Variables 
$domain = "Test.com" 
$Ldap = "LDAP://$domain" 
$Global:AdsiSearcher = $Null 

# Function to Delete PC 
Function DeleteThisPc() 
{ 
    $CurrentSearch = $Global:AdsiSearcher 
    $One = $CurrentSearch.FindOne() 
    $OPath = [adsi]$One.Path 
    $OPath.psbase.DeleteTree() 

問題はここにあります。 $ OPathのタイプはSystem.DirectoryServices.DirectoryEntryで、プロパティリストにはすべてのプロパティが表示されますが、オブジェクトを削除することはできません。

例外 "0" 引数(複数可)と "DeleteTree" を呼び出す:「ログオン失敗:。 不明なユーザー名またはパスワードが間違っCで

:Domjoin1.1.ps1 \の\ TEMP:49文字:33 $ OPath.psbase.DeleteTree < < < <() CategoryInfo:NotSpecifiedは:(:) []、MethodInvocationException FullyQualifiedErrorId:DotNetMethodException

コード:

01問題は、エラー状態として明らかであるように思わにもかかわらず
# Function to get a ADSISearcher and set it to the global-AdsiSearcher 
Function ConnectAD() 
{ 
    $domain = new-object DirectoryServices.DirectoryEntry($Ldap,"$domain\Bob",'1234') 
    $filter = "(&(objectCategory=computer)(objectClass=computer)(cn=$ComputerName))" 
    $AdsiSearch = [adsisearcher]"" 
    $AdsiSearch.SearchRoot = $domain 
    $AdsiSearch.Filter = $filter 
    $Global:AdsiSearcher = $AdsiSearch 
} 

# Main Function 
Function Sub_Check-ADComputer() 
{ 
    ConnectAD 
    $CurSearch = $Global:AdsiSearcher.findOne() 
    if($CurSearch -ne $null) 
    { 
     DeleteThisPc 
    } 
} 

# Start 
Sub_Check-ADComputer 

ログオン失敗:不明なユーザー名またはパスワードが間違っています。

ユーザー名とパスワードは、私が最初にADからオブジェクトを取得するのと同じものです。それで、うまくいく - deleteTree()にしようとすると、何とか資格をもう一度与えなければならないのですか?私はまた、オブジェクトが格納されたOUにユーザーフルコントロールを与えた

編集:

例外:

私はPS 3.0を別のマシン上でそれを行うと私は別のエラーメッセージが表示されます"0" 引数(複数可)と "DeleteTree" を呼び出す: "アクセスが拒否された ある(HRESULTからの例外:0x80070005(E_ACCESSDENIED))。"

答えて

2

問題が見つかりました。

invokeコマンドを使用する場合、変数は-argumentlistで指定されていない限り送信されません。私が発見したもう一つのアプローチは、私が今使っている、魅力のように働く次のものでした。

$domain = "DOMAINNAME" 
$AdUser = "$domain\JoinDom" 
$AdPW = "PASSWORD" 
$AdPass = convertto-securestring -string $AdPW -AsPlainText -Force 
$AdCred = new-object -typename System.Management.Automation.PSCredential -argumentlist $AdUser,$AdPass 
$ThisComputer = $Env:COMPUTERNAME 
$RetValue = $true 
Function CheckExist() 
{ 
    $ErrorActionPreference = ‘SilentlyContinue’ 
    $Ascriptblock = $ExecutionContext.InvokeCommand.NewScriptBlock("get-adcomputer $ThisComputer") 
    $Ret = Invoke-Command -ComputerName SERVERNAME -ScriptBlock $Ascriptblock -Credential $AdCred  
    $ErrorActionPreference = ‘Continue’ 
    return $Ret 
} 
$ExistBefore = CheckExist 
if($ExistBefore -ne $null) 
{ 
     $scriptblock = $ExecutionContext.InvokeCommand.NewScriptBlock("Remove-ADComputer $ThisComputer") 
     Invoke-Command -ComputerName SERVERNAME -ScriptBlock $scriptblock -Credential $AdCred 
     $ExistAfter = CheckExist 
     if($ExistAfter -ne $null){$RetValue = $false} 
} 
if($RetValue -ne $false) 
{ 
    Add-computer -domainname $domain -credential $Adcred -OUPath "OU=MyOU,DC=DOMAIN,DC=DE" 
    Restart-Computer -Force 
} 
1

ドメインコントローラを使用すると、ポーを活用することができ、Windows Server 2008またはそれ以降を実行している場合werShellセッションを使用してADSIを操作する必要がなくなりました。あなたはGet-ADComputerRemove-ADComputerを使用できるように

Enter-PSSession -ComputerName domaincontroller.test.com -Credential (Get-Credential) 

次に実行Import-Module ActiveDirectory: ただ、次のコマンドを実行します。

+1

これは非常に良いアプローチのようです。私のドメイン管理者アカウントを使用して、これでドメイン外からスクリプトをリモートで実行することができました。ありがとうございました! - 私が作成したサービスアカウントを使用すると、それでも "アクセスが拒否されました"という問題が残っています。万が一、サービスアカウントがこのようなスクリプトを実行するために必要なグループまたは権利を知っていますか? – Asharon

+1

サービスアカウントには、関連する組織単位のコンピュータオブジェクトの作成/削除が必要です。 「Active Directoryユーザーとコンピュータ」管理コンソールの「コントロールウィザードの委任」を使用できます。 https://technet.microsoft.com/en-us/library/cc732524.aspx – Christophe

関連する問題