如何从Active Directory远程删除AD计算机 - Powershell

时间:2016-04-14 08:28:47

标签: powershell active-directory ldap adsi

我在远程计算机上运行Powershell,该计算机未连接到域,没有任何模块并且正在运行PS 2.0。

我想联系我的域名的Active Directory,检查此计算机是否有条目;如果是,请删除该条目。

通过ADSI检查AD是否容易存在。但是删除不会以某种方式工作。

到目前为止,这是我的代码:

# 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:\ TEMP \ Domjoin1.1.ps1:49 char:33 $ OPath.psbase.DeleteTree<<<< ()   CategoryInfo:NotSpecified:(:) [],MethodInvocationException   FullyQualifiedErrorId:DotNetMethodException

代码:

# 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上提供了用户FullControl。

编辑:

当我在使用PS 3.0的另一台机器上执行此操作时,我得到一条不同的错误消息:

  

使用“0”参数调用“DeleteTree”的异常:“访问是   否认。 (来自HRESULT的异常:0x80070005(E_ACCESSDENIED))“

2 个答案:

答案 0 :(得分: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 :(得分:1)

如果您的域控制器运行Windows Server 2008或更高版本,您可以利用PowerShell会话来避免使用ADSI。 只需运行以下命令:

var xhttp = new XMLHttpRequest();
var promise = $q.defer();

xhttp.upload.addEventListener("progress",function (e) {
    promise.notify(e);
});
xhttp.upload.addEventListener("load",function (e) {
    promise.resolve(e);
});
xhttp.upload.addEventListener("error",function (e) {
    promise.reject(e);
});

xhttp.open("post",API_URL + requestParams.url,true);

xhttp.send(requestParams.data);

return promise.promise;

然后运行Enter-PSSession -ComputerName domaincontroller.test.com -Credential (Get-Credential) 以允许您使用Import-Module ActiveDirectoryGet-ADComputer