我想在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);
答案 0 :(得分:1)
当服务作为本地系统运行时,它将在主机计算机帐户的安全上下文中访问网络(并由此访问AD)。您可以委派计算机帐户(或更好的计算机所属的组)从AD中删除对象的功能。此链接提供有关如何完成该任务的准确建议-http://sigkillit.com/2013/06/12/delegate-adddelete-computer-objects-in-ad/
虽然不是您的要求,但还有其他几件事对我很重要:
您对搜索的过滤效果不是很好。您可能会得到想要返回的其他东西。我建议改用这样的过滤器:(&(objectClass=computer)(sAMAccountName=<PCName>$))
本地系统有很多访问权限。您可以将其作为网络服务运行吗?