2017-08-01 57 views
0

尝试从我的Windows服务访问本地ActiveDirectory。如何以编程方式将此Active Directory作为LocalService访问?

我打算尝试使用LocalService来访问它,它在我以管理员身份在Visual Studio中运行它时起作用,但是当我将它作为实际服务运行时失败。

我需要以某种方式提供SecurityIdentifierDirectoryEntry吗?但是,只需要usernamepassword而不是SecurityIdentifier ...

var fqhn = System.Net.Dns.GetHostEntry(Environment.MachineName).HostName; 
using (DirectoryEntry root = new DirectoryEntry(string.Format("LDAP://{0}/RootDSE", fqhn))) 
{ 
    string ctx = root.Properties["configurationNamingContext"].Value.ToString(); 
    string path = string.Format("LDAP://{0}/CN=Microsoft Exchange,CN=Services,{1}", 
           fqhn, ctx); 
    var blah = new DirectoryEntry(path); 
} 

它给我 System.DirectoryServices.DirectoryServicesCOMException (0x80072030): There is no such object on the server.,我试图在这两个LocalServiceNetworkService运行的服务。

+0

LocalService和NetworkService都没有权限连接到您的活动目录,因为它们是本地计算机帐户。你可以尝试'System',它将使用AD中的计算机账号,但是你真的应该以AD用户身份运行你的服务,这样你就可以只分配需要的权限。 – Ashigore

+0

嗡嗡声...新的C#在这里,所以没有办法使用系统帐户来阅读AD?我真的想避免创建新用户。在“Active Directory用户和计算机>用户”中,如果我通过“委托控制向导”添加了“网络服务”或“本地服务”,是否可行? – codenamezero

+0

不,因为包括计算机和AD服务器在内的每台计算机都有自己的网络和本地服务帐户。你为什么不想创建一个用户?无论哪种方式,您的计算机上唯一可以访问AD中的内容的帐户是系统(计算机)帐户。 – Ashigore

回答

1

其实,它看起来像我使用错误的地址访问ActiveDirectory。在我的本地机器上,我用的是:

System.Net.Dns.GetHostEntry(Environment.MachineName).HostName; 

但我应该使用代替:

Environment.UserDomainName 

让我有种发的情况下,回退方法的域不存在。 ..

string domain = Environment.UserDomainName; 
if (String.IsNullOrEmpty(domain)) 
    domain = System.Net.Dns.GetHostEntry(Environment.MachineName).HostName; 

现在连接到LDAP作品:

new DirectoryEntry(string.Format("LDAP://{0}/RootDSE", domain) 

只是为了证实@Harry Johnston在其他答复中说过,使用NetworkService工作! (我回到LocalService只是为了确保它和我失败)