C#删除在Windows服务上运行的AD计算机帐户

时间:2018-08-28 00:57:09

标签: c# active-directory windows-services directoryservices domaincontroller

我想在Windows服务应用程序中编写一个函数,以从Active Directory中删除给定的计算机名称。

Windows服务正在域连接到DC的计算机上运行。目前,我已使用域管理员帐户登录到此计算机。

Windows服务在“ NT AUTHORITY / SYSTEM”的安全上下文下运行,不应更改此设置,因为在安装应用程序后不应进行任何用户交互,这意味着管理员不应在其中输入其凭据服务。

当我使用新添加的代码运行该应用程序以删除计算机帐户时,它不起作用。但是,当我更改Windows服务上的登录信息并使用域管理员凭据对其进行更新时,它便能够从AD中成功删除计算机帐户。

下面是用于删除计算机帐户的功能的简化版本。

有什么办法可以修改代码以使用相同的安全上下文(NT AUTHORITY / SYSTEM)删除计算机帐户?

private void DeleteComputerAccount(string CompName, DirectoryEntry DirEntry)
{
    try
    {
        //Delete computer account
        DirectorySearcher search = new DirectorySearcher(DirEntry, "(name=" + CompName + ")");
        SearchResult res = search.FindOne();
        res.GetDirectoryEntry().DeleteTree();
    }
    catch (Exception)
    {
        Throw();
    }
}

DeleteComputerAccount的位置:

DirectoryEntry dirEntry = new DirectoryEntry("LDAP://domain.contoso.com");

string compName = "MyWorkstation01";
DeleteComputerAccount(compName, dirEntry);

1 个答案:

答案 0 :(得分:1)

当服务作为本地系统运行时,它将在主机计算机帐户的安全上下文中访问网络(并由此访问AD)。您可以委派计算机帐户(或更好的计算机所属的组)从AD中删除对象的功能。此链接提供有关如何完成该任务的准确建议-http://sigkillit.com/2013/06/12/delegate-adddelete-computer-objects-in-ad/

虽然不是您的要求,但还有其他几件事对我很重要:

  1. 您对搜索的过滤效果不是很好。您可能会得到想要返回的其他东西。我建议改用这样的过滤器:(&(objectClass=computer)(sAMAccountName=<PCName>$))

  2. 本地系统有很多访问权限。您可以将其作为网络服务运行吗?