Рефакторинг сценария LDAP / AD с VBS на C # - PullRequest
1 голос
/ 23 августа 2011

Мне нужно реорганизовать VBS, работающий с LDAP, ADODB и ActiveDirectory, с VBS на C #.Часть, которую я застрял, соединяет (только начинается и уже застряла ... здорово).Это оригинальный источник

Set objRootDSE = GetObject("LDAP://RootDSE")
strConfig = objRootDSE.Get("configurationNamingContext")
strDNSDomain = objRootDSE.Get("defaultNamingContext")

Set adoCommand = CreateObject("ADODB.Command")
Set adoConnection = CreateObject("ADODB.Connection")
adoConnection.Provider = "ADsDSOObject"

adoConnection.Open "Active Directory Provider"
adoCommand.ActiveConnection = adoConnection

strQuery = "<LDAP://dm1.com.local/OU=CN,OU=Users,OU=CMS Organizational,OU=CMS_Users_and_Groups,DC=cms,DC=local>;(&(objectCategory=person)(objectClass=user)(!useraccountcontrol:1.2.840.113556.1.4.803:=2));distinguishedName,lastLogon,whenCreated;subtree"

adoCommand.CommandText = strQuery
adoCommand.Properties("Page Size") = 100
adoCommand.Properties("Timeout") = 60
adoCommand.Properties("Cache Results") = False

Set adoRecordset = adoCommand.Execute

И C # выглядит так

DirectoryEntry dse = new DirectoryEntry("LDAP://RootDSE");
string config = dse.Properties["configurationNamingContext"].Value.ToString();
string domain = dse.Properties["defaultNamingContext"].Value.ToString();
Connection connection = new Connection();
connection.Provider = "ADsDSOObject";
connection.Open("ADsDSOObject", "", "", 0);

object records, parameters = "";

ADODB.Command command = new Command();
command.ActiveConnection = connection;
command.CommandText = "<LDAP://dm1.com.local/OU=CN,OU=Users,OU=CMS Organizational,OU=CMS_Users_and_Groups,DC=cms,DC=local>;(&(objectCategory=person)(objectClass=user)(!useraccountcontrol:1.2.840.113556.1.4.803:=2));distinguishedName,lastLogon,whenCreated;subtree";
command.Execute(out records, ref parameters, 0);

Это дает мне ошибку

Interface not supported (Provider)
 at ADODB.CommandClass.Execute(Object& RecordsAffected, Object& Parameters, Int32 Options)
at Adug.Program.Main(String[] args) in E:\...\Program.cs:line 66

Ответы [ 2 ]

4 голосов
/ 23 августа 2011

У меня нет опыта работы с LDAP через ADO, но я успешно использовал следующий код (здесь упрощенно), в котором используется DirectorySearcher:

DirectoryEntry directoryEntry = new DirectoryEntry(
      config.DirectoryConnectionString, 
      config.ActiveDirectoryUserName, 
      config.GetPassword(), 
      AuthenticationTypes.Secure);
DirectorySearcher ds = new DirectorySearcher(directoryEntry);

ds.PropertiesToLoad.Add("cn");
ds.PropertiesToLoad.Add("sAMAccountName");
ds.PropertiesToLoad.Add("mail");
ds.PropertiesToLoad.Add("displayName");

ds.Filter = "(objectClass=user)";

foreach (SearchResult result in ds.FindAll())
{
    string displayName = String.Empty;
    DirectoryEntry entry = result.GetDirectoryEntry();
    if (entry.Properties.Contains("displayName"))
            if (entry.Properties["displayName"].Count > 0)
                displayName  = entry.Properties["displayName"][0].ToString();
}
0 голосов
/ 24 августа 2011

Использование пространства имен System.DirectoryServices является предпочтительным способом доступа к Active Directory в .NET. Даниэль B ответ должен заставить вас двигаться в правильном направлении.

...