Pergunta

Procurando um exemplo de conexão via ADODB ao Active Directory usando C#.

Meu objetivo é ser capaz de executar uma pesquisa para verificar se um usuário é válido no Active Directory com base nos atributos desse usuário (ID do usuário, endereço de e-mail, etc.).

[Gostaria de enfatizar que usar ADODB é um requisito para isso, usar DirectoryServices não é uma resposta válida.]

Minha abordagem atual não está funcionando (exceto no bit cmd.Execute):

object parms = null;
object recs = null;
ADODB.Connection conn = new ADODB.Connection();
ADODB.Command cmd = new ADODB.Command();
ADODB.Recordset rs = new ADODB.Recordset();

conn.Open("Provider=ADsDSOObject",obfsUser,obfsPass,0);

cmd.ActiveConnection = conn;
cmd.CommandText = "<LDAP://OU=obfsOU,DC=obfsDC,DC=corp,DC=Net>;;name;subtree";
rs = cmd.Execute(out recs, ref parms, 0);

Não tenho certeza se/onde devo fornecer a referência do servidor e não tenho certeza de quais deveriam ser os parâmetros passados ​​​​para o método cmd.Execute por ref.Não há muita documentação disponível para conexão ao ActiveDirectory a partir de C# via ADODB.

conn.State está retornando 1, então acredito que estou obtendo uma conexão ativa.Acho que o problema está nos parâmetros passados ​​para o método cmd.Execute().

Foi útil?

Solução 2

Isso funciona.

Espero que isso ajude alguém com as mesmas necessidades e problemas que eu tive.

[Observe a falta de um objeto ADODB.Command e o uso do formato SQL para a consulta em vez do formato ADSI.]

object recs;

ADODB.Connection conn = new ADODB.Connection();
ADODB.Recordset rs = new ADODB.Recordset();

// You may need to provide user id and password instead of empty strings        
conn.Open("Provider=ADsDSOObject", "", "", 0);

// replace <> elements with your server name and OU/DC tree org
string server = "<enter your server name here>";
string start = "OU=<blah>,DC=<blah>,DC=<blah>,DC=<blah>";
string where = "objectClass = '*'";
string qry = string.Format("SELECT cn FROM 'LDAP://{0}/{1}' WHERE {2}", server, start, where);

rs = conn.Execute(qry, out recs, 0);

for (; !rs.EOF; rs.MoveNext())
{
    Console.WriteLine(rs.Fields["cn"].Value.ToString());
}

Outras dicas

A resposta de ScottCher funciona, mas tem limitações, principalmente que você não pode lidar com o limite de 1.000 resultados de registros.Para fazer isso, o apenas A maneira é usar um objeto Command e, acredite, isso é um campo minado porque (a) não há boa documentação sobre as interfaces C# e (b) não há incrivelmente nenhuma solução completa que possa ser pesquisada no Google até o momento em que este livro foi escrito.

Passei os últimos dias nisso e tenho algo funcionando que gostaria de devolver a todas as fontes que li com vários pedaços do quebra-cabeça.

Primeiro, como observado em vários lugares (infelizmente apenas com exemplos de VB!), se você não fizer algo especial, todas as consultas ADSI serão limitadas a 1.000 linhas de resultados.A chave para evitar isso é definir a propriedade “Tamanho da página” no objeto Command.Chegaremos a isso em um segundo, mas primeiro precisamos fazer a consulta básica funcionar usando um comando.Se você usar o código original neste tópico, receberá uma exceção no cmd.Execute reclamando sobre incompatibilidade de parâmetros.Você pensaria que passar null como o objeto ref seria suficiente, especialmente porque a sintaxe LDAP (aparentemente) não possui parâmetros.

Encontrei a resposta para isso em dois lugares.Primeiro, mesmo que você não esteja especificando parâmetros explicitamente, parece que ":" na sintaxe SQL do LDAP é suficiente para fazer o ADO pensar que os parâmetros são necessários.Estranho, mas aparentemente verdade.Segundo, a maneira CORRETA de especificar o caso "sem parâmetros" é definir o valor como Type.Missing, não nulo, como em:

object parms = Type.Missing;

Essa foi a chave para fazer com que Execute não lançasse uma exceção.

Agora, com um comando funcional, podemos resolver o limite de 1.000 linhas.Isso é "simplesmente" especificando a propriedade "Tamanho da página" no comando, mas, como é óbvio na interface C#, não é o mesmo que uma propriedade C#.Você precisa colocá-lo na coleção Properties, mas isso não expõe uma interface de coleção agradável para fazer isso.Após algumas tentativas e erros, a sintaxe correta é:

cmd.Properties["Page Size"].Value = 500;

Não acho que seja importante saber exatamente qual é o tamanho da página (ainda estou brincando com isso), mas defini-lo como algo é suficiente para dizer ao ADSI para obter todos os resultados.E espero sinceramente que isso ajude alguém.

Confira o site de Richard Mueller no Active Directory - ele tem especificamente uma página sobre ADO Search Tips for AD:

http://www.rlmueller.net/ADOSearchTips.htm

Há também uma série de excelentes materiais de referência em seu site, como planilhas Excel com todas as propriedades do AD e suas características.

Altamente recomendado!

Marco

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top