Você está na página 1de 1567

Dê a sua opinião sobre a experiência de download do PDF.

Active Directory Service Interfaces


Artigo • 03/06/2023

Finalidade
ADSI (Interfaces de Serviço do Active Directory) é um conjunto de interfaces COM
usadas para acessar os recursos de serviços de diretório de diferentes provedores de
rede. O ADSI é usado em um ambiente de computação distribuída para apresentar um
único conjunto de interfaces de serviço de diretório para gerenciar recursos de rede.
Administradores e desenvolvedores podem usar serviços ADSI para enumerar e
gerenciar os recursos em um serviço de diretório, independentemente de qual ambiente
de rede contenha o recurso.

O ADSI permite tarefas administrativas comuns, como adicionar novos usuários,


gerenciar impressoras e localizar recursos em um ambiente de computação distribuído.

7 Observação

A documentação a seguir é para programadores de computador. Se você for um


usuário final tentando depurar um erro de impressão ou um problema de rede
inicial, consulte os fóruns da comunidade da Microsoft .

Quando aplicável
Os administradores de rede podem usar ADSI para automatizar tarefas comuns, como
adicionar usuários e grupos, gerenciar impressoras e definir permissões em recursos de
rede.

Fornecedores independentes de software e desenvolvedores de usuário final podem


usar ADSI para "habilitar o diretório" de seus produtos e aplicativos. Os serviços podem
se publicar em um diretório, os clientes podem usar o diretório para localizar os serviços
e ambos podem usar o diretório para localizar e manipular outros objetos de interesse.
Como as Interfaces de Serviço do Active Directory são independentes dos serviços de
diretório subjacentes, os produtos e aplicativos habilitados para diretório podem operar
com êxito em vários ambientes de rede e diretório.
Público de desenvolvedores
Você pode escrever aplicativos cliente ADSI em muitos idiomas. Para a maioria das
tarefas administrativas, o ADSI define interfaces e objetos acessíveis a partir de
linguagens compatíveis com a Automação, como Microsoft Visual Basic, Microsoft
Visual Basic Scripting Edition (VBScript) e Java para linguagens mais conscientes de
desempenho e eficiência, como C e C++. Uma boa base na programação COM é útil
para o programador ADSI.

Requisitos de tempo de execução


O Active Directory é executado em controladores de domínio do Windows Server. No
entanto, os aplicativos cliente que usam ADSI podem ser gravados e executados no
Windows. Além disso, os desenvolvedores desejarão o SDK (Platform Software
Development Kit), também disponível no site do MSDN. Para investigar o conteúdo do
Active Directory, use o snap-in Usuários e Computadores do Active Directory MMC. Esse
snap-in substitui a ferramenta Adsvw que estava disponível para versões anteriores do
Windows.

Nesta seção
Sobre ADSI

Informações gerais sobre ADSI.

Usando ADSI

Guia do programador para usar ADSI.

Tutoriais de início rápido do ADSI

Usando ADSI com Automação para gerenciar diretórios.

Referência ADSI

Documentação de interfaces e métodos ADSI.

Tópicos relacionados
O Component Object Model

Clientes e servidores COM


Active Directory Domain Services

Comentários
Esta página foi útil?  Yes  No
Tutoriais de início rápido das interfaces
de serviço do Active Directory
Artigo • 13/06/2023

Os Tutoriais de início rápido de ADSI (Interfaces de Serviço do Active Directory) são uma
série de exemplos ADSI e documentação de suporte projetada para familiarizá-lo com
os modelos de programação usados para acessar o Active Directory. Cada exemplo é
breve e se baseia nos exemplos anteriores. Os tutoriais incluem:

Configurando seu ambiente de desenvolvimento


Acessando o Active Directory usando o Visual Basic
Tutorial de script ADSI

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Configurando seu ambiente de
desenvolvimento
Artigo • 13/06/2023

Você pode acessar o ADSI de várias plataformas de desenvolvimento diferentes, como


Scripting, ASP, os sistemas de desenvolvimento Microsoft Visual Basic ou Visual C++ ou
qualquer outra linguagem compatível com Automação.

Para obter mais informações sobre como configurar um ambiente de desenvolvimento e


criar aplicativos ADSI básicos, consulte:

Introdução com Script para ADSI


Introdução com ASP para ADSI
Configurando o Visual Basic 6.0 para desenvolvimento adsi
Configurando o Visual C++ 6.0 para desenvolvimento adsi

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Introdução com Script para ADSI
Artigo • 12/06/2023

O script é útil para administradores do sistema que desejam criar scripts em lote para
tarefas usadas com frequência.

Para iniciar o script com ADSI, você deve ter um computador que execute o Windows ou
que esteja conectado a um domínio que contenha dados para contas de computador
no diretório.

Um exemplo de script simples: localizando


nomes e locais de contas de computador
Crie um novo arquivo de texto usando um editor de texto. O exemplo de código a
seguir mostra como localizar nomes e locais de contas de computador.

VB

'---------------------------------------------------------------
' Returns the name and location for all the computer accounts in
' Active Directory.
'---------------------------------------------------------------
Const ADS_SCOPE_SUBTREE = 2
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection
objCommand.CommandText = "Select Name, Location from
'LDAP://DC=fabrikam,DC=com' " & "where objectClass='computer'"
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Timeout") = 30
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
objCommand.Properties("Cache Results") = False
Set objRecordSet = objCommand.Execute
objRecordSet.MoveFirst
Do Until objRecordSet.EOF
Wscript.Echo "Computer Name: " & objRecordSet.Fields("Name").Value
Wscript.Echo "Location: " & objRecordSet.Fields("Location").Value
objRecordSet.MoveNext
Loop

Salve o arquivo como First.vbs. Modifique a linha que começa com


"objCommand.CommandText" para alterar o caminho para seu domínio. No prompt de
comando, digite cscript First.vbs para uma linha de comando ou First.vbs para scripts
do Windows. Os resultados devem ser retornados no prompt de comando.

Para obter mais informações sobre scripts para ADSI, consulte Scripts de Interfaces de
Serviço do Active Directory.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Introdução com ASP para ADSI
Artigo • 13/06/2023

ADSI pode ser usado para acessar dados de diretório usando uma página ASP. Essa
pode ser uma maneira conveniente de executar tarefas de administração e consultas de
uma página da Web ou fornecer informações aos funcionários em uma intranet.

Uma vantagem de usar ADSI com ASP é que você pode criar uma experiência de
usuário mais rica porque pode usar o Visual Basic para criar um aplicativo ADSI e
oferecê-lo a um usuário por meio de uma página da Web padrão. Por exemplo, você
pode criar uma página da Web que permite que os funcionários insiram o sobrenome
de um funcionário e obtenham um número de telefone para esse funcionário ou criem
um formulário que permita que os funcionários atualizem informações pessoais em um
banco de dados de recursos humanos da empresa.

O código ASP começa com '<%' e termina com '%>'. Você pode adicionar código ADSI
como VBScript ou Visual Basic.

Para criar uma página ASP, você pode usar um editor de página da Web, o Bloco de
Notas ou outro editor de texto ou o sistema de desenvolvimento .NET do Microsoft
Visual Studio.

Antes de executar sua página ASP, configure seu aplicativo ou servidor IIS de acordo
com as instruções encontradas em Problemas de autenticação para ADSI com ASP.

Um exemplo simples de ASP: enumerando


objetos em um contêiner
Usando um editor de página da Web, crie uma nova página html que aceite o nome
diferenciado de um objeto de contêiner. Insira o exemplo de código a seguir.

HTML

<html>
<body>

<form method="POST" action="https://localhost/Enum.asp" ID="Form1">


<p>Distinguished name of container:<input type="text" name="inpContainer"
size="100" ID="Text2"></p>
<p><input type="SUBMIT" value="GO" ID="Submit1" NAME="Submit1"></p>
</form>

</body>
</html>
Esta página agora pode aceitar um nome de contêiner que é passado para ele e usar
ADSI para enumerar objetos no contêiner.

Crie uma nova página ASP chamada Enum.asp e insira o exemplo de código a seguir.
Salve esta página na raiz do servidor Web local.

VB

<%@ Language=VBScript %>


<%
' Get the inputs.
containerName = Request.Form("inpContainer")
' Validate compName before using.

If Not ("" = containerName) Then


' Bind to the object.
adsPath = "LDAP://" & containerName
Set comp = GetObject(adsPath)

' Write the ADsPath of each of the child objects.


Response.Write("<p>Enumeration:</p>")
For Each obj in comp
Response.Write(obj.ADsPath + "<BR>")
Next
End If
%>

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Configurando o Visual Basic 6.0 para
desenvolvimento adsi
Artigo • 13/06/2023

Configurando o ambiente de desenvolvimento do Microsoft Visual Studio 2010 para


Visual Basic

1. Inicie o Visual Studio 2010.

2. Crie um novo projeto do Visual Basic.

3. Adicione uma referência à Biblioteca de Tipos de DS Ativo.

7 Observação

Se você não precisar de associação de objeto COM antecipada, ignore esta


etapa.

a. Selecione Projeto | Adicionar Referência.


b. Selecione a guia COM .
c. Selecione Biblioteca de Tipos DS Ativa.

4. Comece a programar com ADSI.

Antes de começar, faça logon em um domínio do Windows. Você deve ter permissão
para modificar o banco de dados do Active Directory. Por padrão, o Administrador tem
esse privilégio.

Um aplicativo visual básico de exemplo 6.0: modificando FullName e descrição para


um usuário

1. Siga as etapas anteriores para criar um projeto executável padrão do Visual Basic.

2. Clique duas vezes no Formulário. Em Form_Load, digite o seguinte. Você deve


substituir a cadeia de caracteres
"LDAP://CN=jeffsmith,CN=users,DC=fabrikam,DC=com" pelo ADsPath de um
usuário existente em um contêiner em seu domínio. Crie uma conta de usuário de
teste que possa ser modificada para essa finalidade.

VB
'------------------------------------------------------------
' This code example is used to set the FullName and Description
'------------------------------------------------------------
Dim usr As IADsUser

' Bind to a user object.


Set usr = GetObject("LDAP://CN=jeffsmith,CN=users,DC=fabrikam,DC=com")

usr.FullName = "Jeff Smith"


usr.Description = "A user for fabrikam.com"
usr.SetInfo ' Commit the changes to the directory

3. Pressione <F5> para executar o programa.

4. Para verificar as alterações, use a ferramenta de gerenciamento de Usuários e


Computadores do Active Directory. Para obter mais informações sobre como usar
ADSI e Visual Basic, consulte Acessando o Active Directory usando o Visual Basic.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Configurando o Visual C++ 6.0 para
desenvolvimento adsi
Artigo • 12/06/2023

O Microsoft Visual C++ sistema de desenvolvimento 6.0 pode ser usado para
desenvolver aplicativos empresariais. Para configurar seu ambiente do Visual C++ 6.0
para desenvolver um aplicativo ADSI, execute as seguintes etapas:

Configurando o ambiente de desenvolvimento do Microsoft Visual C++ 6.0

1. Aponte para o diretório incluir e biblioteca. Selecionar Ferramentas | Opções.


Clique na guia Diretório e especifique o caminho para os arquivos de cabeçalho
ADSI.
2. Inclua o arquivo Activeds.h em seu projeto.
3. Adicione os arquivos Activeds.lib e Adsiid.lib à entrada do vinculador do projeto.
4. Comece a programar com ADSI.

Faça logon em um domínio do Windows. Você também deve ter permissão para
modificar dados no Active Directory. Por padrão, o Administrador tem esse privilégio.
Para inserir este exemplo de código:

Um aplicativo visual C++ de exemplo: criando um usuário em um domínio

1. Inicie o Visual C++ 6.0.

2. Crie um projeto executável autônomo. Pode ser um aplicativo MFC, ATL ou


Console.

3. Siga as etapas anteriores para configurar seu projeto.

4. Insira o exemplo de código a seguir. Substitua a cadeia de caracteres


"LDAP://CN=users,DC=fabrikam,DC=com" pelo ADsPath de um contêiner em seu
domínio. Você também deve substituir o nome de usuário "jeffsmith" por um
nome de usuário exclusivo em seu domínio.

C++

#include "stdafx.h"
#include "activeds.h"

int main(int argc, char* argv[])


{
HRESULT hr;
IADsContainer *pCont;
IDispatch *pDisp=NULL;
IADs *pUser;

// Initialize COM before calling any ADSI functions or interfaces.


CoInitialize(NULL);

hr = ADsGetObject( L"LDAP://CN=users,DC=fabrikam,DC=com",
IID_IADsContainer,
(void**) &pCont );

if ( !SUCCEEDED(hr) )
{
return 0;
}

//-----------------
// Create a user
//-----------------

hr = pCont->Create(CComBSTR("user"), CComBSTR("cn=jeffsmith"),
&pDisp );

// Release the container object.


pCont->Release();

if ( !SUCCEEDED(hr) )
{
return 0;
}

hr = pDisp->QueryInterface( IID_IADs, (void**) &pUser );

// Release the dispatch interface.


pDisp->Release();

if ( !SUCCEEDED(hr) )
{
return 0;
}

// Commit the object data to the directory.


pUser->SetInfo();

// Release the object.


pUser->Release();

CoUninitialize();
}

5. Crie e execute o aplicativo. Para verificar se o usuário foi criado, use a ferramenta
de gerenciamento de Usuários e Computadores do Active Directory.
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Acessando o Active Directory usando o
Visual Basic
Artigo • 13/06/2023

Um dos recursos mais poderosos que ficaram disponíveis com o sistema operacional
Microsoft Windows 2000 é o serviço de diretório do Microsoft Active Directory. Quando
você faz logon em um domínio do Windows 2000, o Active Directory é colocado em
ação; para pesquisar a impressora colorida mais próxima em seu prédio, você pode usar
o Active Directory. Ele pode ser usado para uma pesquisa de catálogo de endereços ou
uma pesquisa de usuários que trabalham no edifício 40. Com o Active Directory, você
pode usar uma cartão inteligente para fazer logon em um domínio do Windows 2000.
Você pode até mesmo unir dados do software de banco de dados do Microsoft SQL
Server e do Active Directory.

Muitas outras tecnologias da Microsoft, como MSMQ (Microsoft Message Queue


Server), COM (Repositório de Classes), IPsec (Segurança de Protocolo de Internet), GPOs
(Objetos Política de Grupo) e Exchange são integradas ao Active Directory.

Esta seção discute como usar o ADSI (Active Directory Service Interfaces) para acessar o
Active Directory. Usando um cenário para uma empresa fictícia — a Fabrikam
Corporation — você aprenderá a executar algumas tarefas administrativas básicas.

À medida que você avança nesse cenário, os exemplos de código em cada seção se
baseiam em si mesmos.

Para resumir, todos os exemplos de código são escritos com o sistema de


desenvolvimento do Microsoft Visual Basic. Para obter mais informações sobre a
conversão do C++, consulte Mapeando ADSI Visual Basic Code para código C++.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Visão geral do tutorial: ADSI com Visual
Basic
Artigo • 03/06/2023

7 Observação

A documentação a seguir faz parte de uma descrição de cenário estendido para


desenvolvedores de Visual Basic. Se você estiver procurando uma visão geral do
Active Directory, consulte os documentos de Pro de TI no Technet. Para ver mais
detalhadamente o lado de desenvolvimento do Active Directory, consulte Active
Directory Domain Services. Para obter uma introdução maior às Interfaces de
Serviço do Active Directory, consulte o tópico pai deste tópico: Interfaces de
serviço do Active Directory, bem como o tópico irmão: Sobre interfaces de
serviço do Active Directory.

O Active Directory é um banco de dados de finalidade especial – não é uma substituição


do Registro. O diretório foi projetado para lidar com um grande número de operações
de leitura e pesquisa e um número significativamente menor de alterações e
atualizações. Os dados do Active Directory são hierárquicos, replicados e extensíveis.
Como ele é replicado, você não deseja armazenar dados dinâmicos, como preços de
ações corporativas ou desempenho da CPU. Se os dados forem específicos do
computador, armazene os dados no registro. Exemplos típicos de dados armazenados
no diretório incluem dados de fila de impressora, dados de contato do usuário e dados
de configuração de rede/computador. O banco de dados do Active Directory consiste
em objetos e atributos. Os objetos e definições de atributo são armazenados no
esquema do Active Directory.

Talvez você esteja se perguntando quais objetos estão armazenados atualmente no


Active Directory. O Active Directory tem três partições. Eles também são conhecidos
como contextos de nomenclatura: domínio, esquema e configuração. A partição de
domínio contém usuários, grupos, contatos, computadores, unidades organizacionais e
muitos outros tipos de objeto. Como o Active Directory é extensível, você também pode
adicionar suas próprias classes e/ou atributos. A partição de esquema contém classes e
definições de atributo. A partição de configuração inclui dados de configuração para
serviços, partições e sites.

A captura de tela a seguir mostra a partição de domínio do Active Directory.


Tópicos relacionados
Acessando o Active Directory usando Visual Basic

Cenário: A Fabrikam Corporation

Tópicos Avançados

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Cenário: A Fabrikam Corporation
Artigo • 03/06/2023

A empresa Fabrikam atualizou seu domínio de Windows NT 4.0 para Windows 2000.
Durante a instalação, Joe Worden, o administrador de rede, foi solicitado a fornecer um
nome DNS de domínio. Joe digitou "fabrikam.com". Os usuários, grupos e
computadores existentes são migrados para o Active Directory para o novo domínio:
fabrikam.com.

Os tópicos a seguir fornecem as etapas adicionais que podem ser executadas neste
cenário:

Conectando-se ao Active Directory


Associação a objetos do Active Directory
Criando uma unidade organizacional
Movendo usuários existentes para a unidade organizacional
Criando novos usuários na unidade organizacional
Adicionando usuários a um grupo
Criando um novo grupo
Enumerando objetos
Pesquisando objetos
Reorganização
Ingressando em dados heterogêneos
Criando e executando uma exibição
Criando uma junção heterogênea entre SQL Server e o Active Directory

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Conectando-se ao Active Directory
Artigo • 12/06/2023

Há vários métodos usados para acessar o Active Directory. É recomendável que você
use a API ADSI para acessar o Active Directory. O ADSI implementa o protocolo LDAP
para se comunicar com o Active Directory. Os exemplos de código a seguir mostram
como acessar o Active Directory.

VB

Set ns = GetObject("LDAP:")

Isso abre o provedor LDAP e o prepara para recuperar dados. Nenhuma conexão é
estabelecida até que os dados sejam solicitados. Quando os dados são solicitados, o
ADSI, com a ajuda do serviço localizador, tenta encontrar o melhor controlador de
domínio (DC) para a conexão e estabelecerá uma conexão com o servidor. Esse
processo é conhecido como associação sem servidor.

O ADSI também permite que você especifique o nome do servidor a ser usado para a
conexão.

VB

Set obj = GetObject("LDAP://mysrv01")

Em outro cenário, você só pode saber o nome de domínio, mas não o nome de servidor
específico. Novamente, o ADSI permite que você especifique o nome de domínio. No
Windows 2000, o nome de domínio é representado como um nome DNS. Por exemplo,
se Joe Worden, o administrador de rede, optar por se conectar usando o nome de
domínio, ele poderá usar o exemplo de código a seguir.

VB

Set obj = GetObject("LDAP://fabrikam.com")

O ADSI se conectará a um dos controladores de domínio no domínio fabrikam.com.

Tópicos relacionados
Associação a objetos do Active Directory
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Associação a objetos do Active
Directory
Artigo • 13/06/2023

Antes de continuar com esse cenário, você deve entender como os objetos ADSI são
nomeados no Active Directory e como associá-los. Associar um objeto ADSI conecta o
objeto com o serviço de diretório e permite que você acesse os métodos do objeto.

Adspath
Um objeto ADSI é identificado exclusivamente por sua cadeia de caracteres de
associação, que também é conhecida como ADsPath. Um ADsPath é uma combinação
de um progID (identificador programático) do provedor ADSI e o DN (nome
diferenciado) do objeto.

Aqui está o formato de um ADsPath:

"progID://DN"

pogID — o identificador programático do provedor ADSI, como LDAP ou WinNT.

:// — separa o progID do DN.

DN — o nome diferenciado do objeto ADSI, que é o caminho completo do objeto,


em que o caminho consiste em RDNs (nomes distintos relativos).

Um RDN é o nome do objeto sem o caminho e é exclusivo de seus objetos irmãos. Um


RDN consiste em uma ID de atributo e um valor, como "DC=Fabrikam", em que DC é o
atributo e Fabrikam é o valor. DC é uma ID de atributo RDN que significa componente
de domínio.

Aqui está um exemplo de um ADsPath:

"LDAP://DC=Fabrikam,DC=Com"

Associando o objeto
Veja como associar o objeto de domínio neste cenário:

VB

Set dom = GetObject("LDAP://DC=Fabrikam,DC=Com")


Quando você executa esse exemplo de código, ADSI usa o DN para determinar os
objetos ADSI a serem associados. Depois que ADSI associar esses objetos, você poderá
acessar seus métodos. O exemplo de código anterior associa um objeto de domínio a
IADs e IADsContainer. Agora você pode usar métodos nessas interfaces, como Get, Put,
Create, Delete e MoveHere.

Depois de associar um objeto de domínio, você pode imprimir alguns de seus atributos:

VB

Debug.Print dom.Get("Name")
Debug.Print dom.Get("whenCreated")

Para obter mais informações sobre o ADsPath, confira Cadeia de caracteres de


associação. Para obter mais informações sobre a associação, consulte Associação a um
objeto ADSI.

Tópicos relacionados
Criando uma unidade organizacional

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Criando uma unidade organizacional
Artigo • 03/06/2023

Agora que você tem o objeto de domínio, pode começar a criar unidades
organizacionais. A Fabrikam tem duas divisões: Vendas e Produção. A empresa planeja
contratar dois administradores Windows 2000 para gerenciar cada divisão. Joe Worden,
como administrador corporativo, criará duas novas unidades organizacionais no
domínio fabrikam. Ao criar uma unidade organizacional, Joe pode agrupar vários
objetos e permitir que outra pessoa gerencie esses objetos. O exemplo de código a
seguir cria a UO (Unidade Organizacional de Vendas).

VB

Dim dom as IADsContainer


Set dom = GetObject("LDAP://DC=Fabrikam,DC=Com")
Set salesOrg = dom.Create("organizationalUnit", "OU=Sales")
salesOrg.Put "description", "Sales Headquarter,SF"
salesOrg.Put "wwwHomePage", "https://fabrikam.com/sales"
salesOrg.SetInfo

O método IADsContainer.Create aceita o nome da classe e o nome do novo objeto.


Neste ponto, o objeto não está comprometido com o Active Directory. No entanto, você
terá uma referência de objeto ADSI/COM no cliente. Com esse objeto ADSI, você pode
definir ou modificar atributos usando o método IADs.Put . O método IADs.Put aceita o
nome do atributo e o valor do atributo. Ainda assim, nada está comprometido com o
diretório; tudo é armazenado em cache no cliente. Quando você chama o método
IADs.SetInfo , as alterações, nesse caso, criação de objeto e modificação de atributo, são
confirmadas no diretório. Essas alterações são transacionadas, o que significa que você
verá o novo objeto com todos os atributos definidos ou nenhum objeto.

Você também pode aninhar unidades organizacionais. O exemplo de código a seguir


pressupõe que a divisão Vendas seja dividida ainda mais nas regiões Leste e Oeste.

VB

Set east = salesOrg.Create("organizationalUnit", "OU=East")


east.SetInfo

Isso também se aplica à região Oeste.

Para associar diretamente à região Leste na organização Vendas, especifique o nome


diferenciado.
VB

Set east = GetObject("LDAP://OU=East,OU=Sales,DC=Fabrikam,DC=COM")


Debug.Print east.Get "description"
east.Put "wwwHomePage", "https://fabrikam.com/sales/east"

Se você já tiver associado ao objeto pai (Sales), poderá associar ao objeto filho (Leste)
do objeto pai usando o nome relativo do objeto filho.

VB

Set east = salesOU.GetObject("organizationalUnit", "OU=East")

Para garantir que os objetos tenham sido criados, use o snap-in Usuários e
Computadores do Active Directory MMC para exibir as novas unidades organizacionais.

Tópicos relacionados
Movendo usuários existentes para a unidade organizacional

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Movendo usuários existentes para a
unidade organizacional
Artigo • 13/06/2023

Quando o administrador corporativo, Joe Worden, atualiza o domínio do Windows NT


4.0 para o Active Directory, todos os usuários e grupos são migrados para os
contêineres Usuários no domínio da Fabrikam. Joe agora pode mover esses usuários e
grupos para as unidades organizacionais apropriadas. Um objeto também pode ser
movido entre domínios relacionados do Windows 2000 usando ADSI.

No exemplo de código a seguir, Joe move "jeffsmith" para a organização Sales.

VB

Set usr =
salesOU.MoveHere("LDAP://CN=jeffsmith,CN=Users,DC=fabrikam,DC=com",
vbNullString)

O método IADsContainer.MoveHere usa o ADsPath do objeto a ser movido e o novo


nome de objeto (RDN). Para manter o mesmo nome, você pode especificar NULL
(vbNullString) para o parâmetro bstrNewName . Para renomear o objeto quando ele for
movido, especifique o novo nome diferenciado relativo para o parâmetro bstrNewName
. Por exemplo, para mover jeffsmith para a organização de vendas e renomear o objeto
"jeffsmith" como "jeff_smith" na mesma operação, Joe executaria o seguinte código:

VB

Set usr =
salesOU.MoveHere("LDAP://CN=jeffsmith,CN=Users,DC=Fabrikam,DC=com",
"CN=jeff_smith")

Tópicos relacionados
Criando novos usuários na unidade organizacional

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Criando novos usuários na unidade
organizacional
Artigo • 03/07/2023

Terry Adams foi contratado para a organização Fabrikam Sales. Seu relatório direto é
Patrick Hines.

Conforme mostrado no exemplo de código a seguir, Joe Andreshak, o administrador da


empresa, criará uma nova conta para ele.

VB

Dim salesOU as IADsContainer


Set salesOU = GetObject("LDAP://OU=Sales,DC=Fabrikam,DC=COM")
Set usr = salesOU.Create("user", "CN=Terry Adams")
usr.Put "sAMAccountName", "terryadams"
usr.Put "userPrincipalName", "terryadams@fabrikam.com"
usr.Put "title" "Marketing Manager"
usr.SetInfo

usr.SetPassword "seahorse"
usr.AccountDisabled = False
usr.SetInfo

Ao criar um novo usuário, você deve especificar um sAMAccountName. Esse é um


atributo obrigatório para a classe de usuário. Antes que uma instância de um objeto
possa ser criada, todos os atributos obrigatórios devem ser definidos. O
sAMAccountName será gerado automaticamente se um não for especificado para um
novo usuário.

Ao criar um novo usuário, todos os atributos necessários devem ser definidos no cache
local antes que o método IADs.SetInfo seja chamado.

Joe, como administrador, pode atribuir a senha de Terry usando o método


IADsUser.SetPassword . O método IADsUser.SetPassword não funcionará até que o
método IADs.SetInfo seja chamado.

Em seguida, Joe habilita a conta de usuário definindo a propriedade


IADsUser.AccountDisabled como FALSE.

O exemplo de código a seguir mostra como definir Terry como gerente de Patrick.

VB
Set usr = GetObject("LDAP://CN=patrickhines,OU=Sales,DC=Fabrikam,DC=COM")
usr.Put "manager", "CN=Terry Adams,OU=Sales,DC=Fabrikam,DC=COM"
usr.SetInfo

Você pode se perguntar o que acontece se Terry mudar seu nome, mudar para uma
organização diferente ou deixar a empresa. Quem mantém esse link de relatório direto
do gerente? Para obter mais informações e a solução para esse problema, consulte
Reorganização. Como o esquema do Active Directory é extensível, você pode modelar
seus objetos para incluir relações de estilo de relatório diretas do gerente semelhantes.

Antes de ir para a próxima tarefa, veja um exemplo de código que mostra como Joe
exibiria os relatórios diretos de Terry.

VB

Set usr = GetObject("LDAP://CN=Terry Adams,OU=Sales,DC=Fabrikam,DC=COM")


reports = usr.GetEx ("directReports")

For each directReport in reports


Debug.Print directReport
Next

Neste exemplo de código, Patrick será exibido como o relatório direto de Terry, mesmo
que o atributo directReports nunca tenha sido modificado. O Active Directory faz isso
automaticamente.

No mundo do diretório, um atributo pode ter valores únicos ou múltiplos. Como


directReports tem vários valores, você pode obter essas informações examinando o
esquema, é mais fácil usar o método IADs.GetEx , que retorna uma matriz de valores,
independentemente de valores únicos ou múltiplos serem retornados.

O snap-in Usuários e Computadores do Active Directory permite exibir relatórios diretos


e relações de gerente na página de propriedades do usuário.

Tópicos relacionados
Adicionando usuários a um grupo
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Adicionando usuários a um grupo
Artigo • 13/06/2023

Joe Worden, o administrador corporativo, agora adicionará Julie Bankert ao grupo de


Gerenciamento. Para adicionar um objeto a um grupo, use o método IADsGroup.Add .

VB

Dim grp as IADsGroup

Set grp = GetObject("LDAP://CN=Management,OU=Sales,DC=Fabrikam,DC=COM")


grp.Add ("LDAP://CN=Julie Bankert,OU=Sales,DC=Fabrikam,DC=COM")

Tópicos relacionados
Criando um novo grupo

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Criando um novo grupo
Artigo • 13/06/2023

Joe Worden, o administrador corporativo, deve criar um novo grupo. Ele gostaria de
proteger alguns recursos, como arquivos, objetos do Active Directory ou outros objetos,
com base na associação desse grupo. O exemplo de código a seguir mostra como criar
um novo grupo.

VB

Set ou = GetObject("LDAP://OU=Sales,DC=Fabrikam,DC=COM")
Set grp = ou.Create("group", "CN=Management")
grp.Put "samAccountName", "mgmt"
grp.Put "groupType", ADS_GROUP_TYPE_DOMAIN_LOCAL_GROUP Or
ADS_GROUP_TYPE_SECURITY_ENABLED
grp.SetInfo

Esse grupo, Gerenciamento, será criado na unidade organizacional vendas. Primeiro, Joe
deve criar um objeto ADSI para a unidade organizacional sales. Em segundo lugar, ele
deve definir o atributo samAccountName nesse objeto, pois ele é um atributo
obrigatório para compatibilidade com versões anteriores. Para este exemplo, quando
samAccountName é definido, Windows NT ferramentas 4.0, como o Gerenciador de
Usuários, veem o atributo como mgmt em vez de Gerenciamento.

Em terceiro lugar, Joe deve especificar o tipo de grupo. Em um domínio do Windows


2000, há três tipos de grupos: Global, Domain Local e Universal. Além disso, o grupo
carrega sua característica de segurança. Um grupo pode ser habilitado para segurança
ou um grupo não protegido. Essencialmente, grupos habilitados para segurança são
aqueles que podem ser concedidos ou negados direitos de acesso a recursos,
semelhantes a um usuário. Conceder a um grupo acesso a um compartilhamento de
arquivos, por exemplo, implica que todos os membros do grupo podem acessar o
compartilhamento de arquivos. As listas de distribuição não podem ser usadas de
maneira semelhante: você não pode, por exemplo, conceder a uma lista de distribuição
o direito de acessar um compartilhamento de arquivos. Durante a atualização, Windows
NT grupos 4.0 são migrados como grupos habilitados para segurança. Grupos não
protegidos no Active Directory são semelhantes às listas de distribuição no Exchange.
Portanto, a criação de grupos ou listas de distribuição são operações semelhantes no
Windows 2000. No modo nativo do Windows 2000 (modo nativo significa que todos os
controladores de domínio em um domínio são computadores que executam o Windows
2000 Server), os grupos podem ser aninhados para qualquer nível.
Tópicos relacionados
Enumerando objetos

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Enumerando objetos
Artigo • 13/06/2023

Para exibir o objeto filho de um contêiner, como uma UO (unidade organizacional),


enumere o objeto contêiner. Para fazer uma analogia a um sistema de arquivos, o
objeto filho corresponderia aos arquivos no diretório, enquanto o contêiner, que é o
objeto pai, corresponderia ao próprio diretório. Você também pode usar a operação de
enumeração quando quiser obter o objeto pai de um objeto .

Ao enumerar um objeto, você realmente associa a um objeto no diretório e uma


interface IADs é retornada em cada objeto.

O exemplo de código a seguir mostra como enumerar os filhos de um contêiner.

VB

Dim ou As IADs
' Bind to an object using its DN.
On Error GoTo Cleanup

Set ou = GetObject("LDAP://OU=Sales,DC=Fabrikam,DC=COM")

For each child in ou


Debug.Print child.Name
Next

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set ou = Nothing

Você pode filtrar os tipos de objetos retornados da enumeração . Por exemplo, para
exibir apenas usuários e grupos, use o exemplo de código a seguir antes da
enumeração .

VB

Ou.Filter = Array("user", "group")

Se você tiver uma referência de objeto, poderá obter o pai do objeto usando a
propriedade Pai de IADs. O exemplo de código a seguir mostra como associar ao objeto
pai.

VB
parentPath = obj.Parent
Set parent = GetObject(parentPath)

Para obter mais informações, consulte Enumerando objetos ADSI.

Tópicos relacionados
Pesquisando objetos

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Pesquisando objetos
Artigo • 13/06/2023

Julie Bankert deve encontrar números de telefone para todos os Gerentes de Programas
que trabalham no Departamento 101. Ela pode criar um script que usa ADO e ADSI para
fazer isso.

Ao usar o provedor do ADO para executar uma consulta, o conjunto de resultados


retornará apenas os primeiros 1000 objetos. Por esse motivo, é importante usar uma
consulta paginada para que você possa recuperar todos os objetos no conjunto de
resultados, desde que o serviço de diretório não tenha sido definido para limitar o
número de itens em um conjunto de resultados. Os conjuntos de retorno conterão o
número de itens que você especificar no tamanho da página e os conjuntos paginado
continuarão a ser retornados até que todos os itens no conjunto de resultados sejam
retornados.

VB

' Create the connection and command object.


Set oConnection1 = CreateObject("ADODB.Connection")
Set oCommand1 = CreateObject("ADODB.Command")
' Open the connection.
oConnection1.Provider = "ADsDSOObject" ' This is the ADSI OLE-DB provider
name
oConnection1.Open "Active Directory Provider"
' Create a command object for this connection.
Set oCommand1.ActiveConnection = oConnection1

' Compose a search string.


oCommand1.CommandText = "select name,telephoneNumber " & _
"from 'LDAP://DC=Fabrikam,DC=com'" & _
"WHERE objectCategory='Person'" & _
"AND objectClass='user'" & _
"AND title='Program Manager'" & _
"AND department=101"

' Execute the query.


Set rs = oCommand1.Execute
'--------------------------------------
' Navigate the record set
'--------------------------------------
While Not rs.EOF
Debug.Print rs.Fields("Name") & " , " & rs.Fields("telephoneNumber")
rs.MoveNext
Wend
Para executar uma pesquisa ADSI no Visual Basic ou em um ambiente de script, três
componentes do ADO são necessários: Connection, Command e Recordset. O objeto
Connection permite que você especifique o nome do provedor, as credenciais
alternativas, se aplicável e outros sinalizadores. O objeto Command permite que você
especifique as preferências de pesquisa e a cadeia de caracteres de consulta. Você deve
associar o objeto Connection a um objeto Command antes da execução da consulta.
Por fim, o objeto Recordset é usado para iterar o conjunto de resultados.

O ADSI dá suporte a dois tipos de cadeias de consulta ou dialetos. O exemplo de código


anterior usa o dialeto SQL. Você também pode usar o dialeto LDAP. A cadeia de
caracteres de consulta do dialeto LDAP baseia-se no RFC 2254 (um RFC é um
documento solicitação de comentários, que é a base para o desenvolvimento de
padrões LDAP). O exemplo anterior pode ser traduzido para o exemplo de código a
seguir.

VB

oCommand1.CommandText = "<LDAP://DC=fabrikam,DC=COM>;" & _


"(&(objectCategory=Person)" & _
"(objectClass=user)" & _
"(title=ProgramManager)" & _
"(department=101));" & _
"name,telephoneNumber;subTree"

Por que a palavra "subárvore" está no final da cadeia de caracteres? No mundo do


diretório, você pode especificar o escopo da pesquisa. As opções são: "base", "onelevel"
e "subárvore". "base" é usado para ler o próprio objeto; "onelevel" refere-se aos filhos
imediatos, semelhante ao comando dir ; A "subárvore" é usada para pesquisar vários
níveis profundos ou inferiores (semelhante a dir /s).

Com o dialeto SQL, você pode especificar o escopo na propriedade de comando, como
no exemplo de código a seguir.

VB

oCommand1.Properties("SearchScope") = ADS_SCOPE_ONELEVEL

Se o escopo não for especificado, por padrão, ele usará uma pesquisa de subárvore.

7 Observação

Se você usar C++, poderá usar a interface IDirectorySearch do ADSI.


Tópicos relacionados
Reorganização

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Reorganização
Artigo • 12/06/2023

A organização de vendas mudou para uma nova organização : "Vendas e Suporte". Julie
Bankert foi promovida a vice-presidente e liderará a nova organização. Joe Worden, o
administrador corporativo, deve mover a UO de Vendas para uma nova UO, Vendas e
Suporte.

VB

Set dom = GetObject("LDAP://DC=Fabrikam,DC=COM")


Set salesSupport = dom.Create("organizationalUnit", "CN=Sales and Support")
Set sales = salesSupport.MoveHere("LDAP://OU=Sales,DC=Fabrikam,DC=COM",
vbNullString)

Com este exemplo de código, todos os objetos na unidade organizacional de vendas,


incluindo as unidades sub-organizacionais, são movidos para a nova unidade
organizacional.

Agora, Joe pode mover Julie para a unidade organizacional de Vendas e Suporte.

VB

Set usr = salesSupport.MoveHere("LDAP://CN=Julie Bankert,OU=Sales,OU=Sales


and Support,DC=Fabrikam,DC=COM")
usr.Put "title", "Vice President"
usr.SetInfo

Lembre-se de que o vínculo de relatório direto do gerente entre Julie Bankert e Chris
Gray é atualizado automaticamente pelo Active Directory.

Para criar um relatório do Active Directory

1. Abra o Visual Basic versão 6.0 e, quando solicitado para o tipo de projeto,
selecione Projeto de Dados.

2. No Projeto de Dados, clique duas vezes em Ambiente de Dados1.

3. Na janela Ambiente de Dados , clique com o botão direito do mouse no objeto de


conexão (Connection1) e selecione Propriedades.

4. Selecione Provedor OLE DB para Serviços de Diretório da Microsoft e clique em


Avançar.
5. Selecione Usar Windows NT Segurança integrada e clique em OK. Isso cria um
objeto de conexão.

6. Clique com o botão direito do mouse na janela Ambiente de Dados novamente


para selecionar Adicionar Comando. Clique com o botão direito do mouse no
objeto Command1 e selecione Propriedades. A caixa de diálogo Propriedades
command1 a seguir será exibida.

7. Clique no botão de opção Instrução SQL e digite o seguinte:

SELECT Name,telephoneNumber FROM 'LDAP://DC=Fabrikam,DC=com' WHERE


objectCategory='Person' AND objectClass='user'

O objeto Command é criado. Adicione o objeto Command ao relatório.

8. Clique duas vezes em Relatório de Dados1 na janela Projeto .

9. Arraste o objeto Command1 da janela DataEnvironment1 para a seção Detalhes


na janela Relatório de Dados .

10. Em Propriedades dataReport1, para DataSource, selecione DataEnvironment1 no


menu suspenso e selecione Command1 no campo DataMember .

11. Na janela do projeto, clique com o botão direito do mouse em Projeto de Dados e
selecione DadosPropriedades do Projeto.

12. Na janela de diálogo DataProject – Propriedades do Projeto , em Objeto de


Inicialização, selecione DadosReport1 no menu suspenso. Clique em OK para
salvar.
13. Compilar. A caixa de diálogo DataReport1 a seguir será exibida.

Tópicos relacionados
Unindo dados heterogêneos

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Unindo dados heterogêneos
Artigo • 13/06/2023

As organizações típicas armazenam dados em vários bancos de dados heterogêneos. Os


dados de Recursos Humanos podem ser armazenados em SQL Server, enquanto os
dados de gerenciamento de conta são armazenados no diretório . Outros dados podem
ser armazenados em formatos proprietários.

Com, SQL Server 7.0, ADSI e o Provedor OLE DB, é possível unir dados do Active
Directory a dados em SQL Server e criar uma exibição dos dados unidos.

Para unir dados do Active Directory com SQL Server Data

1. Executar o Analisador de Consulta SQL (Iniciar | Programas | Microsoft SQL Server


7.0)

2. Faça logon no computador SQL Server.

3. Execute a seguinte linha (realçando-a e pressionando CTRL+E):

SQL

EXEC sp_addlinkedserver 'ADSI', 'Active Directory Service Interfaces',


'ADSDSOObject', 'adsdatasource'
GO

Nessa linha, os argumentos para o sp_addlinkedserver System Stored Procedure


são os seguintes:

"ADSI" é o argumento do servidor , que será o nome desse servidor


vinculado.
"Active Directory Services" é o argumento srvproduct , que é o nome da
fonte de dados OLE DB que você está adicionando como um servidor
vinculado.
"ADSDSOObject" é o argumento provider_name e indica que você está
usando o Provedor OLE DB.
"adsdatasource" é o argumento data_source, que é o nome da fonte de
dados, conforme interpretado pelo Provedor OLE DB.

Agora você pode usar o servidor vinculado para acessar o Active Directory de SQL
Server.
4. O exemplo a seguir executa uma consulta usando a instrução OPENQUERY . Essa
instrução tem dois argumentos: ADSI, que é o nome do servidor vinculado que
você acabou de criar e uma instrução de consulta. A instrução query contém os
seguintes itens:

A instrução SELECT contém a lista de dados que serão obtidos do serviço


de diretório. Você precisará usar o nome de exibição LDAP para indicar quais
dados você está procurando.
A instrução FROM contém o nome do servidor de diretório vinculado do
qual essas informações serão obtidas.
A instrução WHERE fornece as condições de pesquisa. Neste exemplo, ele
está pesquisando usuários.

Digite e execute:

SQL

SELECT * FROM OPENQUERY( ADSI,


'SELECT name, adsPath
FROM 'LDAP://DC=Fabrikam,DC=com'
WHERE objectCategory = 'Person' AND objectClass= 'user'')

Você também pode usar o dialeto LDAP ADSI. Por exemplo:

SQL

SELECT * FROM OPENQUERY(ADSI,


'<LDAP://DC=Fabrikam,DC=COM>;(&(objectCategory=Person)
(objectClass=user));name, adspath;subtree')

No exemplo anterior, a consulta LDAP tem quatro partes:

"<LDAP://DC=Fabrikam,DC=COM>" é o nome diferenciado do servidor de


diretório a ser pesquisado.
"((&objectCategory=Person)(objectClass=user))" é o filtro de pesquisa LDAP
(consulte Sintaxe de filtro de pesquisa).
"name, adspath" são os nomes (usando o formato de nome de exibição
LDAP) dos atributos a serem recuperados.
"subárvore" indica o escopo da pesquisa.

Tópicos relacionados
Criando e executando uma exibição
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Criando e executando uma exibição
Artigo • 03/06/2023

Você pode criar uma exibição para dados obtidos do Active Directory. Lembre-se de que
apenas a definição de exibição é armazenada em SQL Server e não no conjunto de
resultados real. Portanto, você pode obter um resultado diferente ao invocar a exibição
posteriormente.

O exemplo de código a seguir mostra como criar uma exibição.

SQL

CREATE VIEW viewADUsers


AS
SELECT * FROM OpenQuery( ADSI,
'<LDAP://DC=Fabrikam,DC=com>;(&(objectCategory=Person)
(objectClass=user));name, adspath, title;subtree')

Use o código a seguir para invocar uma exibição.

SQL

SELECT * from viewADUsers

Tópicos relacionados
Criando uma junção heterogênea entre SQL Server e o Active Directory

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Criando uma junção heterogênea entre
SQL Server & Active Directory
Artigo • 13/06/2023

Todos os funcionários da empresa Fabrikam são revisados a cada seis meses. As


classificações de revisão são armazenadas no banco de dados de Recursos Humanos no
SQL Server. Para criar uma exibição desses dados, Joe Worden, o administrador
corporativo, deve primeiro criar uma tabela de revisão de desempenho do funcionário.

No Analisador de Consulta SQL, Joe criará uma tabela chamada EMP_REVIEW que
conterá três colunas para manter o nome do funcionário, a data da revisão e a
classificação que o funcionário recebeu.

SQL

CREATE TABLE EMP_REVIEW


(
userName varChar(40),
reviewDate datetime,
rating decimal
)

Joe pode inserir alguns registros.

SQL

INSERT EMP_REVIEW VALUES('Julie Adam', '2/15/1999', 4 )


INSERT EMP_REVIEW VALUES('Julie Bankert', '7/15/1999', 5 )
INSERT EMP_REVIEW VALUES('Chris Gray', '2/15/1999', 3 )
INSERT EMP_REVIEW VALUES('Chris Gray', '7/15/1999', 4 )

Agora, Joe pode ingressar os objetos de usuário do Active Directory na tabela SQL
Server.

Neste exemplo, a instrução SELECT contém a lista de dados que serão obtidos do
serviço de diretório e SQL Server. A instrução FROM contém o nome do servidor de
diretório vinculado do qual essas informações serão obtidas, nesse caso, viewADUsers. A
instrução WHERE fornece as condições de pesquisa. Neste exemplo, ele está
pesquisando pelo nome no serviço de diretório, que é definido como o nome de
usuário do SQL inserido na tarefa anterior.

SQL
SELECT ADsPath, userName, title, ReviewDate, Rating
FROM EMP_REVIEW, viewADUsers
WHERE userName = Name

O comando anterior obtém o resultado de SQL Server e do Active Directory. AdsPath e


title são do Active Directory, enquanto userName, ReviewDate e Rating são da tabela
SQL. Ele pode até mesmo criar outra visão para esta junção.

SQL

CREATE VIEW reviewReport


AS
SELECT ADsPath, userName, title, ReviewDate, Rating
FROM EMP_REVIEW, viewADUsers
WHERE userName = Name
GO
SELECT * FROM reviewReport

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Tópicos Avançados (ADSI)
Artigo • 13/06/2023

Esta seção discute as seguintes tarefas avançadas que podem ser executadas com ADSI:

Rootdse
Delegando unidades organizacionais
Estendendo ADSI
Mapeando o código adsi do Visual Basic para código C++

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


RootDSE (ADSI)
Artigo • 03/07/2023

Cada servidor de diretório tem uma entrada exclusiva chamada RootDSE. Ele fornece
dados sobre o servidor, como seus recursos, a versão LDAP à qual ele dá suporte e os
contextos de nomenclatura que ele usa.

Por exemplo, para criar um script ou aplicativo, que pode ser executado em qualquer
ambiente de domínio do Windows. Você pode especificar o nome diferenciado, o nome
do servidor ou o nome de domínio ao se conectar ao Active Directory. Se você não tiver
essas informações, poderá usar o objeto RootDSE para estabelecer uma conexão. O
exemplo de código a seguir altera a descrição do domínio em qualquer domínio.

VB

Set rootDSE = GetObject("LDAP://RootDSE")


Set dom = GetObject( "LDAP://" & rootDSE.Get("defaultNamingContext"))
dom.Put "description", "My domain"
dom.SetInfo

Ao obter o atributo defaultNamingContext do RootDSE, você pode associar ao


domínio atual, por exemplo, o defaultNamingContext da Fabrikam é DC=Fabrikam,
DC=COM.

Para enumerar as propriedades do RootDSE, use a interface IADsPropertyList .


IDirectoryObject não pode ser usado para esta tarefa.

Para obter mais informações, consulte Associação sem servidor e RootDSE.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Delegando unidades organizacionais
Artigo • 13/06/2023

A empresa Fabrikam contrata dois administradores, Mike e Paul, para gerenciar as


unidades organizacionais leste e oeste, respectivamente. Joe delega suas
responsabilidades administrativas a eles para que eles possam criar e excluir usuários
em suas respectivas unidades organizacionais.

Antes de ver como configurar essas unidades organizacionais em Mike e Paul, você deve
entender como configurar o acesso a objetos no Active Directory. Cada objeto no Active
Directory tem um descritor de segurança. Com o descritor de segurança, você pode
modificar permissões no objeto, propagar permissões, habilitar a auditoria e assim por
diante. O próprio descritor de segurança tem duas ACLs (listas de controle de acesso):
uma ACL discricionária (DACL) e uma SACL (ACL do sistema). Cada ACL pode conter
ACEs (entradas de controle de acesso). Com uma ACE, você pode definir o acesso
permitido ou negado em um objeto . Além disso, você pode especificar ações
específicas para permitir ou negar. Exemplos de ações incluem Criar Filho, Excluir Filho,
Ler Propriedade e Gravar Propriedade. Esses direitos são especificados com o
AccessMask.

Em seguida, você pode especificar as classes ou atributos aos quais essa ACE está
associada. No exemplo da Fabrikam a seguir, Joe escolhe a classe de usuário para que
cada administrador possa adicionar usuários ao sistema. Em seguida, você deve
responder à pergunta: "Quem será o beneficiário desta ACE?" Joe especificará Mike.

Por fim, você pode definir o comportamento de herança ace– por exemplo, ACEs podem
ser especificados para propagar para baixo na hierarquia. Em resumo, o exemplo
anterior resultará em Mike ser capaz de criar e excluir objetos de usuário na unidade
organizacional vendas leste.

Joe usa o exemplo de código a seguir para configurar as ACEs e ACLs na unidade
organizacional Leste.

VB

Set ou = GetObject("LDAP://OU=East, OU=Sales, DC=Fabrikam,DC=COM")


Set sec = ou.Get("ntSecurityDescriptor")
Set acl = sec.DiscretionaryAcl

Set ace = CreateObject("AccessControlEntry")


' You can also use Set ace = new ADsAccessControlEntry.

' Grant access to the object.


ace.AceType = ADS_ACETYPE_ACCESS_ALLOWED_OBJECT
' Create and delete child objects.
ace.AccessMask = ADS_RIGHT_DS_CREATE_CHILD Or ADS_RIGHT_DS_DELETE_CHILD
' Create the user object with the user schema IDGUID.
ace.ObjectType = "{BF967ABA-0DE6-11D0-A285-00AA003049E2}"
' Propagate the ACE down.
ace.AceFlags = ADS_ACEFLAG_INHERIT_ACE
' Provide an option that notifies that the objectType is filled.
ace.Flags = ADS_FLAG_OBJECT_TYPE_PRESENT
' Show the beneficiary of this ACE.
ace.Trustee = "FABRIKAM\Mike"
acl.AddAce ace

sec.DiscretionaryAcl = acl
ou.Put "ntSecurityDescriptor", Array(sec)
' Use SetInfo to commit the data to Active Directory.
ou.SetInfo

' Release the objects.


Set ace = Nothing
Set acl = Nothing
Set sec = Nothing

A figura a seguir mostra o menu Criar Novo Modo de Exibição do Active Directory após
a execução do código. Quando Joe, o administrador, faz logon, ele vê várias classes que
ele pode criar. No entanto, quando Mike faz logon, ele é capaz apenas de criar objetos
de usuário.

Para obter mais informações, confira Modelo de segurança ADSI.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Estendendo ADSI
Artigo • 13/06/2023

Com o modelo de extensão ADSI, você pode associar uma classe de diretório ao seu
próprio objeto COM. Da perspectiva de um programador adsi ou gravador de script, a
extensão se torna parte integrante do ADSI. Por exemplo, quando um novo funcionário
ingressar na Fabrikam, o administrador do Windows NT criará um objeto de usuário no
diretório e o administrador de folha de pagamento precisará configurar algumas
entradas nos sistemas de recursos humanos para esse usuário. Com uma extensão ADSI,
esse processo pode ser simplificado em um único script.

VB

Dim usr
Dim sUserName

On Error Resume Next

sUserName = InputBox ("Enter the name of the user to add:")

Set usr = ou.Create("user", "CN=" & sUserName)

If Err.Number <> 0 Then


WScript.Echo "An error has occurred. " & Err.Number
Exit Sub
End If

// Insert code to set some attributes

usr.SetInfo

If Err.Number <> 0 Then


WScript.Echo "An error has occurred. " & Err.Number
Exit Sub
End If

usr.AddToPayroll 'this is a custom method from an ADSI Extension

If Err.Number <> 0 Then


WScript.Echo "An error has occurred. " & Err.Number
Exit Sub
End If

Debug.Print "User: " & usr.Name & "has been created"

Para obter mais informações, consulte Extensões ADSI.


Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Mapeando o código Visual Basic ADSI
para o código C++
Artigo • 03/06/2023

O ADSI consiste em mais de 50 interfaces. A maioria das operações de diretório pode


ser concluída usando apenas cinco interfaces. Eles são:

IADsOpenDSObject
Iads
IADsContainer
IDirectoryObject
Idirectorysearch

A tabela a seguir lista mapeamentos de código VB/VBS ADSI para código C++. Lembre-
se de que esta não é uma lista completa.

Código VBS Código VC

Set obj = GetObject() hr = AdsGetObject()

Obj. Coloque obj. Obter obj. IADs ou IDirectoryObject


Pai

Obj. Crie obj. Excluir obj. IADsContainer


MoveHere

Para cada... Em... AdsBuildEnumerator() ADsEnumerateNext()

Connection, Command, Idirectorysearch


RecordSet

Descritor de segurança, ACL, IADsSecurityDescriptor, IADsAccessControlList,


ACE IADsAccessControlEntry

Comentários
Esta página foi útil? ツ Yes ト No
Obter ajuda no Microsoft Q&A
Scripts de interfaces de serviço do
Active Directory
Artigo • 03/05/2023

As ADSI (Interfaces de Serviço do Microsoft Active Directory), quando combinadas com


uma linguagem de script, como o Microsoft Visual Basic Scripting Edition ou o software
de desenvolvimento Microsoft JScript, fornecem a um administrador do sistema
ferramentas avançadas para gerenciar usuários, serviços, filas de impressão e outras
partes de uma rede de computadores que executam sistemas operacionais Microsoft
Windows NT ou Windows 2000. Os scripts que usam o modelo de objeto ADSI podem
substituir esforços manuais repetitivos que normalmente seriam realizados usando
ferramentas administrativas ou o Console de Gerenciamento da Microsoft. O script ADSI
também pode automatizar tarefas regulares de manutenção do sistema para a operação
mãos livres e fornece uma interface fácil para escrever ferramentas de gerenciamento
de sistema baseadas na Web usando Páginas do Active Server.

Para obter mais informações sobre scripts com ADSI, com tutoriais de script, exemplos e
ferramentas, consulte:

Active Director Domain Services


Primer de script ADSI
Conceitos e tecnologias de script para administração do sistema
Erros e interceptação de erros
ADSI Edit
Edição ADSI (adsiedit.msc)

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Erros e interceptação de erros
Artigo • 13/06/2023

O ADSI lança uma ampla variedade de erros, desde específicos do ADSI até relacionados
a COM a erros padrão do Win32. Esta seção do tutorial fornece estratégias para lidar
com erros em scripts ADSI e ajuda você a entender os diferentes códigos de erro. Os
seguintes tópicos são abordados:

Como interceptar erros adsi


Erros comuns

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Como interceptar erros adsi
Artigo • 12/06/2023

O VBScript oferece apenas uma maneira de interceptar erros: tratamento de erros


embutidos. Um manipulador de erros embutido começa com a instrução On Error
Resume Next . Como On Error Resume Next impedirá que qualquer erro interrompa a
execução do script até o final do escopo do qual On Error Resume Next é chamado,
você deve marcar o valor de Err em cada ponto após a instrução On Error Resume Next,
na qual você espera que ocorra um erro. O exemplo a seguir demonstra o tratamento
de erros embutidos em um script ADSI:

VB

On Error Resume Next

Set myComputer = GetObject(computerPath)


If Err Then AdsiErr()

' Create the new user account


Set newUser = myComputer.Create("user", username)
newUser.SetInfo
If Err Then AdsiErr()

Sub AdsiErr()
Dim s
Dim e

If Err.Number = &H8000500E Then


WScript.Echo "The user " & username & " already exists."
Elseif Err.Number = &H80005000 Then
WScript.Echo "Computer " & computerPath & " not found. Check the
ADsPath and try again."
Else
e = Hex(Err.Number)
WScript.Echo "Unexpected Error " & e & "(" & Err.Number & ")"
End If
WScript.Quit(1)

End Sub

Após cada local em que o script provavelmente encontrará um erro, há uma instrução If
Err . O objeto Err contém o código de erro do último erro que ocorreu durante a
execução do script; se nenhum erro tiver ocorrido, Err sempre será zero (0). No exemplo
anterior, um erro fará com que a execução salte para a sub-rotina AdsiErr , que verifica
o valor de Err.Number em busca de erros esperados. Em vez de morrer com uma
mensagem de erro enigmática, o script dará uma explicação um pouco melhor do
motivo pelo qual parou de ser executado.

Lembre-se de que, dentro do escopo no qual On Error Resume Next é chamado,


qualquer erro que ocorra após a chamada On Error Resume Next será ignorado. Na
verdade, isso pode dificultar a depuração de um script se você esquecer de marcar o
valor de Err em locais apropriados. Sempre que você espera que um erro seja provável,
certifique-se de marcar o valor de Err.

(Quando você estiver depurando inicialmente o script, convém simplesmente deixar que
o script interrompa sua execução e exiba o número de linha incorreto em um erro e
adicione os manipuladores de erro depois que o fluxo básico do programa estiver
correto.)

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Erros comuns (ADSI)
Artigo • 12/06/2023

Todos os erros específicos de ADSI têm uma forma hexadecimal de 80005xxx. Os


códigos de erro mais comuns encontrados são descritos na tabela a seguir.

Código de erro Descrição


de hexadecia
ADSI

80005000 Um nome de caminho ADSI inválido foi passado. Esse erro resulta da
passagem de um ADsPath mal formado para GetObject ao associar a um
objeto .

8000500D A propriedade ADSI não pode ser encontrada no cache de propriedades.

8000500E O objeto ADSI existe. Se você tentar criar um objeto ADSI com o mesmo
nome de um objeto ADSI existente, esse erro ocorrerá.

Para obter uma lista completa de códigos de erro ADSI, consulte Códigos de erro ADSI
genéricos.

Erros COM
Como ADSI é composto por objetos COM, ele retornará códigos de erro COM padrão. A
tabela a seguir lista os códigos de erro COM mais comumente encontrados na
programação ADSI.

Código de Descrição
erro HEX
COM

80004005 Erro não especificado. A causa da falha do objeto COM é indeterminada por
ADSI.

800041E4 Objeto não localizado. Esse erro ocorre predominantemente devido à ortografia
incorreta da cadeia de caracteres ADsPath ao associar a um objeto .

Consulte Códigos de erro COM genéricos para obter mais alguns exemplos de erros
COM que podem ocorrer na programação ADSI.

Erros do Win32
Qualquer código de erro do formulário hexadecimal 8007xxxxx é um código de erro
padrão do Win32. Se você converter os últimos quatro dígitos de hexadecimal em
decimal, poderá acessar o erro da linha de comando do Windows 2000:

net helpmsg <number>

Na linha de comando acima, "<number>" é o número decimal obtido convertendo os


últimos quatro dígitos do código de erro de hexadecimal. Essa linha de comando
fornecerá uma descrição mais útil do erro Win32, que pode ser de grande ajuda na
depuração do script.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Sobre interfaces de serviço do Active
Directory
Artigo • 13/06/2023

O ADSI (Active Directory Service Interfaces) abstrai os recursos dos serviços de diretório
de diferentes provedores de rede em um ambiente de computação distribuído para
apresentar um único conjunto de interfaces de serviço de diretório para gerenciar
recursos de rede. Administradores e desenvolvedores podem usar serviços ADSI para
enumerar e gerenciar os recursos em um serviço de diretório, independentemente de
qual ambiente de rede contenha o recurso.

O ADSI facilita a execução de tarefas administrativas comuns, como adicionar novos


usuários, gerenciar impressoras e localizar recursos em todo o ambiente de computação
distribuído.

O ADSI facilita para os desenvolvedores "habilitar o diretório" de seus aplicativos.


Administradores e desenvolvedores lidam com um único conjunto de interfaces de
serviço de diretório, independentemente de quais serviços de diretório estão instalados.

Os seguintes tópicos são discutidos nesta introdução:

Vários Serviços de Diretório


Quem usará interfaces de serviço do Active Directory?
Serviços de Diretório Hoje
Benefícios do uso de interfaces de serviço do Active Directory
Arquitetura de interfaces de serviço do Active Directory
Suporte à linguagem de programação
Propriedades e atributos ADSI

O que você deve saber antes de ler este guia


Este guia pressupõe que você esteja familiarizado com o COM (Component Object
Model) e a Automação e que você saiba como programar no Visual Basic ou no C/C++.

Alguns dos termos usados neste guia são exclusivos do ADSI ou do ambiente de
serviços de diretório. Outros termos serão familiares, mas podem ter significados
ligeiramente diferentes nesses ambientes.
Leitura adicional sobre ADSI e tópicos
relacionados
Para obter mais informações sobre as Interfaces de Serviço do Active Directory e as
tecnologias nas quais elas se baseiam, você pode achar as seguintes fontes úteis.

Brockschmidt, Kraig. Dentro do OLE, 2ª edição. Redmond, WA: Microsoft Press, 1995.

Chappell, David. Noções básicas sobre ActiveX e OLE. Redmond, WA: Microsoft Press,
1996.

Hahn, Steven. Referência do programador ASP ADSI. Wrox Press Ltd., 1998.

Harrison, Richard. Segurança Web ASP/MTS/ADSI. Prentice Hall, 1999.

A versão 1.0 de referência do programador OLE DB da Microsoft, 1996.

Referência do programador OLE 2, Volume Dois. Redmond, WA: Microsoft Press, 1994.

Rogerson, Dale. Dentro do COM. Redmond, WA: Microsoft Press, 1997.

A especificação de design do serviço Active Directory versão 2.0.

A especificação do modelo de objeto do componente.

(Esses recursos podem não estar disponíveis em alguns idiomas e países/regiões.)

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Vários Serviços de Diretório
Artigo • 03/06/2023

Um desafio de trabalhar em um ambiente de computação distribuída é identificar e


localizar recursos como usuários, grupos, filas de impressão e documentos. Um serviço
de diretório é a parte de um ambiente de computação distribuído que fornece uma
maneira de localizar e identificar os usuários e recursos disponíveis no sistema. Um
serviço de diretório é como um diretório telefônico. Dado um nome para uma pessoa
ou um recurso, ele fornece os dados necessários para acessar essa pessoa ou recurso.
Você não precisa começar com dados de associação para acessar um recurso na rede.

A maioria das empresas já tem muitos diretórios diferentes em vigor. Por exemplo,
sistemas operacionais de rede, sistemas de email eletrônicos e produtos "groupware"
têm seus próprios diretórios. Muitos problemas surgem quando uma única empresa
implanta vários diretórios. Esses problemas incluem usabilidade, consistência de dados,
custo de desenvolvimento e custo de suporte, entre outros.

Esses problemas são resolvidos no ADSI, pois há um único conjunto de interfaces aberto
e consistente que pode ser usado para gerenciar e usar qualquer serviço de diretório
que tenha um provedor ADSI.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Who usará interfaces de serviço do
Active Directory?
Artigo • 03/06/2023

Os administradores de rede usarão ADSI para automatizar tarefas administrativas


comuns, como adicionar usuários e grupos, gerenciar impressoras e definir permissões
em recursos de rede.

Os ISVs (fornecedores independentes de software) e os desenvolvedores de usuários


finais usarão ADSI para "habilitar" seus produtos e aplicativos. Os serviços podem se
publicar em um diretório, os clientes podem usar o diretório para localizar os serviços e
ambos podem usar o diretório para localizar e manipular outros objetos de interesse.
Como as Interfaces de Serviço do Active Directory são independentes dos serviços de
diretório subjacentes, os produtos e aplicativos habilitados para diretório funcionarão
com êxito em vários ambientes de rede e diretório.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Serviços de Diretório hoje
Artigo • 12/06/2023

É comum encontrar vários diretórios administrativos implantados em uma única


organização. Esses diretórios incluem diretórios de recursos de rede, como diretórios
baseados em LDAP, como serviço de diretório do Microsoft Active Directory, serviço de
diretório do sistema operacional Windows, bem como diretórios específicos do
aplicativo, como o Microsoft Exchange.

O Desafio de Diretório
Vários diretórios na organização representam desafios complexos para usuários,
administradores e desenvolvedores. Esses problemas têm implantação limitada de
diretório amplo. Os usuários enfrentam vários logons e uma variedade de interfaces
para informações em vários diretórios. Os administradores enfrentam a complexidade
de gerenciar vários diretórios. Os usuários finais e os administradores querem que os
desenvolvedores de aplicativos usem um diretório administrativo existente, mas os
desenvolvedores enfrentam um dilema sobre qual deles usar. Cada diretório oferece
interfaces de aplicativo exclusivas. Um desenvolvedor deve escolher uma
implementação de diretório específica ou dar suporte a várias versões de seu aplicativo.
Como resultado, os desenvolvedores raramente usam serviços de diretório existentes.

Comentários
Esta página foi útil? ツ Yes ト No
Obter ajuda no Microsoft Q&A
Benefícios de usar interfaces de serviço
do Active Directory
Artigo • 13/06/2023

O ADSI oferece muitos benefícios aos administradores do sistema, conforme descrito na


tabela a seguir.

Recurso Benefício

Aberto Qualquer provedor de diretório pode implementar um provedor ADSI; os


usuários ganham liberdade de escolha em serviços de diretório sem sacrificar a
capacidade de gerenciamento.

DS Os aplicativos administrativos não estão fortemente associados ao serviço de


independente diretório de um determinado fornecedor. Aplicativos administrativos e outros
habilitados para diretório podem ser desenvolvidos sem a necessidade de
entender as APIs de diretório específicas do fornecedor. O mesmo aplicativo
pode funcionar em vários diretórios. O tempo de desenvolvimento e os custos
de suporte são reduzidos.

Suporte a Os objetos ADSI fornecem acesso fácil aos serviços de diretório por meio do
vários idiomas modelo de objeto de componente. Aplicativos COM podem ser escritos em
linguagens como Microsoft Visual Basic, Microsoft Visual Basic Scripting Edition
(VBScript) e C/C++.

Modelo de O ADSI consiste em um conjunto pequeno e fácil de aprender de interfaces.


programação
simples

Programável Qualquer linguagem compatível com Automação (por exemplo, Visual Basic,
VBScript, Perl, Rexx e outros) pode ser usada para desenvolver aplicativos de
serviço de diretório. Os administradores e desenvolvedores podem usar as
ferramentas que já conhecem. A produtividade é aprimorada — o tempo de
desenvolvimento e os custos de suporte são reduzidos.

Funcionalmente ISVs e usuários finais sofisticados podem desenvolver aplicativos sérios usando
rico os mesmos modelos ADSI usados para aplicativos administrativos com script
simples.

Extensível Provedores de diretório, ISVs e usuários finais podem estender o ADSI com
novos objetos e funções para adicionar valor ou atender a necessidades
exclusivas.

OLE DB ciente O ADSI fornece uma interface OLE DB para que os programadores
familiarizados com a programação de banco de dados por meio do OLE DB
possam ser produtivos rapidamente.
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


ADSI e controle de conta de usuário
Artigo • 13/06/2023

O Windows e o Windows Server têm o Controle de Conta de Usuário, que tem


ramificações para aplicativos que usam ADSI ( Interfaces de Serviço do Active Directory
). Especificamente, essas interfaces foram projetadas para serem executadas por uma
conta de usuário com privilégios de administrador no computador local.

Problema

Sempre que um aplicativo se conecta ao diretório e tenta criar um objeto ADSI, o


Esquema do Active Directory é verificado quanto a alterações. Se ele tiver sido alterado
desde a última conexão, o esquema será baixado e armazenado em um cache no
computador local. Em versões do Windows anteriores ao Windows Vista, o local padrão
para esse cache era

%systemroot%\SchCache\

No entanto, os aplicativos executados por contas padrão (ou seja, não administradores)
não terão acesso a esse diretório e, consequentemente, os aplicativos que usam
interfaces ADSI executadas nesse modo baixarão o esquema em todas as conexões, o
que afetará a taxa de transferência e o desempenho.

Soluções

Usuário único – para resolve esse problema, há novas chaves de controle do Registro do
Provedor ADSI que determinam os locais do Registro e os locais de arquivo para objetos
de esquema do Active Directory armazenados em cache. Se a chave do Registro

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\adsi\Cache\PerMachine

é definido como 0 (zero), cada usuário terá um local de armazenamento diferente para
ADSI; As chaves do registro serão armazenadas em

HKEY_CURRENT_USER\Software\Microsoft\ADs\Providers\LDAP\

e arquivos de cache serão armazenados em

%LOCALAPPDATA%\Microsoft\Windows\SchCache

Essas configurações são as configurações padrão em computadores que executam o


Windows Server 2008 ou o Windows Vista.
Multiusuário – se você estiver executando aplicativos ADSI em um computador com
muitas contas de usuário (por exemplo, um servidor Web), é preferível não ter muitas
cópias do cache do Esquema do Active Directory usando grandes quantidades de
espaço em disco. Definindo a chave do Registro

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\adsi\Cache\PerMachine

para 1 (um) reverter ADSI para o comportamento anterior; todos os objetos de Esquema
do Active Directory serão armazenados em seus locais anteriores; a chave do Registro
estará em

HKEY_LOCAL_MACHINE\Software\Microsoft\ADs\Providers\LDAP

e o arquivo de cache estará em

%systemroot%\SchCache

Nesse caso, as contas de administrador devem executar o aplicativo, o que fará com que
o arquivo de esquema seja armazenado em cache no local global para uso futuro pelos
usuários menos privilegiados.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Rastreamento de eventos no ADSI
Artigo • 13/06/2023

O Windows Server 2008 e o Windows Vista apresentam o Rastreamento de Eventos em


ADSI ( Interfaces de Serviço do Active Directory ). Determinadas áreas do Provedor LDAP
ADSI têm uma implementação subjacente complexa ou que envolve uma sequência de
etapas que dificulta o diagnóstico de problemas. Para ajudar os desenvolvedores de
aplicativos a solucionar problemas, o Rastreamento de Eventos foi adicionado às
seguintes áreas:

Análise e download de esquema


A interface IADs no ADSI exige que o esquema LDAP seja armazenado em cache no
cliente para que os atributos possam ser empacotados corretamente (conforme descrito
no Modelo de Esquema ADSI). Para conseguir isso, o ADSI carrega o esquema de cada
processo (e para cada servidor/domínio LDAP) na memória de um arquivo de esquema
(.sch) que é salvo no disco local ou baixando-o do servidor LDAP. Processos diferentes
no mesmo computador cliente usam o esquema armazenado em cache no disco se ele
estiver disponível e aplicável.

Se o esquema não puder ser obtido do disco ou do servidor, o ADSI usará um esquema
padrão codificado. Quando isso ocorre, atributos que não fazem parte desse esquema
padrão não podem ser empacotados e ADSI retorna um erro ao recuperar esses
atributos. Uma série de fatores pode fazer com que isso aconteça, incluindo problemas
na análise do esquema e privilégios insuficientes para baixar o esquema. Geralmente, é
difícil determinar por que um determinado esquema padrão está sendo usado. Usar o
Rastreamento de Eventos nessa área ajudará a diagnosticar mais rapidamente o
problema e corrigi-lo.

Alterando e definindo a senha


ChangePassword e SetPassword empregam mais de um mecanismo para executar a
operação solicitada com base na configuração disponível (conforme descrito em
Configuração e Alteração de senhas de usuário com o provedor LDAP). Quando
ChangePassword e SetPassword falham, pode ser difícil determinar exatamente por quê
e o Rastreamento de Eventos ajudará a solucionar problemas com esses métodos.

Cache de Associação ADSI


O ADSI tenta reutilizar internamente as conexões LDAP sempre que possível (consulte
Cache de conexão). Ao solucionar problemas, é útil rastrear se uma nova conexão foi
aberta para comunicação com o servidor ou se uma conexão existente foi usada.
Também pode ser útil rastrear o ciclo de vida do cache de conexão (às vezes chamado
de cache de associação) e sua criação ou fechamento e se ocorreu uma indicação de
conexão. No caso de uma associação sem servidor, ADSI chama o localizador dc para
selecionar um servidor para o domínio do contexto do usuário. EM seguida, o ADSI
mantém um cache do mapeamento de servidor de domínio para conexões
subsequentes. O Rastreamento de Eventos ajuda a rastrear a seleção do DC e, portanto,
é útil na solução de problemas relacionados à conexão.

Habilitando o rastreamento e iniciando uma


sessão de rastreamento
Para ativar o rastreamento ADSI, crie a seguinte chave do Registro:

HKEY_LOCAL_MACHINE\Sistema\Currentcontrolset\Serviços\Adsi\Rastreamento\Proc
essname

ProcessName é o nome completo do processo que você deseja rastrear, incluindo sua
extensão (por exemplo, "Svchost.exe"). Além disso, você pode colocar um valor opcional
do tipo DWORD chamado PID nessa chave. É altamente recomendável que você defina
esse valor e, assim, rastreie apenas um processo específico. Caso contrário, todas as
instâncias do aplicativo especificadas pelo ProcessName serão rastreadas.

Em seguida, execute o seguinte comando:

tracelog.exe -startsessionname **-guid #**provider_guid-ffilename-flagtraceFlags-


leveltraceLevel

sessionname é simplesmente um identificador arbitrário que é usado para rotular a


sessão de rastreamento (você precisará consultar esse nome de sessão mais tarde
quando parar a sessão de rastreamento). O GUID para o provedor de rastreamento ADSI
é "7288c9f8-d63c-4932-a345-89d6b060174d". filename especifica o arquivo de log no
qual os eventos serão gravados. traceFlags deve ser um dos seguintes valores:

Sinalizador Valor

DEBUG_SCHEMA 0x00000001

DEBUG_CHANGEPWD 0x00000002

DEBUG_SETPWD 0x00000004
Sinalizador Valor

DEBUG_BINDCACHE 0x00000008

Esses sinalizadores determinam quais métodos ADSI serão rastreados, de acordo com a
tabela a seguir:

Sinalizador Método

DEBUG_SCHEMA LdapGetSchema
GetSchemaInfoTime
LdapReadSchemaInfoFromServer
ProcessSchemaInfo
HelperReadLdapSchemaInfo
ProcessClassInfoArray
ReadSchemaInfoFromRegistry
StoreSchemaInfoFromRegistry
AttributeTypeDescription
ObjectClassDescription
DITContentRuleDescription
DirectoryString
DirectoryStrings
DITContentRuleDescription

DEBUG_CHANGEPWD CADsUser::ChangePassword

DEBUG_SETPWD CADsUser::SetPassword
Sinalizador Método

DEBUG_BINDCACHE GetServerBasedObject
GetServerLessBasedObject
GetGCDomainName
GetDefaultDomainName
GetUserDomainFlatName
BindCacheLookup
EquivalentPortNumbers
CanCredentialsBeReused
BindCacheAdd
BindCacheAddRef
AddReferralLink
CommonRemoveEntry
BindCacheDerefHelper
NotifyNewConnection
QueryForConnection
LdapOpenBindWithCredentials
LdapOpenBindWithDefaultCredentials

Você pode combinar sinalizadores combinando os bits apropriados no argumento


traceFlags . Por exemplo, para especificar os sinalizadores DEBUG_SCHEMA e
DEBUG_BINDCACHE , o valor de traceFlags apropriado seria 0x00000009.

Por fim, o sinalizador traceLevel deve ser um dos seguintes valores:

Sinalizador Valor

TRACE_LEVEL_ERROR 0x00000002

TRACE_LEVEL_INFORMATION 0x00000004

TRACE_LEVEL_INFORMATION faz com que o processo de rastreamento registre todos


os eventos, enquanto TRACE_LEVEL_ERROR faz com que o processo de rastreamento
registre apenas eventos de erro.

Para encerrar o rastreamento, execute o seguinte comando:

tracelog.exe -stopsessionname

No exemplo anterior, sessionname é o mesmo nome que o fornecido com o comando


que iniciou a seção de rastreamento.

Comentários
É mais eficaz rastrear apenas processos específicos especificando um PID específico do
que rastrear todos os processos em um computador. Se você precisar rastrear vários
aplicativos no mesmo computador, pode haver um impacto no desempenho; há uma
saída substancial de depuração em seções orientadas ao desempenho do código. Além
disso, os administradores devem ter cuidado para definir corretamente as permissões
dos arquivos de log ao rastrear vários processos; caso contrário, qualquer usuário
poderá ler os logs de rastreamento e outros usuários poderão rastrear processos que
contêm informações seguras.

Por exemplo, presume que o administrador configure o rastreamento para um aplicativo


"Test.exe" e não especifique um PID no registro para rastrear várias instâncias do
processo. Agora, outro usuário deseja rastrear o aplicativo "Secure.exe". Se os arquivos
de log de rastreamento não estiverem corretamente restritos, tudo o que o usuário
precisa fazer é renomear "Secure.exe" para "Test.exe" e ele será rastreado. Em geral, é
melhor rastrear apenas processos específicos durante a solução de problemas e
remover a chave do Registro de rastreamento assim que a solução de problemas for
feita.

Como habilitar o Rastreamento de Eventos produzirá arquivos de log extras, os


administradores devem monitorar cuidadosamente os tamanhos dos arquivos de log; A
falta de espaço em disco no computador local pode causar uma negação de serviço.

Cenários de Exemplo
Cenário 1: o administrador vê um erro inesperado em um aplicativo que define senhas
para contas de usuário, portanto, eles seguiriam as etapas a seguir para corrigir o
problema usando o Rastreamento de Eventos.

1. Escrever um script que reproduza o problema e crie a chave do Registro

HKEY_LOCAL_MACHINE\Sistema\Currentcontrolset\Serviços\Adsi\Rastreamento\
cscript.exe

2. Inicie uma sessão de rastreamento, definindo traceFlags como 0x2


(DEBUG_CHANGEPASSWD) e traceLevel como 0x4 (TRACE_LEVEL_INFORMATION),
usando o seguinte comando:

tracelog.exe -start scripttrace -guid #7288c9f8-d63c-4932-a345-89d6b060174d -


f .\adsi.etl -flag 0x2 -level 0x4

3. Execute cscript.exe com o script de teste para reproduzir o problema e, em


seguida, encerre a sessão de rastreamento:
tracelog.exe -stop scripttrace

4. Excluir a chave do Registro

HKEY_LOCAL_MACHINE\Sistema\Currentcontrolset\Serviços\Adsi\Rastreamento\
cscript.exe

5. Execute a ferramenta ETW Tracerpt.exe para analisar as informações de


rastreamento do log:

tracelog.exe -start scripttrace -guid #7288c9f8-d63c-4932-a345-89d6b060174d -


f .\adsi.etl -flag 0x2 -level 0x4

Cenário 2: o administrador deseja rastrear as operações de análise e download de


esquema em um aplicativo ASP chamado w3wp.exe que já está em execução. Para
fazer isso, o administrador seguiria as seguintes etapas:

1. Criar a chave do Registro

HKEY_LOCAL_MACHINE\Sistema\Currentcontrolset\Serviços\Adsi\Rastreamento\
w3wp.exe

e dentro dessa chave, crie um valor do tipo DWORD chamado PID e defina-o
como a ID do processo da instância de w3wp.exe que está sendo executada no
momento no computador local.

2. Em seguida, eles criam uma sessão de rastreamento, definindo traceFlags como


0x1 (DEBUG_SCHEMA) e traceLevel como 0x4 (TRACE_LEVEL_INFORMATION):

tracelog.exe -start w3wptrace -guid #7288c9f8-d63c-4932-a345-89d6b060174d


-f .\w3wp.etl -flag 0x1 -level 0x4

3. Reproduza a operação que precisa de solução de problemas.

4. Encerre a sessão de rastreamento:

tracelog.exe -stop w3wptrace

5. Exclua a chave do Registro


HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\adsi\Tracing\w3wp.
exe.

6. Execute a ferramenta ETW tracerpt.exe para analisar as informações de


rastreamento do log:

tracerpt.exe .\w3wp.etl -o -report


Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Arquitetura de interfaces de serviço do
Active Directory
Artigo • 12/06/2023

Muitos serviços de diretório são hierárquicos e, portanto, se prestam a um modelo de


objeto hierárquico. Esta seção usa representações de objeto COM para ilustrar vários
recursos adsi.

Na figura do modelo de objeto a seguir, um objeto de sistema de nível superior contém


um objeto Namespace para cada provedor ADSI instalado.

Cada um dos objetos Namespace é um contêiner que contém os nós raiz de nível
superior de cada servidor, domínio ou quaisquer outros tipos de objetos de sistema de
diretório são definidos como raízes em cada serviço de diretório.

O ADSI fornece um conjunto de objetos e interfaces predefinidos para que os


aplicativos cliente possam interagir com os serviços de diretório usando um conjunto
uniforme de métodos. No entanto, o ADSI pode não fornecer acesso a todos os
recursos de um serviço de diretório. Para usar melhor o conjunto de recursos completo
de cada serviço de diretório, o ADSI fornece um modelo de esquema que provedores de
serviços de diretório e fornecedores de software de terceiros podem usar para estender
recursos além das interfaces fornecidas no ADSI.

Os objetos de contêiner de nó raiz, encontrados em cada objeto Namespace do


provedor, incluem um objeto de contêiner de esquema ADSI. Esse objeto contém a
definição de todos os recursos para esse provedor. Para obter mais informações,
consulte Adsi Schema Model.

Esta seção inclui os tópicos a seguir:

Objetos de interfaces de serviço do Active Directory


Namespaces
Provedor de Interfaces de Serviço do Active Directory
Modelo de esquema ADSI

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Objetos de interfaces de serviço do
Active Directory
Artigo • 12/06/2023

O modelo de objeto ADSI consiste em objetos COM. Os clientes manipulam objetos


com interfaces. Os provedores ADSI implementam os objetos e suas interfaces.

Objetos ADSI são objetos COM que representam um item dentro de um serviço de
diretório: computadores, usuários, arquivos, servidores, impressoras, filas de impressão e
assim por diante; ou seja, elementos com os quais os administradores de rede
trabalham diariamente. ADSI define diferentes tipos de objetos para representar
diferentes tipos de elementos. Cada objeto, conforme mostrado na figura a seguir, dá
suporte a uma ou mais interfaces COM que permitem o acesso aos dados do objeto,
geralmente chamados de metadados.

Como as interfaces COM são conjuntos de propriedades e métodos logicamente


conectados, você pode pensar em cada interface como um identificador para o objeto
que fornece acesso a apenas um conjunto de funções lógicas por vez. A tabela a seguir
lista elementos ADSI fundamentais.

Interface Descrição

Iads Usado para identificação de objeto. Como a interface fundamental necessária


em todos os objetos ADSI, as IADs fornece acesso a metadados de objeto,
incluindo sua definição no esquema ADSI. As IADs também fornecem acesso
às propriedades e métodos que gerenciam dados de objeto no cache de
propriedades.

IADsContainer Usado para gerenciamento e detecção de objetos. Todos os objetos de


contêiner ADSI exigem a interface IADsContainer para gerenciar a criação,
exclusão, cópia e movimentação de objetos, associação e enumeração.

IADsPropertyList Usado para o gerenciamento de propriedades de objeto. A interface


IADsPropertyList otimiza o gerenciamento de dados de objeto no cache de
propriedades.
Interface Descrição

IDirectoryObject Usado para acesso direto ao objeto. A interface IDirectoryObject fornece


acesso a objetos de baixo nível para clientes que não usam a Automação. Essa
interface ignora o cache de propriedades do objeto e fornece acesso direto às
propriedades do objeto. Para obter mais informações, consulte As IADs e
interfaces IDirectoryObject.

IUnknown Usado para o gerenciamento de objetos COM. A interface IUnknown é


necessária para todos os objetos COM.

IDispatch Usado para invocação de método e dados da biblioteca de tipos. A interface


IDispatch é necessária para todos os objetos de Automação.

Objetos ADSI mais complexos podem expor interfaces adicionais. Por exemplo,
IADsCollection dá suporte a métodos que gerenciam coleções de elementos de
diretório do mesmo tipo de dados. Os métodos IADsGroup gerenciam as coleções de
casos especiais de objetos que dão suporte à interface IADsMembers . Para provedores
que dão suporte a ele, a interface IDirectorySearch dá suporte a métodos para
consultar serviços de diretório. Além disso, o ADSI fornece interfaces que representam
itens lógicos e físicos conhecidos. Por exemplo, objetos ADSI que representam usuários
dão suporte a IADsUser, aqueles que representam computadores que dão suporte a
IADsComputer e assim por diante. Para obter mais informações sobre objetos ADSI,
consulte As IADs e interfaces IDirectoryObject. Nem todos os provedores implementam
todas as interfaces ou todos os métodos e propriedades em todas as interfaces. Para
obter mais informações, consulte Referência ADSI.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Namespaces
Artigo • 13/06/2023

Os objetos que residem em um determinado namespace são identificados por um


nome exclusivo. Por exemplo, os arquivos armazenados em uma unidade de disco do
computador residem no namespace do sistema de arquivos. O nome exclusivo de um
arquivo é baseado no local em que ele é armazenado no namespace do sistema de
arquivos. Por exemplo:

C++

C:\public\documents\adsi\adsi_spec.doc

Os namespaces do serviço de diretório também identificam os objetos que contêm por


nomes exclusivos que geralmente são baseados no local no diretório em que o objeto
pode ser encontrado. Por exemplo, em um diretório X.500, um determinado objeto
pode ter um nome como este:

C++

CN=John,OU=Marketing,O=Fabrikam

Diferentes serviços de diretório usam formulários diferentes para nomear os objetos


que eles contêm. Isso torna difícil lidar com namespaces diferentes, especialmente para
desenvolvedores, considerando todos os diferentes ambientes nos quais o código pode
estar em execução.

Uma meta do ADSI (Active Directory Service Interfaces) é fornecer uma estrutura de
nomenclatura que permita o acesso a namespaces de diferentes provedores de serviços
de diretório.

ADSI define uma convenção de nomenclatura que pode identificar exclusivamente um


objeto em um ambiente heterogêneo. Esses nomes são chamados de cadeias de
caracteres ADsPath. As cadeias de caracteres do ADsPath tomam várias formas:

C++

"ADs://"

"LDAP://"

"WinNT://"
Formatos adicionais do ADsPath podem ser introduzidos por diferentes provedores
ADSI (como o provedor ADSI para o servidor dos Serviços de Informações da Internet,
que dão suporte aos ADsPaths "IIS://").

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Provedor de Interfaces de Serviço do
Active Directory
Artigo • 03/06/2023

Um provedor ADSI contém a implementação de objetos ADSI e objetos dependentes


para um namespace específico. A ilustração a seguir mostra que os clientes estão
preocupados apenas com a obtenção e o uso de interfaces em um objeto, e não com os
detalhes de onde e como o software de um objeto é implementado.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Modelo de esquema ADSI
Artigo • 03/06/2023

Um esquema é semelhante a um dicionário no qual ele contém a definição de todos os


tipos de objeto conhecidos por um serviço de diretório. Aplicativos cliente ADSI podem
navegar por um esquema para descobrir os recursos de qualquer implementação ADSI
determinada. Além disso, o ADSI fornece interfaces de gerenciamento de esquema que
podem ser usadas para se comunicar com o esquema subjacente de um serviço de
diretório.

Alguns esquemas são extensíveis e provedores ADSI ou fornecedores de terceiros


podem optar por publicar novas interfaces ou propriedades adicionais para interfaces
existentes lá. Os clientes ADSI usam esses dados para determinar quais recursos têm
suporte para cada serviço de diretório.

Há três tipos de objetos de esquema: classes, propriedades e sintaxes, cada um,


respectivamente, oferecendo suporte às interfaces de gerenciamento de esquema
IADsClass, IADsProperty e IADsSyx.

7 Observação

Classe é um termo sobrecarregado. Há classes C++, classes Java, classes COM e


classes ADSI. Neste documento, a classe word, a menos que qualificada de outra
forma, refere-se a uma categoria ou tipo de objeto de esquema.

O ADSI abstrai o esquema de cada serviço de diretório e o coloca em cada nó raiz de


nível superior no objeto Namespace . Para identificar quais classes um serviço de
diretório dá suporte em um determinado nó raiz, enumera o objeto de esquema e
obtém uma lista de objetos de classe, objetos de propriedade e objetos de sintaxe. Para
obter mais informações, consulte Como usar o esquema ADSI.

Cache de esquema do provedor LDAP ADSI


O provedor LDAP para ADSI tenta armazenar dados de esquema em cache no
computador local. Um subschema é identificado por um nome diferenciado
armazenado no atributo subSchemaSubEntry localizado na raiz da empresa do serviço
de diretório (rootDSE). Além de fornecer os dados de subschema, os servidores LDAP v3
devem expor um atributo modifyTimeStamp usado para determinar a última vez em
que o esquema foi modificado.

Quando ADSI é associado pela primeira vez ao servidor LDAP, ele recupera os dados de
subschema usando o atributo subSchemaSubEntry . Se o ADSI conseguir localizar o
objeto subschema, ele armazenará um ponteiro para os dados no registro no
computador que está se conectando ao servidor LDAP. Para obter informações sobre
exatamente onde esses valores são armazenados no registro, consulte ADSI e Controle
de Conta de Usuário.

O ADSI tenta processar os dados do esquema e lê o atributo modifyTimeStamp . Se o


atributo modifyTimeStamp existir e o ADSI processar com êxito o esquema, o ADSI
gravará o subschema no disco e criará os dois valores do Registro a seguir na chave. Se
os dados de subschema existirem, mas não puderem ser processados, nenhum desses
valores do Registro será criado:

Um valor time , que contém o atributo modifyTimeStamp . Esse valor é usado


para garantir que os dados do esquema sejam atuais e impeça o recarregamento
constante dos dados do esquema.
Um valor de arquivo , que contém o caminho para onde o ADSI armazena os
dados do esquema no sistema de arquivos. Por padrão, o ADSI armazena em
cache o subschema no <diretório systemroot>\SchCache com um nome de
arquivo correspondente ao nome do servidor LDAP.

Se os dados de subschema puderem ser processados, mas nenhum atributo


modifyTimeStamp for exposto, os dados do esquema serão armazenados em cache na
memória, mas não gravados em disco. Se um servidor LDAP v3 tiver sido contatado por
meio do ADSI no computador local e um subschema armazenado em cache não estiver
presente, provavelmente será por um dos seguintes motivos:

O servidor não expôs as propriedades corretas.


O ADSI não pôde processar o esquema.
O ADSI não pôde gravar o arquivo no sistema de arquivos.

Comentários
Esta página foi útil? ツ Yes ト No
Obter ajuda no Microsoft Q&A
Suporte à linguagem de programação
Artigo • 13/06/2023

Você pode escrever aplicativos cliente ADSI em muitos idiomas. Para a maioria das
tarefas administrativas, o ADSI define interfaces e objetos acessíveis de linguagens
compatíveis com a Automação. Por exemplo, o sistema de desenvolvimento do
Microsoft Visual Basic, o VBScript (Microsoft Visual Basic Scripting Edition) e o Java, bem
como linguagens mais conscientes de desempenho e eficiência, como C e C++.

A integração suave com o Active Server Pages e o VBScript facilita a gravação de


aplicativos da Internet que acessam serviços de diretório. Para integração com
aplicativos OLE DB, o ADSI fornece um provedor OLE DB dando suporte a um
subconjunto das interfaces de consulta OLE DB. O provedor OLE DB dá suporte ao
acesso somente leitura ao Active Directory.

Para aplicativos da Internet, o uso de scripts em arquivos ASP (Página do Servidor Ativo)
pode criar e manipular objetos ADSI no servidor e exibir os resultados em uma página
da Web. No Console de Gerenciamento da Microsoft, os snap-ins de administração de
serviço de diretório podem usar ADSI para localizar serviços de diretório de interesse.
Em suma, as Interfaces de Serviço do Active Directory podem fornecer acesso a um
conjunto amplo e diversificado de serviços de diretório, incluindo aqueles ainda não
criados.

Para acesso a estruturas que usam APIs tradicionais, a arquitetura ADSI define interfaces
de baixo nível que não dão suporte à Automação acessíveis de linguagens como C e
C++. Essas interfaces são pouco mais do que wrappers COM para protocolos de rede
para um serviço de diretório.

Escrever código nas interfaces publicadas permite que seu aplicativo alcance serviços de
diretório para todos os provedores ADSI instalados e integre os dados resultantes. Com
pouca ou nenhuma alteração no código, seu aplicativo pode continuar a acessar
serviços de diretório adicionais em sua rede à medida que novos provedores ADSI
forem instalados.

A figura a seguir mostra como o ADSI se encaixa em um ambiente de aplicativo. Se o


aplicativo é escrito no Visual Basic, C/C++, VBScript, sistema de desenvolvimento JScript
da Microsoft ou como um aplicativo Web usando o Active Server Pages, as Interfaces de
Serviço do Active Directory fornecem um acesso limpo e fácil de usar aos serviços de
diretório subjacentes sem precisar usar as APIs de rede nativas.
Conforme mostrado na figura anterior, os clientes que não dão suporte à Automação
têm acesso a todas as interfaces ADSI, incluindo interfaces COM puras com a convenção
de nomenclatura IDirectoryXXX e interfaces COM de Automação com a convenção de
nomenclatura IADsXXX. Como os clientes solicitam predominantemente informações de
serviços de diretório, o modelo de consulta flexível ADSI por meio do OLE DB e do
IDirectorySearch é eficaz.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Propriedades e atributos ADSI
Artigo • 12/06/2023

Às vezes, os atributos são chamados de propriedades. Isso pode causar confusão. Esta
documentação usa as definições a seguir para propriedades e atributos.

As propriedades são valores nomeados associados a um objeto de programação. Por


exemplo, a interface IADs expõe propriedades como Classe e Nome.

Atributos são os dados associados a objetos em um serviço de diretório. Por exemplo,


um objeto de usuário terá um atributo chamado cn que contém uma cadeia de
caracteres que é o nome diferenciado comum ou relativo do objeto. Os atributos são
acessíveis por meio de métodos de interface ADSI, como IADs.Get e IADs.Put.

Para obter mais informações sobre propriedades e atributos ADSI, consulte:

O Cache de Atributos ADSI


Atributos de valor único versus múltiplo
Atributos operacionais do Active Directory

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


O cache de atributos ADSI
Artigo • 13/06/2023

O modelo de objeto ADSI fornece um cache de atributos do lado do cliente para cada
objeto ADSI. O cache de atributo é comparável a uma tabela na memória que contém
os nomes e valores da maioria dos atributos de objeto que foram baixados. Alguns
atributos, como atributos operacionais, não são armazenados em cache. O ADSI usa o
cache de propriedade para aprimorar o desempenho da manipulação de atributo e
adicionar funcionalidade de transação para operações de leitura e gravação de atributo.
Essa funcionalidade é essencial para clientes escritos em linguagens que não têm
mecanismo de envio em lote nativo para definir atributos, como o sistema de
desenvolvimento do Microsoft Visual Basic. Sem o cache de propriedades ADSI, esses
clientes teriam que acessar o servidor sempre que um atributo fosse lido ou gravado.

Quando um objeto é criado ou associado pela primeira vez, o cache de propriedades do


objeto fica vazio. Quando o método IADs::GetInfo é chamado, o ADSI carrega os
atributos solicitados para o objeto do serviço de diretório subjacente no cache local.
Quando um valor de atributo específico é lido e o cache está vazio, o ADSI faz uma
chamada implícita para o método IADs::GetInfo . Quando o cache é preenchido, todas
as operações de leitura de atributo funcionam apenas no conteúdo do cache.

Quando um valor de atributo é gravado, o novo valor é armazenado no cache local até
que o método IADs::SetInfo seja chamado. Quando o método IADs::SetInfo é chamado,
os atributos no cache são confirmados no serviço de diretório subjacente. Depois que o
método IADs::SetInfo for chamado, os valores permanecerão no cache até serem
atualizados explicitamente com outra chamada para o método IADs::GetInfo .

) Importante

O método IADs::GetInfo deve ser usado com cuidado porque esse método sempre
substituirá os valores de atributo no cache do serviço de diretório subjacente,
mesmo que o valor armazenado em cache tenha sido alterado. Ou seja, ele
substituirá os valores de atributo que foram alterados no cache, mas não
confirmados no serviço de diretório subjacente com uma chamada para o método
IADs::SetInfo .

A figura a seguir mostra os diferentes métodos usados para operar no cache.


Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Atributos de valor único versus múltiplo
Artigo • 13/06/2023

Os atributos que podem existir em um diretório normalmente são definidos no


esquema do diretório. A definição de esquema de um atributo especifica várias
características do atributo, como o tipo de dados e se uma instância do atributo pode
ter vários valores.

Uma instância de um atributo de valor único pode conter um único valor. Uma instância
de um atributo de vários valores pode conter um único valor ou vários valores. O Active
Directory não cria atributos com valores vazios— o atributo contém um valor válido ou
não existe no objeto .

7 Observação

No Active Directory e na maioria dos outros servidores LDAP, a ordem dos valores
em um atributo de vários valores é indefinida. Além disso, cada valor de um
atributo de vários valores deve ser exclusivo.

O ADSI normalmente carrega dados de esquema se o diretório der suporte a um


esquema, como o Active Directory faz. Como o ADSI conhece a sintaxe de atributos no
esquema, você não precisa especificar o tipo de atributo ao acessá-lo. O ADSI realiza
marshaling de valores de atributo para o tipo de dados apropriado, conforme definido
no esquema.

Se o diretório não tiver nenhum esquema, forneça o tipo de dados ao acessar um


atributo.

7 Observação

Active Directory, Exchange, Windows NT 4.0 e Servidor do Site têm um esquema.


Além disso, o Active Directory tem um esquema extensível.
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Atributos operacionais do Active
Directory
Artigo • 03/06/2023

Os atributos operacionais são propriedades armazenadas e usadas pelo diretório para


fins administrativos. Por exemplo, você pode manter um atributo operacional para
registrar a data e a hora em que outro atributo é modificado. Os atributos operacionais
devem ser explicitamente recuperados com uma chamada para GetInfoEx.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Usando interfaces de serviço do Active
Directory
Artigo • 13/06/2023

O ADSI (Active Directory Service Interfaces) fornece os meios para que os aplicativos
cliente de serviços de diretório usem um conjunto de interfaces para se comunicar com
qualquer namespace que forneça uma implementação ADSI. Os clientes ADSI usam as
interfaces de serviço do Active Directory bem definidas no lugar das chamadas à API
específicas da rede para obter acesso mais simples aos serviços de um namespace.

As Interfaces de Serviço do Active Directory estão em conformidade com o COM


(Component Object Model) e dão suporte a recursos COM padrão.

O ADSI fornece interfaces compatíveis com a Automação para controladores associados


ao nome, como Java, sistema de desenvolvimento do Microsoft Visual Basic e Visual
Basic Scripting Edition (VBScript). O ADSI também pode fornecer uma interface que
pode otimizar o desempenho de interfaces que não estão em conformidade com a
Automação, a serem usadas com ambientes de linguagem como C e C++.

O ADSI também fornece as interfaces não automação, IDirectoryObject e


IDirectorySearch, para dar suporte ao gerenciamento e consultas de objetos de
diretório.

Além disso, a ADSI fornece seu próprio provedor OLE DB, para que qualquer cliente que
já esteja usando o OLE DB, incluindo aqueles que usam Objetos de Dados ActiveX,
possa consultar os serviços de diretório diretamente.

Os aplicativos Web que usam o Active Server Pages também podem programar o
acesso a serviços de diretório por meio do ADSI.

Os clientes ADSI podem descobrir programaticamente todos os provedores ADSI em


um site e usar as mesmas interfaces para se comunicar com cada namespace. À medida
que provedores adicionais são instalados, os clientes ADSI também podem se
comunicar, sem recompilar, com os novos namespaces.

Este guia de programação descreve como o ADSI funciona e fornece informações para
executar tarefas específicas no ADSI. Os seguintes tópicos são abordados:

Associação a um objeto ADSI


Criando e excluindo objetos
Acessando e manipulando dados com ADSI
Usando o esquema ADSI
Coleções e grupos
Enumerando objetos ADSI
Pesquisando no Active Directory
Modelo de segurança ADSI
Extensões ADSI
Usando ADSI com o Exchange
Interfaces do utilitário ADSI
Programando ADSI com Java/COM

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Associação a um objeto ADSI
Artigo • 13/06/2023

Conectar-se a um objeto em um serviço de diretório é conhecido como associação.


Associar a um objeto ADSI é a primeira etapa para se comunicar com o sistema de
diretório subjacente. Um objeto deve ser associado a para navegar pelo namespace,
pesquisar dados, modificar dados ou representar um usuário. Também é possível
fornecer características de associação adicionais, como nome de usuário, senha, nome
do servidor, métodos de criptografia e autenticação protegida. As características de
associação adicionais reais que podem ser usadas dependerão do provedor.

Para obter mais informações sobre a associação ADSI, consulte:

Cadeia de caracteres de associação


Tipos de associação específicos ao Active Directory
Problemas de associação para ambientes mistos
Associar programaticamente usando uma interface ADSI
Cache de conexão
Associação a objetos filho
Associação ao pai de um objeto
Opção de associação rápida para operações de gravação/modificação em lote
Escolhendo uma interface para associação

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Cadeia de caracteres de associação
Artigo • 13/06/2023

Devido ao número de objetos acessíveis de um serviço de diretório, podem ocorrer


colisões de nomenclatura. A cadeia de caracteres de associação, que normalmente é
conhecida como ADsPath, permite que você especifique um objeto específico sem
causar uma colisão de nomenclatura. Isso pode ser aplicado a um único provedor de
serviços de diretório ou a vários provedores de serviços de diretório.

Um ADsPath é uma cadeia de caracteres que identifica exclusivamente um objeto ADSI


em um serviço de diretório. Como os objetos ADSI existem no contexto do namespace
do serviço de diretório subjacente, parte da sintaxe de um nome ADsPath é específica
do provedor.

A tabela a seguir lista os provedores ADSI fornecidos por padrão.

Provedor Descrição

Winnt Usado para se comunicar com controladores de domínio do Windows. Para obter
mais informações sobre o WinNT ADsPath, consulte WinNT ADsPath.

LDAP Usado para se comunicar com servidores LDAP, como o Active Directory. Para obter
mais informações sobre o LDAP ADsPath, consulte LDAP ADsPath.

Anúncios Fornece uma implementação IADsNamespaces que pode ser usada para enumerar
todos os provedores ADSI instalados no cliente.

Use esses nomes de provedor para acessar o namespace do provedor padrão. Por
exemplo, se você associar ao LDAP, ADSI será associado a um contêiner que contém o
objeto de domínio conectado no momento. Se você associar ao WinNT, ADSI será
associado a um contêiner que contém objetos correlacionados a todos os domínios na
rede.

Os elementos iniciais da cadeia de caracteres ADsPath são o progID (identificador


programático) do provedor ADSI, seguido por "://", seguido pela sintaxe ditada pelo
namespace do provedor. A cadeia de caracteres progID pode ou não diferenciar
maiúsculas de minúsculas, dependendo do provedor. As cadeias de caracteres progID
para os provedores listados acima diferenciam maiúsculas de minúsculas.

A cadeia de caracteres de caminho pode ou não diferenciar maiúsculas de minúsculas,


dependendo do provedor. As cadeias de caracteres de caminho para os provedores
listados acima não diferenciam maiúsculas de minúsculas.

Veja a seguir exemplos de ADsPaths.


syntax

LDAP://CN=Jeff Smith,CN=users,DC=fabrikam,DC=com
LDAP://server01/CN=Jeff Smith,CN=users,DC=fabrikam,DC=com

WinNT://MyDomain/ComputerName,Computer
WinNT://MyDomain/UserAccount

Para localizar todos os provedores instalados em seu computador, associe-se ao


provedor do ADs, conforme mostrado no exemplo de código a seguir.

VB

Set x = GetObject("ADs:")
For Each provider In x
provider.Name
Next

Usando o provedor LDAP, você pode especificar o ADsPath em um formulário DN


(nome diferenciado) X.500, começando com a marca CN, ou pode especificar seu
inverso hierárquico, começando com a marca O. O formulário usado no ADsPath inicial
determina a ordem das marcas.

A tabela a seguir lista os caracteres especiais do ADsPath.

Nome Caractere Descrição

Aspas " Usado para citar qualquer parte do ADsPath que possa conter um
duplas caractere especial para que a cadeia de caracteres seja interpretada
literalmente. Por exemplo, "CN=Name/Prefix".

Barra \ Usado para preceder caracteres especiais para significar que eles devem
invertida ser usados como literais. Para obter mais informações e uma lista de
caracteres especiais, consulte Nomes diferenciados.

Barra / Separador de componentes.

Colchetes <> Delimita um ADsPath dentro de outra convenção de nomenclatura.


angulares

Para delimitar um ADsPath em uma especificação de pesquisa ou como parte de uma


URL, use o colchete angular esquerdo e direito (<>). Por exemplo, "
<WinNT://MyDomain/UserAccount>".

Alguns provedores ADSI podem ter adicionado restrições de sintaxe devido aos
requisitos de namespace.
Opções de associação do Active Directory
O Active Directory fornece a capacidade de associar a um objeto usando vários outros
tipos de cadeias de caracteres de associação, como um GUID (identificador global
exclusivo) COM ou um SID (identificador de segurança). Para obter mais informações,
consulte Associação ao Active Directory.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Tipos de associação específicos ao
Active Directory
Artigo • 03/06/2023

Além das associações LDAP discutidas anteriormente, o Active Directory apresenta


vários novos conceitos para associação a um objeto. Consulte os seguintes tópicos na
documentação Active Directory Domain Services:

Associação sem servidor e RootDSE


Associar-se ao Catálogo Global

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Problemas de associação para
ambientes mistos
Artigo • 12/06/2023

Para ambientes nos quais o domínio que contém o Active Directory tem uma relação de
confiança com um domínio Windows NT 4.0, pode haver um problema com o uso da
associação sem servidor para associar a objetos do Active Directory.

Em alguns ambientes de rede, relações de confiança foram configuradas entre


controladores de domínio que contêm o Active Directory e servidores Windows NT 4.0
com a finalidade de permitir a autenticação entre domínios. Nesses ambientes mistos,
se um usuário, que é membro do Windows NT 4.0, tentar usar a associação sem servidor
para associar a um objeto do Active Directory em um domínio confiável, a associação
falhará e um erro será retornado. Isso ocorre porque uma associação sem servidor usa a
função DsGetDcName para associar ao objeto no Active Directory, que depende do
DNS adequado.

Nesse cenário, o usuário Windows NT deve fornecer o nome de um domínio específico


ao qual se associar. A seguir, é mostrado um exemplo.

syntax

LDAP://fabrikam.com/OU=Sales

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Associar programaticamente usando
uma interface ADSI
Artigo • 03/06/2023

O ADSI fornece duas maneiras básicas de associar a um objeto:

Usando funções ADSI para associar diretamente a um objeto


Usando um objeto de dados ActiveX

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Usando funções ADSI para associar
diretamente a um objeto
Artigo • 13/06/2023

A associação diretamente a um objeto de diretório com ADSI pode ser executada de


várias maneiras. Os tópicos a seguir discutem métodos de associação compatíveis com
ADSI:

Associação com GetObject e ADsGetObject


Associação com ADsOpenObject e IADsOpenDSObject::OpenDSObject
Associação com criptografia

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Associação com GetObject e
ADsGetObject
Artigo • 13/06/2023

As funções GetObject e ADsGetObject são usadas para associar a objetos de serviço de


diretório sem autenticação. O aplicativo não é necessário para fornecer credenciais ao
acessar dados do serviço de diretório. O ADSI usa o contexto de segurança do thread de
chamada. No entanto, se a autenticação segura falhar, o ADSI tentará executar uma
associação simples com um nome de usuário nulo e uma senha nula. Se a associação
simples for bem-sucedida, o contexto do usuário para a associação será Convidado.
Uma associação simples usa autenticação de texto não criptografado. Como nenhum
nome de usuário ou senha é transmitido pela rede, esse não é um problema de
segurança.

A função GetObject é usada para associar a objetos de serviço de diretório em


linguagens que dão suporte à automação, como o Visual Basic. A função GetObject
requer uma cadeia de caracteres de moniker. No ADSI, a cadeia de caracteres de
associação é a cadeia de caracteres do moniker.

Em linguagens que não dão suporte diretamente à automação, como C ou C++, o ADSI
fornece a função ADsGetObject para associar a objetos de serviço de diretório. Como
alternativa, as funções MkParseDisplayName e MkParseDisplayNameEx podem ser
usadas para obter o mesmo resultado que GetObject.

Para um serviço em execução na conta LocalSystem, o contexto de segurança usado por


GetObject e ADsGetObject depende do computador no qual o serviço está sendo
executado. Se o serviço estiver em execução como LocalSystem em um controlador de
domínio, o serviço terá acesso completo no nível do sistema ao Active Directory. Se o
serviço não estiver em execução em um controlador de domínio, o serviço terá os
direitos de acesso e privilégios concedidos à conta de computador para o computador
no qual o serviço está sendo executado; isso é significativamente menos poderoso do
que o acesso no nível do sistema.

Exemplos
O exemplo de código do Visual Basic a seguir mostra como usar a função GetObject
para associar a um objeto .

VB
Dim myUser as IADs
Set myUser = GetObject("LDAP://CN=jeffsmith,DC=fabrikam,DC=com")

O exemplo de código C++ a seguir mostra como usar a função ADsGetObject para
associar a um objeto .

C++

IADs *pObject;
HRESULT hr;

// Initialize COM.
CoInitialize(NULL);

hr = ADsGetObject(L"LDAP://CN=jeffsmith,DC=fabrikam,DC=com",
IID_IADs,
(void**) &pObject);

if(SUCCEEDED(hr))
{
// Use the object.

// Release the object.


pObject->Release()
}

// Uninitialize COM.
CoUninitialize();

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Associação com ADsOpenObject e
IADsOpenDSObject::OpenDSObject
Artigo • 18/03/2023

A função ADsOpenObject e o método IADsOpenDSObject::OpenDSObject são usados


para associar a objetos de serviço de diretório quando as credenciais alternativas devem
ser especificadas e quando a criptografia de dados é necessária.

As credenciais do thread de chamada devem ser usadas quando possível. No entanto,


se as credenciais alternativas precisarem ser usadas, a função ADsOpenObject ou o
método IADsOpenDSObject::OpenDSObject deverão ser usadas. Se credenciais
alternativas forem usadas, é importante não armazenar a senha em cache. Várias
operações de associação podem ser executadas especificando o nome de usuário e a
senha para a primeira operação de associação e, em seguida, especificando apenas o
nome de usuário em associações subsequentes. O sistema configura uma sessão na
primeira chamada e usa a mesma sessão em chamadas de associação subsequentes,
desde que as seguintes condições sejam atendidas:

O mesmo nome de usuário em cada operação de associação.


Implemente a associação sem servidor ou associe ao mesmo servidor em cada
operação de associação.
Mantenha uma sessão aberta mantendo uma referência de objeto de uma das
operações de associação. A sessão é fechada quando a última referência de objeto
é lançada.

ADsOpenObject e IADsOpenDSObject::OpenDSObject usam o Windows NT SSPI


(Interfaces do Provedor de Suporte de Segurança) para permitir flexibilidade nas opções
de autenticação. A principal vantagem de usar essas interfaces é fornecer diferentes
tipos de autenticação para clientes do Active Directory e criptografar a sessão.
Atualmente, ADSI não permite que certificados sejam passados. Portanto, você pode
usar o SSL para criptografia e, em seguida, Kerberos, NTLM ou autenticação simples,
dependendo de como os sinalizadores são definidos no parâmetro dwReserved .

Você não pode solicitar um provedor de SSPI específico no ADSI, embora sempre
obtenha o protocolo de preferência mais alto. No caso de uma associação de cliente do
Windows a um computador que executa o Windows, o protocolo é Kerberos. Não
permitir um certificado para autenticação é aceitável no caso de uma página da Web
porque a autenticação ocorre antes de executar a página da Web.

Embora as operações open permitam que você especifique um usuário e uma senha,
você não deve fazer isso. Em vez disso, não especifique nenhuma credencial e use
implicitamente as credenciais do contexto de segurança do chamador. Para associar a
um objeto de diretório usando as credenciais do chamador com ADsOpenObject ou
IADsOpenDSObject::OpenDSObject, especifique NULL para nome de usuário e senha.

Por fim, para associar sem autenticação, use o sinalizador ADS_NO_AUTHENTICATION .


Nenhuma autenticação indica que ADSI tenta associar como um usuário anônimo ao
objeto de destino e não executa nenhuma autenticação. Isso é equivalente à solicitação
de associação anônima no LDAP e indica que todos os usuários estão incluídos no
contexto de segurança.

Se os sinalizadores de autenticação forem definidos como zero, ADSI executará uma


associação simples, enviada como texto sem formatação.

U Cuidado

Se um nome de usuário e uma senha forem especificados sem especificar


sinalizadores de autenticação, o nome de usuário e a senha serão transmitidos pela
rede em texto não criptografado, o que é um risco à segurança. Não especifique
um nome de usuário e uma senha sem especificar sinalizadores de autenticação.

Exemplos
O exemplo de código do Visual Basic a seguir mostra como usar o método
IADsOpenDSObject::OpenDSObject .

VB

Const ADS_SECURE_AUTHENTICATION = 1
Dim openDS As IADsOpenDSObject
Dim usr As IADsUser

Set openDS = GetObject("LDAP:")

openDS.OpenDSObject("LDAP://CN=jeffsmith,DC=fabrikam,DC=com",
vbNullString,
vbNullString,
ADS_SECURE_AUTHENTICATION)

O exemplo de código C++ a seguir mostra como usar a função ADsOpenObject .

C++

IADs *pObject;
HRESULT hr;
hr = ADsOpenObject(L"LDAP://CN=jeffsmith,DC=fabrikam,DC=com",
NULL,
NULL,
ADS_SECURE_AUTHENTICATION,
IID_IADs,
(void**)&pObject);
if(SUCCEEDED(hr))
{
// Use the object.

// Release the object.


pObject->Release()
}

A interface IADsOpenDSObject também pode ser usada em C++, mas duplica a função
ADsOpenObject .

O exemplo de código C++ a seguir mostra como usar a interface IADsOpenDSObject


para executar a mesma operação de associação que no exemplo de código acima.

C++

IADsOpenDSObject *pDSO;
HRESULT hr;

hr = ADsGetObject(L"LDAP:", IID_IADsOpenDSObject, (void**)&pDSO);


if(SUCCEEDED(hr))
{
IDispatch *pDisp;

hr = pDSO-
>OpenDSObject(CComBSTR("LDAP://CN=jeffsmith,DC=fabrikam,DC=com"),
NULL,
NULL,
ADS_SECURE_AUTHENTICATION,
&pDisp);
if(SUCCEEDED(hr))
{
IADs *pObject;

hr = pDisp->QueryInterface(IID_IADs, (void**) &pObject);


if(SUCCEEDED(hr))
{
// Use the object.

// Release the object.


pObject->Release();
}

pDisp->Release();
}
pDSO->Release();
}

Confira também
ADS_AUTHENTICATION_ENUM exemplos

IADsOpenDSObject

ADsOpenObject

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Associação com criptografia
Artigo • 03/06/2023

Dados confidenciais trocados por uma rede devem ser criptografados. Para permitir
isso, o ADSI dá suporte a dois tipos de criptografia, Kerberos e SSL (Secure Sockets
Layer). Ambos os tipos de criptografia exigem o uso de ADsOpenObject ou
IADsOpenDSObject::OpenDSObject para associação.

GetObject e ADsGetObject não podem ser usados para associação nesse caso porque
essas funções fazem com que as solicitações LDAP usadas pelo ADSI e os dados
retornados do servidor de diretório transmitam pela rede como texto sem formatação.
Para fins de depuração, é útil desativar a criptografia para que o Monitor de Rede possa
ser usado para exibir as solicitações LDAP e os dados entre o cliente e o servidor de
diretório.

Criptografia baseada em Kerberos


Para usar a criptografia baseada em Kerberos, especifique o sinalizador
ADS_USE_SEALING ao chamar ADsOpenObject ou IADsOpenDSObject::OpenDSObject.
O sinalizador ADS_USE_SEALING também pode ser usado para verificar a integridade
dos dados, ou seja, para garantir que os dados recebidos sejam os mesmos que os
dados enviados. Se o sinalizador ADS_USE_SEALING for especificado, o sinalizador
ADS_USE_SIGNING também será especificado automaticamente. Ambos os
sinalizadores exigem a autenticação Kerberos, que funciona somente nas seguintes
condições:

O computador cliente deve estar conectado ao domínio Windows ou a um


domínio confiável por um domínio Windows.
ADsOpenObject ou IADsOpenDSObject::OpenDSObject deve ser chamado com
credenciais nulas; ou seja, credenciais alternativas não podem ser especificadas.

Criptografia baseada em SSL


Para usar a criptografia baseada em SSL, especifique o sinalizador ADS_USE_SSL ao
chamar ADsOpenObject ou IADsOpenDSObject::OpenDSObject. Se apenas o
sinalizador ADS_USE_SSL for especificado, ADSI abrirá a porta SSL 636 e executará uma
associação simples por esse canal SSL. Se os sinalizadores
ADS_SECURE_AUTHENTICATION e ADS_USE_SSL forem especificados, o
comportamento de associação dependerá do cliente do qual a chamada é feita. Em
versões sem suporte do Windows, a ADSI primeiro abriu um canal SSL e executa uma
associação simples usando o nome de usuário e a senha especificados ou o contexto
atual do usuário se o nome de usuário e a senha forem nulos. Em versões com suporte
do Windows, o ADSI executa uma autenticação segura em vez de uma associação
simples.

Para usar a criptografia baseada em SSL durante a comunicação com o Active Directory,
o Active Directory deve ter habilitado a PKI (Infraestrutura de Chave Pública). A PKI pode
ser habilitada configurando uma autoridade de certificação corporativa em um dos
servidores do Active Directory, incluindo um dos próprios servidores do Active
Directory. A configuração de uma autoridade de certificação corporativa faz com que
um servidor do Active Directory obtenha um certificado de servidor que pode ser usado
para fazer criptografia baseada em SSL.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Usando um objeto de dados ActiveX
para associar a provedores ADSI
Artigo • 13/06/2023

Como o ADSI também é um provedor OLE DB, você pode usar um ADO (ActiveX Data
Object) para se conectar a provedores ADSI. Assim como acontece com outros
provedores do ADO, para se conectar a um provedor OLE DB, você deve criar um novo
objeto de conexão e, opcionalmente, especificar as credenciais. O nome do provedor
ADSI OLE DB é ADsDSOObject.

Por exemplo:

VB

Dim con As New Connection


'VBScript use: con = CreateObject("ADODB.Connection")
con.Provider = "ADsDSOObject"
con.Open "YourDescriptionHere"

No exemplo anterior, você está conectado em nome do usuário atual. Para especificar
credenciais diferentes, use as propriedades de conexão:

VB

con.Provider = "ADsDSOObject"
con.Properties("User ID") = "jeffsmith"
con.Properties("Password") = "guesswhat?"
con.Properties("Encrypt Password") = True
con.Open "YourDescriptionHere"

ADSI OLE DB define as propriedades de conexão a seguir.

Propriedade Tipo de dados Padrão

"ID de usuário" BSTR NULL

"Password" BSTR NULL

"Criptografar Senha" BOOLIANO FALSE

"Sinalizador ADSI" Long 0


Usando o ADO do OLE DB, você não pode associar a um objeto específico. No entanto,
você pode consultar um objeto específico e obter um conjunto de resultados
novamente. Somente provedores ADSI que dão suporte a IDirectorySearch se
beneficiam de ter o ADO como um modelo de programação.

A propriedade Sinalizador ADSI é usada para especificar a opção de autenticação de


associação. Essa propriedade pode ser uma combinação de sinalizadores da
enumeração ADS_AUTHENTICATION_ENUM .

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Caching de conexão
Artigo • 03/06/2023

Quando uma conexão com um servidor é feita, o identificador de conexão é


armazenado em cache no computador cliente para esse processo até que essa conexão
seja fechada. Se o mesmo servidor, porta e credenciais forem usados em uma conexão
subsequente e apenas os sinalizadores de autenticação ADS_FAST_BIND ou
ADS_SERVER_BIND forem diferentes, a ADSI reutilizará a conexão existente. O ADSI
executa esse cache de conexão por processo.

Para aumentar o desempenho, reutilize as conexões existentes quando possível.

O exemplo de código a seguir mostra como funciona o cache de conexão.

VB

Dim cachedConn As IADs


Dim obj As IADs
Dim cachedName As String
Dim objName As String

' Connect to the server and maintain this handle to cache the connection.
Set cachedConn =
GetObject("LDAP://MyMachine/DC=MyDomain,DC=Fabrikam,DC=com")

cachedName = cachedConn.Get("distinguishedName")
Debug.Print (cachedName)

' Reuse the connection to MyMachine opened by cachedConn.


' Be aware that this line executes quickly because it is not required
' to transmit over the network again.
Set obj =
GetObject("LDAP://MyMachine/CN=Bob,CN=Users,DC=MyDomain,DC=Fabrikam,DC=com")

objName = obj.Get("distinguishedName")
Debug.Print (objName)

' Release the second connection.


Set obj = Nothing

' Reuse the connection to MyMachine opened by cachedConn again.


Set obj =
GetObject("LDAP://MyMachine/CN=Administrator,CN=Users,DC=MyDomain,DC=Fabrika
m,DC=com")

objName = obj.Get("distinguishedName")
Debug.Print (objName)

' Release the second connection again.


Set obj = Nothing
' Release the first connection.
Set cachedConn = Nothing

' The connection to MyMachine is closed.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Associação a objetos filho
Artigo • 03/06/2023

No ADSI, um objeto de contêiner expõe a interface IADsContainer . O método


IADsContainer::GetObject é usado para associar diretamente a um objeto filho. O
objeto retornado por IADsContainer::GetObject tem o mesmo contexto de segurança
que o objeto no qual o método foi chamado. Isso significa que, se as credenciais
alternativas forem usadas, as credenciais alternativas não precisarão ser passadas para a
função de associação ou método novamente para manter as mesmas credenciais.

O método IADsContainer::GetObject usa um RDN (nome diferenciado relativo) relativo


ao objeto atual. Esse método também usa um nome de classe opcional e retorna um
ponteiro de interface IDispatch que representa o objeto filho. Para obter a interface
ADSI desejada, como IADs, chame o método QueryInterface desse ponteiro de
interface IDispatch .

O exemplo de código C++ a seguir mostra uma função que recupera um objeto filho
especificado.

C++

HRESULT GetChildObject(IADs *pObject,


LPCWSTR pwszClass,
LPCWSTR pwszRDN,
IADs **ppChild)
{
if(NULL == ppChild)
{
return E_INVALIDARG;
}

*ppChild = NULL;

if((NULL == pObject) || (NULL == pwszRDN))


{
return E_INVALIDARG;
}

HRESULT hr;
IADsContainer *pCont;

hr = pObject->QueryInterface(IID_IADsContainer, (LPVOID*)&pCont);
if(SUCCEEDED(hr))
{
BSTR bstrClass = NULL;
if(pwszClass)
{
bstrClass = SysAllocString(pwszClass);
}

BSTR bstrRDN = SysAllocString(pwszRDN);


if(bstrRDN)
{
IDispatch *pDisp;

hr = pCont->GetObject(bstrClass, bstrRDN, &pDisp);


if(SUCCEEDED(hr))
{
hr = pDisp->QueryInterface(IID_IADs, (LPVOID*)ppChild);

pDisp->Release();
}

}
else
{
hr = E_OUTOFMEMORY;
}

if(bstrRDN)
{
SysFreeString(bstrRDN);
}

if(bstrClass)
{
SysFreeString(bstrClass);
}

pCont->Release();
}

return hr;
}

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Associação ao pai de um objeto
Artigo • 13/06/2023

No ADSI, cada objeto de diretório é representado por um objeto ADSI COM que expõe
a interface IADs . Para obter o contêiner pai de um objeto, use o método
IADs::get_Parent para obter o ADsPath do objeto pai e, em seguida, associe ao ADsPath
do pai.

O exemplo de código C++ a seguir mostra como obter o pai de um objeto .

C++

HRESULT GetParentObject(IADs *pObject, // Pointer to the object whose


parent to bind to.
IADs **ppParent) // Return a pointer to the parent
object.
{
if(NULL == ppParent)
{
return E_INVALIDARG;
}

*ppParent = NULL;

if(NULL == pObject)
{
return E_INVALIDARG;
}

HRESULT hr;
BSTR bstr;

// Get the ADsPath of the parent.


hr = pObject->get_Parent(&bstr);
if(SUCCEEDED(hr))
{
// Bind to the parent.
hr = ADsOpenObject(bstr,
NULL,
NULL,
ADS_SECURE_AUTHENTICATION,
IID_IADs,
(void**)ppParent);

SysFreeString(bstr);
}

return hr;
}
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Opção de associação rápida para
operações de gravação/modificação em
lote
Artigo • 13/06/2023

Quando um objeto de serviço de diretório é associado a, ADSI cria um objeto COM que
representa o objeto de diretório especificado. Ao associar, ADSI normalmente
recuperará o atributo objectClass para que ADSI possa expor as interfaces COM
apropriadas para essa classe de objeto. Por exemplo, um objeto de usuário exporia a
interface IADsUser além das interfaces ADSI base com suporte para todos os objetos.
Para uma única operação, isso não deve ter efeito no desempenho. No entanto, se
forem executadas operações em lote que exijam centenas ou milhares de associações
em uma conexão lenta e essas operações estiverem gravando dados no serviço de
diretório, talvez seja desejável trocar o suporte completo de objeto para uma associação
mais rápida. Isso é conhecido como uma associação rápida e é realizado especificando o
sinalizador ADS_FAST_BIND quando ADsOpenObject ou
IADsOpenDSObject::OpenDSObject é chamado.

A associação rápida tem as seguintes restrições:

A operação de associação deve ser executada com a função ADsOpenObject ou o


método IADsOpenDSObject::OpenDSObject . A operação de associação vai para o
servidor de diretório uma vez em vez de duas vezes. ADSI não recupera o atributo
objectClass e, portanto, expõe apenas as interfaces ADSI base para o objeto.

As seguintes interfaces têm suporte para o objeto COM:


Iads
IADsContainer
IDirectoryObject
Idirectorysearch
IADsPropertyList
IADsObjectOptions
ISupportErrorInfo
IADsDeleteOps

Se o método IADsContainer::GetObject for usado para associar a objetos filho, o


objeto filho terá as mesmas características de associação rápida que o pai.

A existência do objeto ao qual está associado não é verificada durante a operação


de associação, portanto, as chamadas de método subsequentes falharão se o
objeto não existir. Devido a isso, a associação rápida só deve ser usada para
objetos que são conhecidos por existirem, por exemplo, diretamente depois de
executar uma consulta que retornou os nomes diferenciados dos objetos que
estão sendo associados.

As extensões ADSI são expostas para objetos da classe superior. Portanto,


somente as extensões para as interfaces ADSI base listadas acima são expostas.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Escolhendo uma interface para
associação
Artigo • 03/06/2023

Quando um objeto de diretório é associado, o chamador especifica o tipo de interface


ADSI desejada. Todos os objetos de diretório ADSI dão suporte à interface IADs . Um
objeto ADSI também pode dar suporte a outras interfaces. As interfaces reais
compatíveis com o objeto dependem da classe de objeto. Por exemplo, um objeto de
usuário dá suporte à interface IADsUser , mas não dará suporte à interface
IADsComputer .

Os clientes de automação devem usar as interfaces IADs* , pois essas interfaces são
interfaces duplas que fornecem um nível maior de abstração e fornecem dados usando
o tipo de dados VARIANT .

Além das interfaces IADs* , os clientes C/C++ podem usar as interfaces


IDirectoryObject e IDirectorySearch . Essas interfaces não são interfaces duplas e não
dão suporte à automação. Essas interfaces fornecem maior controle sobre exatamente
quais atributos recuperar e permitir o acesso aos dados brutos armazenados em uma
propriedade. Por exemplo, quando o método IADs::Get é usado para recuperar o
atributo ntSecurityDescriptor para um objeto, o método IADs::Get fornece um ponteiro
de interface IDispatch que dá suporte à interface IADsSecurityDescriptor . A interface
IADsSecurityDescriptor é fornecida pela ADSI para representar um descritor de
segurança. Em comparação, quando o método IDirectoryObject::GetObjectAttributes é
usado para recuperar o atributo ntSecurityDescriptor ,
IDirectoryObject::GetObjectAttributes fornece uma matriz de bytes que podem ser
convertidos em uma estrutura SECURITY_DESCRIPTOR . As APIs de segurança do Win32
podem ser usadas com esses dados para manipular o descritor de segurança.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Criando e excluindo objetos
Artigo • 03/06/2023

Com ADSI, os objetos são criados e excluídos usando a interface IADsContainer ou


IDirectoryObject .

Criando um objeto com IADsContainer


Para criar um objeto com a interface IADsContainer

1. Associe-se ao contêiner que conterá o objeto a ser criado e obterá a interface


IADsContainer .
2. Use o método IADsContainer.Create para criar um novo objeto no contêiner.
3. Defina os valores para todos os atributos necessários para o objeto usando o
método IADs.Put ou IADs.PutEx . Os atributos necessários para criar um objeto
dependerão do serviço de diretório e do tipo de objeto criado. Para obter mais
informações sobre como criar objetos do Active Directory, consulte Criando e
excluindo objetos do Active Directory.
4. Defina os valores para todos os atributos opcionais desejados para o objeto
usando o método IADs.Put ou IADs.PutEx .
5. Chame o método IADs.SetInfo para confirmar o objeto e seus atributos. O novo
objeto não é realmente criado no serviço de diretório subjacente até que o
método IADs.SetInfo seja chamado para confirmar os atributos.

Criando um objeto com IDirectoryObject


Para criar um objeto com a interface IDirectoryObject

1. Associe-se ao contêiner que conterá o objeto a ser criado e obterá a interface


IDirectoryObject .
2. Aloque uma matriz de estruturas de ADS_ATTR_INFO que contém uma estrutura
para cada atributo a ser definido quando o objeto é criado.
3. Preencha uma estrutura ADS_ATTR_INFO para cada atributo necessário para o
objeto. Os atributos necessários para criar um objeto dependerão do serviço de
diretório e do tipo de objeto criado. Para obter mais informações sobre como criar
objetos do Active Directory, consulte Criando e excluindo objetos do Active
Directory.
4. Preencha uma estrutura de ADS_ATTR_INFO para cada atributo opcional para o
objeto.
5. Use o método IDirectoryObject::CreateDSObject para criar o objeto no contêiner.
Esse método também confirma o objeto para o serviço de diretório subjacente. Se
a matriz de ADS_ATTR_INFO não contiver todos os atributos necessários para o
objeto, IDirectoryObject::CreateDSObject falhará.

Excluindo um objeto
Para excluir um objeto, use o método IADsContainer::D elete ou IDirectoryObject::D
eleteDSObject . Esses métodos falharão se o objeto excluído contiver objetos filho. Use
o método IADsDeleteOps::D eleteObject para excluir um contêiner e todos os objetos
filho do contêiner.

O que acontece com um objeto excluído depende do serviço de diretório subjacente.


Para obter mais informações sobre como excluir objetos do Active Directory, consulte
Criando e excluindo objetos do Active Directory.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Acessando e manipulando dados com
ADSI
Artigo • 12/06/2023

Todos os objetos têm propriedades. Todos os objetos COM ADSI (Active Directory
Service Interface) têm uma ou mais interfaces com métodos que recuperam as
propriedades do objeto de diretório que o objeto COM representa. Há várias maneiras
de ler propriedades de um objeto:

Obter uma propriedade específica por nome: a interface IADs tem dois métodos
IADs::Get e IADs::GetEx para ler uma propriedade específica. Cada objeto COM
ADSI tem uma interface IADs .
Obter uma lista especificada de propriedades: a interface IDirectoryObject tem o
método IDirectoryObject::GetObjectAttributes que permite especificar uma lista
que contém os nomes das propriedades para ler e retorna uma matriz de
estruturas que contém os valores de propriedade solicitados.
Enumerar todas as propriedades no objeto: a interface IADsPropertyList permite
enumerar todas as propriedades em um objeto .
Obter propriedades especiais: as IADs (interfaces de Automação*) têm métodos
de propriedade que permitem obter propriedades especiais que não são
armazenadas em um objeto . Ou os métodos de propriedade podem permitir que
você obtenha uma propriedade de objeto em um formato de dados que difere do
tipo de dados real armazenado. Por exemplo, a interface IADs tem métodos de
propriedade como IADs::get_Name, que recupera o RDN (nome diferenciado
relativo) de um objeto; IADs::get_Class, que recupera a classe de um objeto e
IADs::get_Parent, que recupera o ADsPath para o pai do objeto.

O ADSI permite armazenar em cache as propriedades localmente depois que elas forem
lidas do servidor de diretório. Isso permite que você escolha ler as propriedades do
cache de propriedades local ou recuperar as propriedades diretamente do servidor de
diretório. O ADSI também tem métodos para atualizar o cache, bem como especificar se
todas as propriedades de um objeto são armazenadas em cache ou apenas aquelas que
você especificou.

Depois de recuperar uma propriedade, você lê seu valor. O tipo de dados de uma
propriedade depende da definição da propriedade (também conhecida como atributo)
no esquema do Active Directory. Para cada tipo de propriedade que pode existir no
Active Directory, há um objeto attributeSchema no esquema do Active Directory. Um
objeto attributeSchema define as características do atributo. Uma dessas características
é a sintaxe do atributo, que determina o tipo de dados dos valores do atributo. Para
obter mais informações, consulte Características de atributos e sintaxes para atributos
do Active Directory.

As IADs (interfaces de Automação*) retornam um valor de propriedade como um


VARIANT ou um ponteiro para uma interface de Automação em um objeto COM que
representa a propriedade . As interfaces IDirectoryObject e IDirectorySearch retornam
uma propriedade como um ponteiro para uma estrutura que contém um valor de
propriedade tipada ou um ponteiro para uma cadeia de caracteres de bytes. Além disso,
IDirectoryObject e IDirectorySearch recuperam propriedades diretamente do servidor
de diretório em vez de usar um cache de propriedades local.

Esta seção descreve os seguintes tópicos:

As IADs e interfaces IDirectoryObject


Acessando atributos com ADSI
Modificando atributos com ADSI
Acessando o cache de propriedades diretamente com as interfaces IADsProperty
Sintaxe do atributo ADSI

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


As IADs e interfaces IDirectoryObject
Artigo • 12/06/2023

Os clientes ADSI gerenciam e manipulam objetos de serviço de diretório usando uma


das duas interfaces COM: IADs ou IDirectoryObject. IADs é uma interface IDispatch
destinada a ser usada por clientes com associação tardia, como aqueles escritos no
Microsoft Visual Basic, Java e várias linguagens de script. IDirectoryObject é uma
interface vtable que fornece acesso direto a objetos por clientes associados iniciais,
como aqueles escritos em C e C++.

Cada objeto ADSI deve implementar IADs e IDirectoryObject. Clientes ADSI escritos em
linguagens como C ou C++, que são capazes de acessar diretamente vtables, podem
usar qualquer interface, mas não ambos no mesmo aplicativo. Os clientes ADSI escritos
no Visual Basic ou java estão limitados ao uso de IADs.

A interface IADs permite que clientes com limite tardio aproveitem os recursos
inerentes de limpeza do modelo de objeto ADSI. Entre esses recursos está o cache de
propriedades, que permite que os clientes leiam e escrevam propriedades sem passar
por cima do fio para cada chamada. Além disso, os aplicativos cliente obtêm o uso de
bibliotecas avançadas de controle de interface do usuário e ActiveX e um estilo mais
simples de programação. Em troca, os clientes com limite tardio devem usar o tipo de
dados VARIANT , que impede o uso dos tipos de dados nativos mais avançados
fornecidos pelo ADSI.

A interface IDirectoryObject permite que os clientes associados iniciais aproveitem ao


máximo os tipos de dados nativos de serviço de diretório ao custo de abrir mão de uma
pequena vantagem de desempenho do uso do cache de propriedades. Em troca, a
interface IDirectoryObject fornece acesso direto e on-the-wire às propriedades do
objeto por meio de uma única solicitação, em vez de por meio de chamadas de
obtenção e colocação individuais.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Usando as interfaces IADs
Artigo • 12/06/2023

ADSI, cada elemento de um serviço de diretório é representado por um objeto ADSI,


que é um objeto COM (Component Object Model) que dá suporte à interface COM
IUnknown padrão, bem como às interfaces IDispatch e IADs . As IADs fornece as
funções básicas de manutenção para objetos ADSI.

Cada objeto ADSI deve dar suporte a essa interface, que serve para:

Forneça identificação de objeto por nome, classe ou ADsPath.


Identifique o contêiner de objeto que gerencia a criação e a exclusão de objetos.
Obtenha a definição de esquema de objeto.
Carregue os atributos de objeto no cache de propriedades e confirme as
alterações no repositório de diretório persistente.
Acesse e modifique os valores do atributo de objeto no cache de propriedades.

A interface IADs foi projetada para garantir que os objetos ADSI forneçam aos
administradores de rede e provedores de serviços de diretório uma representação
eficiente e consistente de vários serviços de diretório subjacentes.

A figura anterior mostra um objeto ADSI genérico que dá suporte a IADs de interfaces
fundamentais, IADsPropertyList, IUnknown, IDirectoryObject e IDispatch. Um objeto
ADSI como esse gerencia dados do armazenamento de dados do serviço de diretório
subjacente por meio das interfaces compatíveis. Esses dados são conhecidos como as
propriedades do objeto e as rotinas que obtêm e definem essas propriedades são
conhecidas como métodos de propriedade. As propriedades somente leitura têm um
método de propriedade que obtém o valor da propriedade. As propriedades de
leitura/gravação têm dois métodos; um método que define o valor e um que obtém o
valor. As propriedades são implementadas em cada objeto ADSI usando um cache de
propriedades. IADs::get_ADsPath e IADs::p ut_ADsPath são exemplos de métodos de
propriedade. Os métodos de propriedade não são aparentes para o Visual Basic e
outros clientes de Automação que habilitam referências diretas à propriedade. Por
exemplo, o Visual Basic refere-se a IADs::ADsPath diretamente usando a sintaxe
Object.ADsPath . Para obter mais informações, consulte Métodos de propriedade de
interface.

Além disso, um objeto ADSI interage com outros objetos ADSI e diretamente com um
namespace por meio de métodos. Os métodos são executados imediatamente.
Exemplos de métodos incluem IADs::SetInfo e IADs::GetInfo.

Propriedades, métodos de propriedade e métodos são todos acessados por meio de


interfaces COM padrão.

Um objeto ADSI é identificado exclusivamente por seu ADsPath. Por exemplo, um


ADsPath para o namespace LDAP é "LDAP://MyServer/DC=Fabrikam,DC=COM". Para
obter mais informações sobre ADsPaths, consulte Associação ADSI. Para programadores
familiarizados com monikers COM, isso é conceitualmente semelhante ao nome de
exibição do moniker COM.

Qualquer objeto ADSI que contenha outros objetos ADSI, chamado de objeto de
contêiner ADSI, também dá suporte à interface IADsContainer , que fornece métodos e
propriedades que gerenciam a criação, exclusão e enumeração de objetos ADSI
contidos pelo objeto . A figura a seguir mostra um objeto de contêiner ADSI.
A maioria dos objetos ADSI está contida por outros objetos. O único objeto ADSI sem
contêiner pai é o objeto namespaces ADSI de nível superior ("ADS:").

O método IADs::SetInfo em um objeto de contêiner armazena persistentemente as


propriedades armazenadas em cache do objeto de contêiner ADSI no armazenamento,
além de quaisquer objetos criados com o método IADsContainer::Create .
IADsContainer::D elete não afeta o cache de propriedades, mas exclui o elemento de
diretório de namespace subjacente representado por esse objeto.

Comentários
Esta página foi útil? ツ Yes ト No
Obter ajuda no Microsoft Q&A
Usando a interface IDirectoryObject
Artigo • 03/06/2023

Ao criar um cliente ADSI em C ou C++ que usa associação antecipada, você terá uma
variedade maior de tipos de dados ADSI disponíveis para usar para seu cliente se ele
chamar a interface IDirectoryObject em vez da interface IADs . A interface
IDirectoryObject fornece métodos para dar suporte a um subconjunto das
propriedades de manutenção de um objeto e acessar seus atributos. A figura a seguir
mostra as relações entre as estruturas de dados.

Na figura anterior, a estrutura ADS_OBJECT_INFO define propriedades que identificam o


objeto por nome diferenciado, nome distinto relativo, por contêiner (ParentDN), por
tipo de objeto (ClassDN) e por definição de esquema (SchemaDN). O descritor de
atributo ADS_ATTR_INFO consiste em um nome, tipo de dados, uma matriz de valores
de dados mostrada em ADSVALUE e um sinalizador que direciona o serviço de diretório
subjacente para executar determinadas operações nos atributos detalhados em
constantes ADS_ATTR_*. Os tipos de dados para esses atributos incluem os tipos de
sintaxe estendida ADSI, detalhados em ADSTYPEENUM.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Acessando atributos com ADSI
Artigo • 03/06/2023

Os métodos IADs.Get e IADs.GetEx são usados para recuperar valores de atributo


nomeados. Ambos os métodos retornam um valor VARIANT . Esses métodos estão
disponíveis apenas para diretórios que dão suporte a um esquema. Ao acessar objetos
em um diretório sem um esquema, as interfaces IADsPropertyEntry e
IADsPropertyValue devem ser usadas para manipular valores de atributo.

Os métodos IADs.Get e IADs.GetEx retornam uma VARIANT que pode, ou não, ser uma
matriz VARIANT , dependendo do número de valores retornados pelo servidor. Por
exemplo, se apenas um valor for retornado do servidor, independentemente de ser um
atributo único ou de vários valores, o método retornará um único VARIANT. Por outro
lado, se vários valores forem retornados, uma matriz VARIANT será retornada. Se uma
matriz VARIANT for retornada, o membro vt da estrutura VARIANT conterá os
sinalizadores VT_VARIANT/vbVariant e VT_ARRAY/vbArray .

Os métodos IADs.Get e IADs.GetEx também podem retornar um objeto COM usando a


interface IDispatch . Nesse caso, o membro vt da estrutura VARIANT contém o
sinalizador VT_DISPATCH/vbObject . Para acessar o objeto COM, chame o método
QueryInterface na interface IDispatch para obter a interface desejada.

Outro tipo de dados retornado pelos métodos IADs.Get e IADs.GetEx são os dados
binários. Nesse caso, os dados são fornecidos como uma matriz contígua de bytes e o
membro vt da estrutura VARIANT conterá os sinalizadores VT_UI1/vbByte e
VT_ARRAY/vbArray .

7 Observação

O Microsoft Visual Basic, o Scripting Edition só dá suporte a matrizes VARIANT e


VARIANT. Por isso, o VBScript não pode ser usado para ler valores de propriedade
binária.

Muitas interfaces ADSI definem propriedades específicas da interface. Por exemplo, a


interface IADsComputer define a propriedade Location . Essas propriedades definidas
pela interface podem conter dados idênticos a um dos atributos nomeados, mas as
propriedades são específicas para o tipo de objeto ao qual a interface se refere. Em
linguagens que dão suporte à automação, essas propriedades definidas pela interface
podem ser acessadas usando a notação de ponto, conforme mostrado no exemplo de
código a seguir.

Exemplos
O exemplo de código a seguir mostra como acessar a propriedade ADsPath na interface
IADs.

VB

Dim oUser as IADs


Dim Path as String

' Bind to a specific user object.


set oUser = GetObject(
"LDAP://CN=Jeff Smith,CN=Users,DC=fabrikam,DC=com")

' Get property.


Path = MyUser.ADsPath

Em linguagens que não são de automação, os métodos de acesso à propriedade devem


ser usados para acessar as propriedades definidas pela interface. Por exemplo, o
método IADsComputer::get_Location é usado para recuperar a propriedade
IADsComputer.Location .

O exemplo de código C++ a seguir demonstra como usar o método de acesso à


propriedade no C++ para recuperar o ADsPath de um usuário.

C++

HRESULT hr;
IADs *pUser;

// Bind to user object.


hr = ADsGetObject(
L"LDAP://CN=Jeff Smith,CN=Users,DC=fabrikam,DC=com",
IID_IADs,
(void**)&pUser);
if(SUCCEEDED(hr))
{
BSTR bstrName;

// Get property.
hr = pUser->get_Name(&bstrName);
if(SUCCEEDED(hr))
{
wprintf(bstrName);
SysFreeString(bstrName);
}

pUser->Release();
}

Para obter mais informações sobre como acessar atributos com ADSI, consulte:

Método Get
O método GetEx
O método GetInfo
Otimização usando GetInfoEx
Acessando atributos com a interface IDirectoryObject
Código de exemplo para atributos de leitura

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


O método Get
Artigo • 13/06/2023

O método IADs::Get é usado para recuperar atributos nomeados individuais de um


objeto de diretório.

O exemplo de código a seguir usa o método IADs::Get para recuperar um atributo


nomeado de um objeto .

VB

Dim MyUser as IADs


Dim MyDistinguishedName as String

On Error GoTo Cleanup

' Bind to a specific user object.


set MyUser = GetObject("LDAP://CN=Jeff Smith,CN=Users,DC=fabrikam,DC=com")

' Get property.


MyDistinguishedName = MyUser.Get("distinguishedName")

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set MyUser = Nothing

Em linguagens de Automação, os atributos nomeados também podem ser acessados


diretamente usando a notação de ponto. Por exemplo, objeto .
Get("distinguishedName") é idêntico a object.distinguishedName.

O exemplo de código a seguir é idêntico ao exemplo anterior, exceto que o atributo


distinguishedName é acessado usando a notação de ponto.

VB

Dim MyUser as IADs


Dim MyDistinguishedName as String

On Error GoTo Cleanup

' Bind to a specific user object.


set MyUser = GetObject("LDAP://CN=Jeff Smith,CN=Users,DC=fabrikam,DC=com")

' Get property.


MyDistinguishedName = MyUser.distinguishedName
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set MyUser = Nothing

Se um valor não for definido no objeto , o método IADs::Get retornará o erro


"Propriedade não encontrada no cache".

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


O método GetEx
Artigo • 13/06/2023

Alguns atributos podem armazenar um ou mais valores. Por exemplo, o outro


atributoTelephone de um objeto de usuário no Active Directory é uma propriedade que
pode ter zero, um ou muitos valores. Atributos que têm vários valores são conhecidos
como "atributos de vários valores". Se o método IADs::Get for usado para recuperar um
atributo de vários valores, os resultados deverão ser processados de forma diferente do
que se o atributo tiver um único valor. Os resultados fornecidos pelo método
IADs::GetEx , no entanto, são processados da mesma maneira, independentemente de o
atributo ter um único ou vários valores. Em ambos os casos, o método IADs::GetEx
retorna os valores em uma matriz.

O método IADs::GetEx recupera propriedades do cache de propriedades. Se a


propriedade especificada não for encontrada no cache, IADs::GetEx executará uma
chamada IADs::GetInfo implícita.

O método IADs::GetEx retorna uma matriz variante de variantes, independentemente do


número de valores retornados do servidor. Isso é verdadeiro mesmo que o atributo
contenha apenas um valor.

VB

Dim usr As IADs


On Error GoTo Cleanup

Set usr = GetObject("LDAP://CN=Jeff Smith,CN=Users,DC=fabrikam,DC=com")


homePhones = usr.GetEx("otherHomePhone")
For each phone in homePhones
Debug.Print phone
Next

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set usr = Nothing

O método IADs::GetEx também pode ser usado para atributos de valor único. Os
resultados de um atributo de valor único são processados da mesma forma que os
resultados de um atributo de vários valores.

VB
Dim usr as IADs
On Error GoTo Cleanup

Set usr = GetObject("LDAP://CN=Jeff Smith,CN=Users,DC=fabrikam,DC=com")


sds = usr.GetEx("ntSecurityDescriptor")
For each sd in sds
Set acl = sd.DiscretionaryACL
Next

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set usr = Nothing

Se nenhum valor for definido para o atributo , IADs::GetEx retornará o erro


"Propriedade não encontrada no cache".

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


O método GetInfo
Artigo • 13/06/2023

O método IADs::GetInfo carrega todos os valores de atributo de um objeto ADSI no


cache local do serviço de diretório subjacente. O método IADs::GetInfoEx é usado para
carregar valores de atributo específicos no cache local. Para obter mais informações
sobre como usar o método IADs::GetInfoEx , consulte Otimização usando GetInfoEx.

ADSI fará uma chamada implícita de IADs::GetInfo quando o método IADs::Get ou


IADs::GetEx for chamado para um atributo específico e nenhum valor for encontrado no
cache local. Quando IADs::GetInfo foi chamado, uma chamada implícita não é repetida.
No entanto, se já existir um valor no cache de propriedades, chamar o método
IADs::Get ou IADs::GetEx sem chamar primeiro IADs::GetInfo recuperará o valor
armazenado em cache em vez do valor mais atual do diretório subjacente. Isso pode
fazer com que os valores de atributo atualizados sejam substituídos se o cache local
tiver sido modificado, mas os valores não tiverem sido confirmados no serviço de
diretório subjacente com uma chamada para o método IADs::SetInfo . Para evitar
problemas de cache, confirme alterações no valor do atributo chamando IADs::SetInfo
antes de chamar IADs::GetInfo.

VB

Dim usr As IADs

' Bind to a specific user object.


Set usr = GetObject("LDAP://CN=Jeff Smith,CN=Users,DC=fabrikam,DC=com")

' This code example assumes that the property description has a single value
in the directory.
' Be aware that this will IMPLICITLY call GetInfo because at this point
GetInfo
' has not yet been called (implicitly or explicitly) on the usr object.
Debug.Print "User's title is " + usr.Get("title")

' Change the attribute value in the local cache.


usr.Put "title", "Vice President"
Debug.Print "User's title is " + usr.Get("title")

' Call GetInfo, which will overwrite the updated value because SetInfo has
not
' been called.
usr.GetInfo
Debug.Print "User's title is " + usr.Get("title")
Alguns serviços de diretório não retornam todos os valores de atributo para um objeto
em resposta a uma chamada IADs::GetInfo . Nesses casos, use o método
IADs::GetInfoEx para carregar esses valores no cache local.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Otimização usando GetInfoEx
Artigo • 12/06/2023

O método IADs.GetInfoEx é usado para carregar valores de atributo específicos no


cache local do serviço de diretório subjacente. Esse método carrega apenas os valores
de atributo especificados no cache local. O método IADs.GetInfo é usado para carregar
todos os valores de atributo no cache local.

O método IADs.GetInfoEx obtém valores atuais específicos para as propriedades de um


objeto do Active Directory do repositório de diretórios subjacente, atualizando os
valores armazenados em cache.

No entanto, se já existir um valor no cache de propriedades, chamar o método IADs.Get


ou IADs.GetEx sem primeiro chamar IADs.GetInfoEx para esse atributo recuperará o
valor armazenado em cache em vez do valor mais atual do diretório subjacente. Isso
pode fazer com que os valores de atributo atualizados sejam substituídos se o cache
local tiver sido modificado, mas os valores não tiverem sido confirmados no serviço de
diretório subjacente com uma chamada para o método IADs.SetInfo . O método
sugerido para evitar problemas de cache é sempre confirmar alterações de valor de
atributo chamando IADs.SetInfo antes de chamar IADs.GetInfo.

VB

Dim usr As IADs


Dim PropArray As Variant

On Error GoTo Cleanup

' Bind to a specific user object.


Set usr = GetObject("LDAP://CN=Jeff Smith,CN=Users,DC=fabrikam,DC=com")

' The code example assumes that the property description has a single value
in the directory.
' Be aware that this will implicitly call GetInfo because, at this point,
GetInfo
' has not yet been called (implicitly or explicitly) on the usr object.
Debug.Print "User's common name is " + usr.Get("cn")
Debug.Print "User's title is " + usr.Get("title")
Debug.Print "User's department is " + usr.Get("department")

' Change two of the attribute values in the local cache.


usr.Put "cn", "Jeff Smith"
usr.Put "title", "Vice President"
usr.Put "department", "Head Office"
Debug.Print "User's common name is " + usr.Get("cn")
Debug.Print "User's title is " + usr.Get("title")
Debug.Print "User's department is " + usr.Get("department")
' Initialize the array of properties to pass to GetInfoEx.
PropArray = Array("department", "title")

' Get the specified attribute values.


usr.GetInfoEx PropArray, 0

' The specific attributes values were overwritten, but the attribute
' value not retrieved has not changed.
Debug.Print "User's common name is " + usr.Get("cn")
Debug.Print "User's title is " + usr.Get("title")
Debug.Print "User's department is " + usr.Get("department")

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set usr = Nothing

Recuperando atributos construídos do Active


Directory
No Active Directory, a maioria dos atributos construídos são recuperados e
armazenados em cache quando o método IADs.GetInfo é chamado (IADs.Get executa
uma chamada IMPLÍCITA IADs.GetInfo se o cache estiver vazio). Alguns atributos
construídos, no entanto, não são recuperados e armazenados em cache
automaticamente e, portanto, exigem que o método IADs.GetInfoEx seja chamado
explicitamente para recuperá-los. Por exemplo, no Active Directory, o atributo
canonicalName não é recuperado quando o método IADs.GetInfo é chamado e
IADs.Get retornará E_ADS_PROPERTY_NOT_FOUND. O método IADs.GetInfoEx deve ser
chamado para recuperar o atributo canonicalName . Esses mesmos atributos
construídos também não serão recuperados usando a interface IADsPropertyList para
enumerar os atributos.

Para obter mais informações e um exemplo de código que mostra como recuperar
todos os valores de atributo, consulte Código de exemplo para ler um atributo
construído.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Código de exemplo para ler um atributo
construído
Artigo • 03/06/2023

O exemplo de código a seguir mostra um método que pode ser usado para recuperar
um valor de atributo que funcionará com todos os tipos de atributos.

VB

Public Function GetAttribute(oObject As IADs, AttributeName As String) As


String
Const E_ADS_PROPERTY_NOT_FOUND = &H8000500D

On Error Resume Next

' Attempt to get the attribute value.


GetAttribute = oObject.Get(AttributeName)
If (Err.Number = E_ADS_PROPERTY_NOT_FOUND) Then
' Reset the error number.
Err.Number = 0

' Use IADs.GetInfoEx to explicitly load the attribute value into the
cache.
oObject.GetInfoEx Array(AttributeName), 0
If Err.Number = 0 Then
' Attempt to get the attribute value.
GetAttribute = oObject.Get(AttributeName)
End If
End If
End Function

O exemplo de código a seguir mostra um método que pode ser usado para recuperar
um valor de atributo que funcionará com todos os tipos de atributos.

C++

/***************************************************************************

GetAttribute()

***************************************************************************/

HRESULT GetAttribute(IADs *pads, BSTR bstrAttribute, VARIANT *pvar)


{
if(!pads || !pvar)
{
return E_INVALIDARG;
}
HRESULT hr;
CComVariant svar;

// Attempt to get the attribute with IADs.Get.


hr = pads->Get(bstrAttribute, &svar);
if(E_ADS_PROPERTY_NOT_FOUND == hr)
{
// Attempt to get the attribute with IADs.GetInfoEx and then
IADs.Get.

CComVariant svarArray;
hr = ADsBuildVarArrayStr(&(LPWSTR)bstrAttribute, 1, &svarArray);
if (SUCCEEDED(hr))
{
hr = pads->GetInfoEx(svarArray, 0L);
if(SUCCEEDED(hr))
{
hr = pads->Get(bstrAttribute, &svar);
}
}

if(S_OK == hr)
{
hr = svar.Detach(pvar);
}

return hr;
}

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Acessando atributos com a interface
IDirectoryObject
Artigo • 03/06/2023

A interface IDirectoryObject fornece um aplicativo cliente escrito em C e C++ com


acesso direto a objetos de serviço de diretório. A interface permite o acesso por meio
de um protocolo de rede direto, em vez de por meio do cache de atributo ADSI. No
lugar das propriedades compatíveis com a interface IADs , iDirectoryObject fornece
métodos que dão suporte a um subconjunto crítico dos métodos de manutenção de um
objeto e fornecem acesso aos seus atributos. Com IDirectoryObject, um cliente pode
obter ou definir qualquer número de atributos de objeto com uma chamada de método.
Ao contrário dos métodos de Automação correspondentes, que são em lotes, os de
IDirectoryObject são executados quando chamados. Como os métodos nessa interface
não exigem a criação de uma instância de um objeto de diretório de Automação, a
sobrecarga de desempenho é pequena.

Os clientes escritos em linguagens como C e C++ devem usar os métodos da interface


IDirectoryObject para otimizar o desempenho e aproveitar as interfaces de serviço de
diretório nativo. Os clientes de automação não podem usar IDirectoryObject. Em vez
disso, eles devem usar a interface IADs .

O método IDirectoryObject::GetObjectAttributes recupera atributos com valores


únicos e múltiplos. Esse método usa uma lista de atributos solicitados e retorna uma
estrutura ADS_ATTR_INFO . ADSI aloca essa estrutura; o chamador deve liberar essa
memória quando ela não for mais necessária usando a função FreeADsMem .

A ordem dos valores de atributo retornados não é necessariamente a mesma que a


ordem na qual os atributos foram solicitados. Portanto, é necessário comparar os nomes
de atributo retornados do ADSI.

7 Observação

A estrutura ADS_ATTR_INFO não retorna todos os atributos solicitados. Somente


os atributos que contêm valores fazem parte da estrutura retornada.

O número de atributos retornados é determinado pelo parâmetro dwNumberAttributes


passado para o método IDirectoryObject::GetObjectAttributes .
O exemplo de código a seguir se associa a um objeto e usa o método
IDirectoryObject::GetObjectAttributes para recuperar atributos do objeto.

C++

HRESULT hr;
IDirectoryObject *pDirObject;

CoInitialize(NULL);

hr = ADsGetObject(
L"LDAP://CN=Jeff Smith,OU=Users,DC=Fabrikam,DC=com",
IID_IDirectoryObject,
(void**)&pDirObject);

if(SUCCEEDED(hr))
{
ADS_ATTR_INFO *pAttrInfo = NULL;
LPWSTR pAttrNames[] = {L"cn", L"title", L"otherTelephone"};
DWORD dwNumAttr = sizeof(pAttrNames)/sizeof(LPWSTR);
DWORD dwReturn;

//////////////////////////////////////////////////
// Get attribute values requested.
// Be aware that the order is not necessarily the
// same as requested using pAttrNames.
//////////////////////////////////////////////////
hr = pDirObject->GetObjectAttributes(pAttrNames,
dwNumAttr,
&pAttrInfo,
&dwReturn);

if(SUCCEEDED(hr))
{
for(DWORD idx = 0; idx < dwReturn; idx++)
{
if(_wcsicmp(pAttrInfo[idx].pszAttrName, L"cn") == 0)
{
if(pAttrInfo[idx].dwADsType == ADSTYPE_CASE_IGNORE_STRING)
{
wprintf(L"Common Name: %s\n",
pAttrInfo[idx].pADsValues[0].CaseIgnoreString);
}
}
else if(_wcsicmp(pAttrInfo[idx].pszAttrName, L"title") == 0)
{
if(pAttrInfo->dwADsType == ADSTYPE_CASE_IGNORE_STRING)
{
wprintf(L"Title: %s\n",
pAttrInfo[idx].pADsValues[0].CaseIgnoreString);
}
}
else if(_wcsicmp(pAttrInfo[idx].pszAttrName,
L"otherTelephone") == 0)
{
// Print the multi-valued property, "Other Telephones".
if(pAttrInfo[idx].dwADsType == ADSTYPE_CASE_IGNORE_STRING)
{
wprintf(L"Other Telephones:");
for(DWORD val = 0; val < pAttrInfo[idx].dwNumValues; val++)
{
wprintf(L" %s\n",
pAttrInfo[idx].pADsValues[val].CaseIgnoreString);
}
}
}
}

FreeADsMem(pAttrInfo);
}

pDirObject->Release();
}

CoUninitialize();

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Código de exemplo para atributos de
leitura
Artigo • 13/06/2023

O exemplo de código a seguir enumera as propriedades do usuário especificado no


domínio atual, pesquisando o usuário e, em seguida, usando IADsPropertyList para
enumerar suas propriedades. Lembre-se de que os valores de data e hora, como inteiros
grandes, são manipulados e como as cadeias de caracteres de octeto para objectSID e
objectGUID são tratadas.

C++

// Add adsiid.lib to the project.


// Add activeds.lib to the project.
// Add msvcrt.dll to the project.

#include "stdafx.h"
// For the pow function to calculate powers of 2.
#include <windows.h>
#include <ole2.h>
#include <math.h>
#include <wchar.h>
#include <objbase.h>
#include <activeds.h>
#include <atlbase.h>

// Ensure that you define UNICODE


// Define version 5 for Windows 2000
#define _WIN32_WINNT 0x0500
// For SID conversion API.
#include <sddl.h>

// The EnumeratePropertyValue function


HRESULT EnumeratePropertyValue(IADsPropertyEntry *pEntry)
{
HRESULT hr = E_FAIL;
IADsPropertyValue *pValue = NULL;
IADsLargeInteger *pLargeInt = NULL;
long lType, lValue;
BSTR bstr,szString;
VARIANT var;
CHAR *pszBOOL = NULL;
FILETIME filetime;
SYSTEMTIME systemtime;
IDispatch *pDisp = NULL;
DATE date;

// For Octet Strings


void HUGEP *pArray;
ULONG dwSLBound;
ULONG dwSUBound;

VariantInit(&var);
hr = pEntry->get_Values(&var);
if (SUCCEEDED(hr))
{
// Should be a safe array that contains variants
if (var.vt == (VT_VARIANT | VT_ARRAY))
{
VARIANT *pVar;
long lLBound, lUBound;

hr = SafeArrayAccessData((SAFEARRAY*)(var.pparray), (void HUGEP*


FAR*)&pVar);

// One-dimensional array. Get the bounds for the array.


hr = SafeArrayGetLBound((SAFEARRAY*)(var.pparray), 1, &lLBound);
hr = SafeArrayGetUBound((SAFEARRAY*)(var.pparray), 1, &lUBound);

// Get the count of elements.


long cElements = lUBound-lLBound + 1;

// Get the array elements.


if (SUCCEEDED(hr))
{
for (int i = 0; i < cElements; i++ )
{
switch (pVar[i].vt)
{
case VT_BSTR:
wprintf(L"%s ", pVar[i].bstrVal);
break;

case VT_DISPATCH:
hr = V_DISPATCH(&pVar[i])-
>QueryInterface(IID_IADsPropertyValue, (void**)&pValue);
if (SUCCEEDED(hr))
{
hr = pValue->get_ADsType(&lType);
switch (lType)
{
case ADSTYPE_DN_STRING:
hr = pValue->get_DNString(&bstr);
wprintf(L"%s ",bstr);
SysFreeString(bstr);
break;

case ADSTYPE_CASE_IGNORE_STRING:
hr = pValue->get_CaseIgnoreString(&bstr);
wprintf(L"%s ",bstr);
SysFreeString(bstr);
break;

case ADSTYPE_BOOLEAN:
hr = pValue->get_Boolean(&lValue);
pszBOOL = lValue ? "TRUE" : "FALSE";
wprintf(L"%s ",pszBOOL);
break;

case ADSTYPE_INTEGER:
hr = pValue->get_Integer(&lValue);
wprintf(L"%d ",lValue);
break;

case ADSTYPE_OCTET_STRING:
{
VARIANT varOS;

VariantInit(&varOS);

// Get the name of the property to


handle
// the required properties.
pEntry->get_Name(&szString);
hr = pValue->get_OctetString(&varOS);

// Get a pointer to the bytes in the


octet string.
if (SUCCEEDED(hr))
{
hr = SafeArrayGetLBound(
V_ARRAY(&varOS),
1,
(long FAR *) &dwSLBound );

hr = SafeArrayGetUBound(
V_ARRAY(&varOS),
1,
(long FAR *) &dwSUBound );

if (SUCCEEDED(hr))
{
hr = SafeArrayAccessData(
V_ARRAY(&varOS), &pArray );
}

if (0==wcscmp(L"objectGUID",
szString))
{
LPOLESTR szDSGUID = new WCHAR
[39];

// Cast to LPGUID
LPGUID pObjectGUID =
(LPGUID)pArray;

// Convert GUID to string.


::StringFromGUID2(*pObjectGUID,
szDSGUID, 39);
// Print the GUID
wprintf(L"%s ",szDSGUID);
}
else if (0==wcscmp(L"objectSid",
szString))
{
PSID pObjectSID = (PSID)pArray;
// Convert SID to string.
LPOLESTR szSID = NULL;

ConvertSidToStringSid(pObjectSID, &szSID);
wprintf(L"%s ",szSID);
LocalFree(szSID);
}
else
{
wprintf(L"Value of type Octet
String. No Conversion.");
}
SafeArrayUnaccessData(
V_ARRAY(&varOS) );
VariantClear(&varOS);
}

SysFreeString(szString);
}
break;

case ADSTYPE_UTC_TIME:
// wprintf(L"Value of type UTC_TIME\n");
hr = pValue->get_UTCTime(&date);
if (SUCCEEDED(hr))
{
VARIANT varDate;

// Pack in variant.vt
varDate.vt = VT_DATE;
varDate.date = date;

VariantChangeType(&varDate, &varDate,
VARIANT_NOVALUEPROP, VT_BSTR);
wprintf(L"%s ",varDate.bstrVal);
VariantClear(&varDate);
}
break;

case ADSTYPE_LARGE_INTEGER:
// wprintf(L"Value of type Large
Integer\n");
// Get the name of the property to handle
// the required properties.
pEntry->get_Name(&szString);
hr = pValue->get_LargeInteger(&pDisp);
if (SUCCEEDED(hr))
{
hr = pDisp-
>QueryInterface(IID_IADsLargeInteger, (void**)&pLargeInt);
if (SUCCEEDED(hr))
{
hr = pLargeInt-
>get_HighPart((long*)&filetime.dwHighDateTime);
hr = pLargeInt-
>get_LowPart((long*)&filetime.dwLowDateTime);
if((filetime.dwHighDateTime==0) &&
(filetime.dwLowDateTime==0))
{
wprintf(L"No Value ");
}
else
{
// Verify properties of type
LargeInteger that represent time
// if TRUE, then convert to
variant time.
if
((0==wcscmp(L"accountExpires", szString))||

(0==wcscmp(L"badPasswordTime", szString))||
(0==wcscmp(L"lastLogon",
szString))||
(0==wcscmp(L"lastLogoff",
szString))||
(0==wcscmp(L"lockoutTime",
szString))||
(0==wcscmp(L"pwdLastSet",
szString))
)
{
// Handle special case for
Never Expires where low part is -1.
if
(filetime.dwLowDateTime==-1)
{
wprintf(L"Never Expires
");
}
else
{
if
(FileTimeToLocalFileTime(&filetime, &filetime) != 0)
{
if
(FileTimeToSystemTime(&filetime, &systemtime) != 0)
{
if
(SystemTimeToVariantTime(&systemtime, &date) != 0)
{
VARIANT
varDate;
// Pack in
variant.vt
varDate.vt =
VT_DATE;
varDate.date
= date;

VariantChangeType(&varDate, &varDate, VARIANT_NOVALUEPROP, VT_BSTR);

wprintf(L"%s
",varDate.bstrVal);

VariantClear(&varDate);
}
else
{

wprintf(L"FileTimeToVariantTime failed ");


}
}
else
{

wprintf(L"FileTimeToSystemTime failed ");


}

}
else
{

wprintf(L"FileTimeToLocalFileTime failed ");


}
}
}
// Print the LargeInteger.
else
{
wprintf(L"Large Integer:
high: %d low: %d ",filetime.dwHighDateTime, filetime.dwLowDateTime);
}
}
}
if (pLargeInt)
pLargeInt->Release();
}
else
{
wprintf(L"Cannot get Large Integer");
}

if (pDisp)
pDisp->Release();
break;

case ADSTYPE_NT_SECURITY_DESCRIPTOR:
wprintf(L"Value of type NT Security
Descriptor ");
break;

case ADSTYPE_PROV_SPECIFIC:
wprintf(L"Value of type Provider Specific
");
break;

default:
wprintf(L"Unhandled ADSTYPE for property
value: %d ",lType);
break;
}
}
else
{
wprintf(L"QueryInterface failed for
IADsPropertyValue. HR: %x\n", hr);
}

if (pValue)
{
pValue->Release();
}
break;

default:
wprintf(L"Unhandled Variant type for property value
array: %d\n",pVar[i].vt);
break;
}
}
wprintf(L"\n");
}

// Decrement the access count for the array.


SafeArrayUnaccessData((SAFEARRAY*)(var.pparray));
}

VariantClear(&var);
}

return hr;
}

// The GetUserProperties function gets a property list for a user.


HRESULT GetUserProperties(IADs *pObj)
{
HRESULT hr = E_FAIL;
LPOLESTR szDSPath = new OLECHAR [MAX_PATH];
long lCount = 0L;
long lCountTotal = 0L;
long lPType = 0L;

if (!pObj)
{
return E_INVALIDARG;
}

// Call GetInfo to load all object properties into the cache


// because IADsPropertyList methods read from the cache.
hr = pObj->GetInfo();
if (SUCCEEDED(hr))
{
IADsPropertyList *pObjProps = NULL;

// QueryInterface for an IADsPropertyList pointer.


hr = pObj->QueryInterface(IID_IADsPropertyList, (void**)&pObjProps);
if (SUCCEEDED(hr))
{
VARIANT var;

// Enumerate the properties of the object.


hr = pObjProps->get_PropertyCount(&lCountTotal);
wprintf(L"Property Count: %d\n",lCountTotal);

VariantInit(&var);
hr = pObjProps->Next(&var);
if (SUCCEEDED(hr))
{
lCount = 1L;
while (hr == S_OK)
{
if (var.vt == VT_DISPATCH)
{
IADsPropertyEntry *pEntry = NULL;

hr = V_DISPATCH(&var)-
>QueryInterface(IID_IADsPropertyEntry, (void**)&pEntry);
if (SUCCEEDED(hr))
{
BSTR bstrString;

hr = pEntry->get_Name(&bstrString);
wprintf(L"%s: ", bstrString);
SysFreeString(bstrString);

hr = pEntry->get_ADsType(&lPType);
if (lPType != ADSTYPE_INVALID)
{
hr = EnumeratePropertyValue(pEntry);
if(FAILED(hr))
{
printf("EnumeratePropertyValue failed.
hr: %x\n",hr);
}
}
else
{
wprintf(L"Invalid type\n");
}
}
else
{
printf("IADsPropertyEntry QueryInterface call
failed. hr: %x\n",hr);
}

// Cleanup.
if (pEntry)
{
pEntry->Release();
}
}
else
{
printf("Unexpected returned type for VARIANT:
%d",var.vt);
}
VariantClear(&var);
hr = pObjProps->Next(&var);
if (SUCCEEDED(hr))
{
lCount++;
}
}
}
// Cleanup.
pObjProps->Release();
}

wprintf(L"Total properties retrieved: %d\n",lCount);


}

// Return S_OK if all properties were retrieved.


if (lCountTotal == lCount)
{
hr = S_OK;
}

return hr;
}

// The FindUserByName function searches for users.


#define NUM_ATTRIBUTES 1

HRESULT FindUserByName(IDirectorySearch *pSearchBase, // Container to


search.
LPOLESTR szFindUser, // Name of user to find.
IADs **ppUser) // Return a pointer to the user.
{
if ((!pSearchBase) || (!szFindUser))
{
return E_INVALIDARG;
}

HRESULT hrObj = E_FAIL;


HRESULT hr = E_FAIL;
ADS_SEARCHPREF_INFO SearchPrefs;
// COL for iterations
ADS_SEARCH_COLUMN col;
// Handle used for searching
ADS_SEARCH_HANDLE hSearch;

// Search entire subtree from root.


SearchPrefs.dwSearchPref = ADS_SEARCHPREF_SEARCH_SCOPE;
SearchPrefs.vValue.dwType = ADSTYPE_INTEGER;
SearchPrefs.vValue.Integer = ADS_SCOPE_SUBTREE;

// Set the search preference.


DWORD dwNumPrefs = 1;
hr = pSearchBase->SetSearchPreference(&SearchPrefs, dwNumPrefs);
if (FAILED(hr))
{
return hr;
}

// Create search filter.


LPWSTR pszFormat = L"(&(objectCategory=person)(objectClass=user)
(cn=%s))";
LPWSTR pszSearchFilter = new WCHAR[wcslen(pszFormat) +
wcslen(szFindUser) + 1];
if(NULL == pszSearchFilter)
{
return E_OUTOFMEMORY;
}

#ifdef _MBCS
swprintf_s(pszSearchFilter, pszFormat, szFindUser);
#endif _MBCS

// Set attributes to return.


LPWSTR pszAttribute[NUM_ATTRIBUTES] = {L"ADsPath"};

// Execute the search.


hr = pSearchBase->ExecuteSearch(pszSearchFilter,
pszAttribute,
NUM_ATTRIBUTES,
&hSearch);
if (SUCCEEDED(hr))
{
// Call IDirectorySearch::GetNextRow() to retrieve the next row of
data.
while(pSearchBase->GetNextRow(hSearch) != S_ADS_NOMORE_ROWS)
{
// Loop through the array of passed column names and
// print the data for each column.
for (DWORD x = 0; x < NUM_ATTRIBUTES; x++)
{
// Get the data for this column.
hr = pSearchBase->GetColumn(hSearch, pszAttribute[x], &col);
if (SUCCEEDED(hr))
{
// Print the data for the column and free the column.
// Be aware that the requested attribute is type
CaseIgnoreString.
if (ADSTYPE_CASE_IGNORE_STRING == col.dwADsType)
{
hr = ADsOpenObject( col.pADsValues-
>CaseIgnoreString,
NULL,
NULL,
ADS_SECURE_AUTHENTICATION,
IID_IADs,
(void**)ppUser);
if (SUCCEEDED(hr))
{
wprintf(L"Found User.\n",szFindUser);
wprintf(L"%s:
%s\r\n",pszAttribute[x],col.pADsValues->CaseIgnoreString);
hrObj = S_OK;
}
}

pSearchBase->FreeColumn( &col );
}
else
{
hr = E_FAIL;
}
}
}
// Close the search handle to cleanup.
pSearchBase->CloseSearchHandle(hSearch);
}

delete pszSearchFilter;

if (FAILED(hrObj))
{
hr = hrObj;
}

return hr;
}

// Entry point for the application.


#define BUFFER_SIZE (MAX_PATH * 2)
void wmain(int argc, wchar_t *argv[])
{
// Handle the command line arguments.
WCHAR szBuffer[BUFFER_SIZE];
if (argv[1] == NULL)
{
wprintf(L"This program finds a user in the current Windows 2000
domain\n");
wprintf(L"and displays its properties.\n");
wprintf(L"Enter Common Name of the user to find:");
fgetws(szBuffer, BUFFER_SIZE, stdin);
}
else
{
wcsncpy_s(szBuffer, argv[1], BUFFER_SIZE);
}

// If the string is empty, then exit.


if (0==wcscmp(L"", szBuffer))
{
return;
}

wprintf(L"\nFinding user: %s...\n", szBuffer);

// Initialize COM.
CoInitialize(NULL);
HRESULT hr = S_OK;

// Get rootDSE and the domain container DN.


IADs *pObject = NULL;
IDirectorySearch *pDS = NULL;
LPOLESTR szPath = new OLECHAR[MAX_PATH];
hr = ADsOpenObject(L"LDAP://rootDSE",
NULL,
NULL,
ADS_SECURE_AUTHENTICATION, // Use Secure Authentication.
IID_IADs,
(void**)&pObject);
if(SUCCEEDED(hr))
{
VARIANT var;
VariantInit(&var);
hr = pObject->Get(CComBSTR(L"defaultNamingContext"), &var);
if (SUCCEEDED(hr))
{
#ifdef _MBCS
wcscpy_s(szPath, L"LDAP://");
wcscat_s(szPath, var.bstrVal);
VariantClear(&var);
#endif _MBCS
if (pObject)
{
pObject->Release();
pObject = NULL;
}

// Bind to the root of the current domain.


hr = ADsOpenObject(szPath,
NULL,
NULL,
ADS_SECURE_AUTHENTICATION, // Use Secure Authentication.
IID_IDirectorySearch,
(void**)&pDS);
if (SUCCEEDED(hr))
{
hr = FindUserByName(pDS, // Container to search
szBuffer, // Name of user to find
&pObject); // Return a pointer to the user
if (SUCCEEDED(hr))
{
wprintf (L"---------------------------------------------
-\n");
wprintf (L"--------Call GetUserProperties-----------
\n");
hr = GetUserProperties(pObject);
wprintf (L"GetUserProperties HR: %x\n", hr);
}
else
{
wprintf(L"User \"%s\" not Found.\n", szBuffer);
wprintf (L"FindUserByName failed with the following HR:
%x\n", hr);
}

pDS->Release();
}

pObject->Release();
}
}

// Uninitialize COM.
CoUninitialize();

return;
}

O exemplo de código do Visual Basic a seguir mostra como obter as propriedades de


um objeto de usuário. Para usar este exemplo de código, crie uma referência à
Biblioteca de Tipos do Active DS e à Biblioteca de Objetos de Dados do Microsoft
ActiveX em seu projeto do Visual Basic.

VB

Const ADS_SCOPE_BASE = 0
Const ADS_SCOPE_ONELEVEL = 1
Const ADS_SCOPE_SUBTREE = 2

Const ADS_CHASE_REFERRALS_NEVER = 0
Const ADS_CHASE_REFERRALS_SUBORDINATE = &H20
Const ADS_CHASE_REFERRALS_EXTERNAL = &H40
Const ADS_CHASE_REFERRALS_ALWAYS = ADS_CHASE_REFERRALS_SUBORDINATE Or
ADS_CHASE_REFERRALS_EXTERNAL

Dim sUserName As String


Dim sMsg As String
Dim sSearchFilter As String
Dim lScope As Integer
Dim iIndex As Integer
iIndex = 0
Dim v, j, i
Dim rootDSE As IADs
Dim con As New Connection, rs As New Recordset
Dim Com As New Command
Dim oIADs As IADs
Dim sObjectDN As String
Dim sUserADsPath As String

sMsg = "This script enumerates the properties of a user on a domain."


sMsg = sMsg & vbCrLf & vbCrLf & "Specify the name of the user:"
sUserName = InputBox(sMsg)

If sUserName = "" Then


Exit Sub
End If

' Bind to the Active Directory with the RootDSE object.


Set rootDSE = GetObject("LDAP://RootDSE")
sObjectDN = "LDAP://" & rootDSE.Get("defaultNamingContext")
Set rootDSE = Nothing
Set oIADs = GetObject(sObjectDN)

' Search for entries with the specified name.


sSearchFilter = "CN='" & sUserName & "'"

' Open a Connection object.


con.Provider = "ADsDSOObject"

' Open the connection.


con.Open "Active Directory Provider"

' Create a command object on this connection.


Set Com.ActiveConnection = con

' Set the query string using SQL Dialect.


sMsg = "select name,AdsPath from '" & oIADs.ADsPath
sMsg = sMsg & "' where " & sSearchFilter & " ORDER BY NAME"
Com.CommandText = sMsg

' Notify the user of what the search filter is.


' MsgBox "Search Filter = " & Com.CommandText
'---------------------------------------------------
' Or you can use LDAP Dialect, for example,
'---------------------------------------------------
' Ex Com.CommandText="<LDAP://ldapsvr/dc=Fabrikam,DC=com>;
(objectClass=*);name"
' For LDAP Dialect, the valid search scope are base, oneLevel and subtree
' Com.CommandText = "<" & adDomainPath & ">;(objectClass=*);name;subtree"
' For LDAP Dialect (<LDAP:...>), cannot specify sort order in the string,
' However, you can use this SORT ON property to specify sort order.
' for SQL Dialect you can use ORDER BY in the SQL Statement
' Ex. Com.Properties("Sort On") = "Name"

' Set the preferences for Search


Com.Properties("Page Size") = 1000
Com.Properties("Timeout") = 30 'seconds
Com.Properties("searchscope") = ADS_SCOPE_SUBTREE
Com.Properties("Chase referrals") = ADS_CHASE_REFERRALS_EXTERNAL

' Do not cache the result, it results in less memory requirements.


Com.Properties("Cache Results") = False
Com.Properties("Size Limit") = 1 ' Limit to 1 Result

' Execute the query.


Set rs = Com.Execute

' Navigate the record set.


If Not rs.EOF Then
rs.MoveFirst
End If

On Error Resume Next


If Not rs.EOF Then
' Display the LDAP path for the row.
MsgBox "Found the user " & sUserName & " at " & rs.Fields("AdsPath")
sUserADsPath = rs.Fields("AdsPath")
rs.MoveNext
Else
MsgBox "Cannot find user name " & sUserName & " in the directory"
Exit Sub
End If

Set ds = Nothing
Set con = Nothing
Set rs = Nothing
Set Com = Nothing
Set oIADs = Nothing

' Now, enumerate the properties


Dim propList As IADsPropertyList
Dim propEnty As IADsPropertyEntry
Dim propVal As IADsPropertyValue
Dim count As Long

Dim sOutput As String


Dim currentcount As Long

Const NumToDisplayAtAtime As Integer = 10

' Bind to the user.


Set propList = GetObject(sUserADsPath)

' Put the properties into the cache.


propList.GetInfo

count = propList.PropertyCount
sOutput = "No of Property Found: " & Str(count) & vbCrLf & vbCrLf

For i = 0 To count - 1
currentcount = currentcount + 1
' Each item in property list has a property entry
Set propEntry = propList.Item(i)

' Append to outputstring.


sOutput = sOutput & "PROPERTYENTRY NAME:" & propEntry.Name
sOutput = sOutput & vbCrLf & " ------" & vbCrLf

' Each value in property entry has property values

For Each v In propEntry.Values


Set propVal = v
' Append to outputstring.
sOutput = sOutput & propVal.CaseIgnoreString & vbCrLf
Next

If currentcount = NumToDisplayAtAtime Then


MsgBox sOutput
sOutput = ""
currentcount = 0
End If
Next

Set propList = Nothing


Set propEnty = Nothing
Set propVal = Nothing

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Modificando atributos com ADSI
Artigo • 13/06/2023

Para modificar valores de atributo, o ADSI fornece os métodos IADs.Put e IADs.PutEx .


Esses métodos modificam os dados no cache do lado do cliente. O método
IADs.SetInfo deve ser chamado para confirmar as alterações no diretório.

7 Observação

Quando várias alterações de atributo são confirmadas em uma única chamada para
IADs.SetInfo, se qualquer atributo único não puder ser modificado, nenhum dos
atributos será modificado. Por exemplo, se você modificar os atributos sn e
givenName e limpar o atributo telephoneNumber de um objeto de usuário sem
chamadas subsequentes para o método SetInfo , as alterações serão inseridas
quando você chamar SetInfo. Se uma ou mais modificações não forem permitidas
e, portanto, não puderem ser executadas, nenhuma das modificações coletivas
feitas nos atributos será inserida durante a chamada para SetInfo.

O método IADs.Put usa um nome de atributo e um parâmetro variante. Use esse


método para definir atributos que contêm valores únicos e múltiplos.

O método IADs.PutEx fornece controle sobre as operações em atributos de vários


valores. Você pode acrescentar, excluir, atualizar e limpar valores existentes. O método
IADs.PutEx sempre espera uma matriz variante de valores de atributo. No entanto, você
pode usar esse método para definir um atributo com um único valor também.

O método IADs.PutEx usa as operações especificadas pela enumeração


ADS_PROPERTY_OPERATION_ENUM .

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


O método Put
Artigo • 13/06/2023

O método IADs::P ut salva o valor de uma propriedade para um objeto do Active


Directory por nome no cache de propriedades. Use IADs::P utEx para salvar
propriedades com valores múltiplos no cache de propriedades ou para remover uma
propriedade de um objeto . Esses valores não são mantidos no serviço de diretório
subjacente até que IADs::SetInfo seja chamado.

VB

Dim Namespace As IADsOpenDSObject


Dim User As IADsUser
Dim NewName As Variant
Dim sUserName As String
Dim sPassword As String

On Error GoTo CleanUp

Set Namespace = GetObject("LDAP:")

' Insert code to safely get the user name and password

Set User =
Namespace.OpenDSObject("LDAP://MyMachine/CN=Administrator,CN=Users,DC=MyDoma
in,DC=Fabrikam,DC=COM", sUserName, sPassword, ADS_SECURE_AUTHENTICATION)

NewName = InputBox("Enter a new name:")

' Set using IADs::PutMethod


User.Put "FullName", NewName
User.SetInfo

Exit Sub

CleanUp:
Set IADsOpenDSObject = Nothing
Set IADsUser = Nothing

End Sub

O exemplo de código a seguir mostra como usar IADs::P ut com um único valor:

VB

Dim x As IADs
Dim sUserName As String
Dim sFull As String
On Error GoTo CleanUp

sUserName = InputBox("Enter your user name:")

Set x = GetObject("LDAP://CN="& sUserName &",CN=Users,DC=Fabrikam, DC=Com")

sFull = InputBox ("Enter your full name:")


x.Put "name", sFull

' Commit to the directory.


x.SetInfo

Exit Sub

CleanUp:
MsgBox ("An error has occurred. " & Err.Description)
Set x = Nothing

O exemplo de código a seguir mostra como usar IADs::P ut com vários valores:

VB

Dim x As IADs
Dim sFirst As String
Dim sLast As String
Dim sUsername As String

On Error GoTo CleanUp

sUsername = InputBox("User name:")

Set x = GetObject("LDAP://CN=" & sUsername & ", CN=Users,DC=Fabrikam,


DC=Com")

sFirst = InputBox("Enter your first name:")


sLast = InputBox("Enter your last name:")

x.Put "givenName", sFirst


x.Put "sn", sLast

'Commit to the directory


x.SetInfo

Exit Sub

CleanUp:
MsgBox ("An error has occurred. " & Err.Description)
Set x = Nothing

O exemplo de código a seguir mostra como usar IADs::P ut com valores múltiplos e
únicos:
C++

int main(int argc, char* argv[], LPWSTR pszADsPath)


{
HRESULT hr;
IADs *pADs=NULL;

CoInitialize(NULL);

hr = ADsGetObject(pszADsPath,
IID_IADs,
(void**) &pADs );

if (!SUCCEEDED(hr) )
{
return hr;
}

VARIANT var;

// Using Put with a single value for the first name


VariantInit(&var);
V_BSTR(&var) = SysAllocString(L"Janet");
V_VT(&var) = VT_BSTR;
hr = pADs->Put( L"givenName", var );

// Using Put with a single value for the last name


VariantClear(&var);
V_BSTR(&var) = SysAllocString(L"Johns");
V_VT(&var) = VT_BSTR;
hr = pADs->Put( L"sn", var );
VariantClear(&var);

// Using Put with multiple values for other telephones


LPWSTR pszPhones[] = { L"425 844 1234", L"425 924 4321" };
DWORD dwNumber = sizeof( pszPhones ) /sizeof(LPWSTR);

hr = ADsBuildVarArrayStr( pszPhones, dwNumber, &var );


hr = pADs->Put( L"otherTelephone", var );
VariantClear(&var);

hr = pADs->SetInfo();
pADs->Release();

if (!SUCCEEDED(hr) )
{
return hr;
}

CoUninitialize();
return 0;
}
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


O método PutEx
Artigo • 13/06/2023

O método IADs::P utEx usa o nome de uma propriedade para salvar uma propriedade
com valores únicos ou múltiplos no cache de propriedades. Isso substitui qualquer valor
atualmente no cache de propriedades. Os valores no cache não são gravados no serviço
de diretório subjacente até que ocorra um IADs::SetInfo . O primeiro argumento de
PutEx indica se você deseja substituir ou adicionar a quaisquer valores existentes para a
propriedade . No exemplo a seguir, todos os valores existentes do atributo de descrição
são apagados no cache quando PutEx é chamado e apagados no servidor quando
SetInfo é chamado.

VB

Dim x As IADs
Set x = GetObject("LDAP://CN=Administrator,CN=Users,DC=Fabrikam,DC=com")
'----------------------------------------------
' Assume the otherHomePhoneNumber has the following values:
' 111-1111, 222-2222
'----------------------------------------------
x.PutEx ADS_PROPERTY_APPEND, "OtherhomePhone", Array("333-3333" )
x.SetInfo 'Now the values are 111-1111,222-222,333-3333.

x.PutEx ADS_PROPERTY_DELETE, "OtherHomePhone", Array("111-1111", "222-2222")


x.SetInfo 'Now the values are 333-3333.
x.PutEx ADS_PROPERTY_UPDATE, "OtherHomePhone", Array("888-8888", "999-9999")
x.SetInfo 'Now the values are 888-8888,999-9999.
x.PutEx ADS_PROPERTY_CLEAR, "OtherHomePhone", vbNull
x.SetInfo 'Now the property has no value.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


O método SetInfo
Artigo • 13/06/2023

O método IADs::SetInfo salva os valores atuais para as propriedades desse objeto do


Active Directory do cache de propriedades para o repositório de diretórios subjacente.
Isso é análogo à liberação de um buffer para o disco.

SetInfo atualiza objetos que já existem no diretório ou cria uma entrada de diretório
para objetos recém-criados.

No momento da chamada setInfo , se algum valor de cache de propriedade tiver sido


gravado com um código de controle PutEx , como ADS_PROPERTY_UPDATE ou
ADS_PROPERTY_CLEAR, as solicitações apropriadas serão passadas para o serviço de
diretório subjacente.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Modificando atributos com a interface
IDirectoryObject
Artigo • 13/06/2023

Além de IADs::P ut e IADs::P utEx, você pode usar o método


IDirectoryObject::SetObjectAttributes para modificar valores de atributo. Para usar esse
método, você deve preencher uma estrutura ADS_ATTR_INFO para cada atributo a ser
modificado.

O método IDirectoryObject::SetObjectAttributes permite modificar atributos de valor


único e de vários valores. Essa função fornece controles operacionais semelhantes,
como limpar, acrescentar, excluir e atualizar, àqueles encontrados no método IADs::P
utEx . As constantes de controle incluem:

ADS_ATTR_CLEAR
ADS_ATTR_UPDATE
ADS_ATTR_APPEND
ADS_ATTR_DELETE

Especificar ADS_ATTR_UPDATE disparará uma operação do lado do servidor que pode


ter uso intensivo de recursos. Um exemplo seria iniciar a operação para atualizar uma
longa lista de associação de grupo. Em geral, evite usar essa operação, a menos que a
modificação envolva um pequeno número de atributos no diretório. Para modificar uma
longa lista de associações de grupo, a abordagem mais eficiente seria ler a lista do
diretório subjacente, fazer modificações e armazenar a lista atualizada de volta para o
diretório.

7 Observação

Como IADs::P ut e IADs::P utEx com IADs::SetInfo, as alterações de atributo são


completamente confirmadas ou descartadas no Active Directory. Se uma ou mais
modificações não forem permitidas e, portanto, não puderem ser executadas,
nenhuma das modificações coletivas feitas nos atributos será confirmada no
diretório.

Exemplo
O exemplo de código a seguir mostra como modificar atributos de valores únicos e
múltiplos com o método IDirectoryObject::SetObjectAttributes .

C++

HRESULT hr;
LPCWSTR pwszADsPath = L"LDAP://CN=Jeff Smith,OU=Sales,DC=Fabrikam,DC=com";
IDirectoryObject *pDirObject = NULL;

// Bind to the object.


hr = ADsGetObject(pwszADsPath, IID_IDirectoryObject, (void**)&pDirObject);
if(SUCCEEDED(hr))
{
ADSVALUE adsvFaxNumber;
ADSVALUE rgadsvOtherTelephones[2];

// Set the new FAX number.


adsvFaxNumber.dwType = ADSTYPE_CASE_IGNORE_STRING;
adsvFaxNumber.CaseIgnoreString = L"425-707-9790";

// Set the first telephone number.


rgadsvOtherTelephones[0].dwType = ADSTYPE_CASE_IGNORE_STRING;
rgadsvOtherTelephones[0].CaseIgnoreString = L"425-707-9791";

// Set the second telephone number.


rgadsvOtherTelephones[1].dwType = ADSTYPE_CASE_IGNORE_STRING;
rgadsvOtherTelephones[1].CaseIgnoreString = L"425-707-9792";

ADS_ATTR_INFO attrInfo[2];

// Setup the facsimileTelephoneNumber attribute data.


attrInfo[0].pszAttrName = L"facsimileTelephoneNumber";
attrInfo[0].dwControlCode = ADS_ATTR_UPDATE;
attrInfo[0].dwADsType = adsvFaxNumber.dwType;
attrInfo[0].pADsValues = &adsvFaxNumber;
attrInfo[0].dwNumValues = 1;

// Setup the otherTelephone attribute data.


attrInfo[1].pszAttrName = L"otherTelephone";
attrInfo[1].dwControlCode = ADS_ATTR_UPDATE;
attrInfo[1].dwADsType = rgadsvOtherTelephones[0].dwType;
attrInfo[1].pADsValues = rgadsvOtherTelephones;
attrInfo[1].dwNumValues =
sizeof(rgadsvOtherTelephones)/sizeof(ADSVALUE);

DWORD dwReturn;

// Set the new attribute values.


hr = pDirObject->SetObjectAttributes(attrInfo,
sizeof(attrInfo)/sizeof(ADS_ATTR_INFO),
&dwReturn);

pDirObject->Release();
}
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Acessando o cache de propriedades
com interfaces IADsProperty
Artigo • 03/07/2023

As interfaces IADsProperty consistem em IADsPropertyList, IADsPropertyEntry e


IADsPropertyValue. Essas interfaces fornecem métodos para acessar e manipular
diretamente as propriedades de um cache de objeto. Uma propriedade é conhecida
como uma entrada de propriedade e corresponde a um atributo definido no esquema.
Uma entrada de propriedade pode ter um ou muitos valores de propriedade. Um
conjunto de entradas de propriedade é organizado como uma lista de propriedades.

A interface IADsPropertyList gerencia a lista de propriedades de um objeto ADSI. A


interface IADsPropertyEntry executa essa operação para uma entrada de propriedade.
Da mesma forma, a interface IADsPropertyValue representa um ou mais valores de
propriedade. Juntos, eles fornecem um mecanismo para os usuários:

Trabalhe diretamente com o cache de propriedades.


Trabalhe com diretórios que não contêm esquemas, como um servidor LDAP
versão 2.

As interfaces IADsProperty* operam estritamente no cache de propriedades e não


fazem nenhuma tentativa de cooperar com o servidor para recuperar ou modificar os
dados no repositório persistente. Dessa forma, essas interfaces são usadas apenas para
examinar e manipular propriedades no cache do cliente. Antes de usar essas interfaces,
você deve chamar o método IADs::GetInfo ou o método IADs::GetInfoEx explicitamente
para carregar as propriedades do objeto no cache, se o cache não tiver sido inicializado.
Depois de chamar os métodos dessas interfaces, você deve chamar IADs::SetInfo para
persistir as alterações no repositório de diretórios subjacente.

Para obter mais informações e um exemplo de código que pode ser usado para
implementar essas interfaces, consulte Código de exemplo para usar interfaces
IADsProperty para acessar o cache de propriedades.

Comentários

ツY トN
ツ Yes ト No
Esta página foi útil?

Obter ajuda no Microsoft Q&A


Código de exemplo para usar interfaces
IADsProperty para acessar o cache de
propriedades
Artigo • 03/06/2023

O exemplo de código a seguir mostra como usar as interfaces IADsPropertyList,


IADsPropertyEntry e IADsPropertyValue com C++ e ADSI.

C++

HRESULT hr;
BSTR bstr;
VARIANT var;
IDispatch *pDispatch;
IADsPropertyList *pPropList;
IADsPropertyEntry *pEntry;
IADsPropertyValue *pValue;
LONG lADsType;
IADs *pADs=NULL;

//////////////////////////////////////////////////////////
// Be aware that, for brevity, error handling is omitted.
//////////////////////////////////////////////////////////

hr = ADsGetObject(L"LDAP://DC=Sales,DC=Fabrikam,DC=Com", IID_IADs, (void**)


&pADs);

///////////////////////////////////////////////////////////////////
// Retrieve objects prior to calling IADsProperty* methods.
///////////////////////////////////////////////////////////////////
hr = pADs->GetInfo();
hr = pADs->QueryInterface(IID_IADsPropertyList, (void**) &pPropList);
pADs->Release();

//////////////////////////////////////////////////
// Get the DC property.
//////////////////////////////////////////////////
hr = pPropList->GetPropertyItem(CComBSTR("dc"), ADSTYPE_CASE_IGNORE_STRING,
&var);

if (SUCCEEDED(hr))
{
//////////////////////////////////////////
// Get the IADsPropertyEntry interface.
//////////////////////////////////////////
pDispatch = V_DISPATCH( &var );
hr = pDispatch->QueryInterface(IID_IADsPropertyEntry, (void**)&pEntry);
VariantClear(&var);
if (SUCCEEDED(hr))
{
VARIANT varValueArray;
VARIANT varValue;
long idx=0;

///////////////////////////////////////////////
// get_Values return array of VT_DISPATCH.
///////////////////////////////////////////////
hr = pEntry->get_Values(&varValueArray);
hr = pEntry->get_ADsType(&lADsType);
hr = SafeArrayGetElement(V_ARRAY(&varValueArray), &idx, &varValue);
pEntry->Release(); // Release entry.

/////////////////////////////////////
// IADsPropertyValue
/////////////////////////////////////
pDispatch = (IDispatch*) V_DISPATCH(&varValue);
hr = pDispatch->QueryInterface(IID_IADsPropertyValue,
(void**) &pValue);
pDispatch->Release();

/////////////////////////////
// Display the value.
/////////////////////////////
hr = pValue->get_CaseIgnoreString(&bstr);
printf("%S\n", bstr);
SysFreeString(bstr);
pValue->Release();
}
}

O exemplo de código a seguir mostra como usar as interfaces IADsPropertyList,


IADsPropertyEntry e IADsPropertyValue usando Visual Basic e ADSI.

VB

Dim propList As IADsPropertyList


Dim propEntry As IADsPropertyEntry
Dim propVal As IADsPropertyValue
Dim count As Long

Set propList = GetObject("LDAP://dc01/DC=Fabrikam,DC=com")

propList.GetInfo
count = propList.PropertyCount
Debug.Print "No of Property Found: " & count

For i = 0 To count - 1
' Each item in the property list has a property entry.
Set propEntry = propList.Item(i)
Debug.Print propEntry.Name
Debug.Print propEntry.ADsType
' Each value in property entry has property values.
For Each v In propEntry.Values
Set propVal = v
Debug.Print propVal.ADsType
Next
Next

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Sintaxe do atributo ADSI
Artigo • 12/06/2023

Cada atributo no diretório tem uma sintaxe associada. Por exemplo, inteiro, cadeia de
caracteres, numérico e assim por diante. O ADSI define sua própria sintaxe que é
mapeada para a sintaxe de diretório nativo. Esta seção descreve os tipos de sintaxes de
atributo no ADSI.

Cadeia de caracteres de nome diferenciada


VB

Syntax Type: ADSTYPE_DN_STRING

O nome diferenciado é útil para vincular dois objetos. Por exemplo, ele pode criar um
link que torna o objeto Alice um gerente do objeto Bob. Se o objeto Alice for movido
para um local diferente, o link do gerente entre Alice e Bob será atualizado
automaticamente.

O nome diferenciado deve conter um objeto de nome diferenciado válido. Se o nome


diferenciado não corresponder a um objeto existente válido, a maioria dos servidores
rejeitará a solicitação e retornará um erro de violação de restrição.

Exemplos:

VB

Set x = GetObject("LDAP://CN=Bob, OU=Sales,DC=Fabrikam, DC=com)


x.Put "manager", "CN=Alice, OU=Sales, DC=Fabrikam, DC=COM"
x.SetInfo

PADS_ATTR_INFO pInfo;
// .. IDirectoryObject::GetObjectAttribute
printf("%S\n", pInfo->pADsValues->DNString );

Cadeia de caracteres exata de maiúsculas e


minúsculas ignora cadeia de caracteres
VB

Syntax Types: ADSTYPE_CASE_IGNORE_STRING, ADSTYPE_CASE_EXACT_STRING.


Case Exact String é uma cadeia de caracteres que diferencia maiúsculas de minúsculas,
enquanto Case Ignore String é uma cadeia de caracteres que não diferencia maiúsculas
de minúsculas. Uma grande porcentagem de atributos no diretório usa essa sintaxe.

7 Observação

O diretório pode ou não armazená-lo como uma cadeia de caracteres Unicode. No


entanto, ADSI aceita e retorna cadeias de caracteres Unicode.

Exemplo:

VB

Dim propList As IADsPropertyList


Set propList = GetObject("LDAP://DC=Fabrikam,DC=com")
Set propVal = New PropertyValue

' --- Property Value ---


propVal.CaseIgnoreString = "Fabrikam, Inc - Seattle, WA"
propVal.ADsType = ADSTYPE_CASE_IGNORE_STRING

Cadeia de caracteres imprimível


VB

Syntax Type: ADSTYPE_PRINTABLE_STRING

Essa sintaxe é usada para atributos com valores de cadeia de caracteres em que
maiúsculas e minúsculas são consideradas diferentes para comparações, por exemplo,
"FABRIKAM" e "Fabrikam" não correspondem. ADSI aceita qualquer conteúdo para uma
cadeia de caracteres imprimível; ele não tenta verificar se eles são realmente
imprimíveis.

Cadeia de caracteres numérica


VB

Syntax Type: ADSTYPE_NUMERIC_STRING


Nessa sintaxe, as cadeias de caracteres correspondem como em Cadeia de Caracteres
Imprimível, exceto que todos os caracteres de espaço são ignorados em comparações.
O ADSI não executa a verificação de valor para garantir que apenas numerais e espaços
apareçam em valores dessa sintaxe. O Active Directory aceita qualquer conteúdo para
uma cadeia de caracteres numérica; ele não verifica se os caracteres são numéricos.

Hora UTC
VB

Syntax Type: ADSTYPE_UTC_TIME

Essa sintaxe armazena a data e a hora em uma única cadeia de caracteres. O formato de
cadeia de caracteres consiste em três partes concatenadas: (1) YYMMDD; (2) HHMM ou
HHMMSS (ambos são aceitáveis); e (3) "Z" para indicar que o tempo fornecido é Gmt
(Horário médio de Greenwich) ou "+/-HHMM" para indicar que a hora fornecida é hora
local com o diferencial fornecido de GMT. O diferencial é baseado na fórmula:
GMT=Local+diferencial.

7 Observação

Os dois primeiros dígitos do ano não são armazenados nessa cadeia de caracteres.

Alguns exemplos de valores legais são "9101311455Z", "910131145503Z", "9101314455-


0500", "910131145503+0130". Essa cadeia de caracteres é armazenada como caracteres
ASCII de byte único e nenhum número de página de código é armazenado com ele.

Embora haja suporte para a ordenação, ela é feita apenas como uma classificação de
cadeia de caracteres que não diferencia maiúsculas de minúsculas ASCII, não
interpretando corretamente o significado das cadeias de caracteres.

Qualquer valor de cadeia de caracteres válido é aceito. Nenhuma tentativa é feita para
garantir que a cadeia de caracteres contenha uma cadeia de caracteres de tempo válida.

Tempo Generalizado
VB

Syntax Type: ADSTYPE_UTC_TIME


Se um novo atributo para armazenar valores de tempo estiver sendo definido, a sintaxe
GeneralizedTime deverá ser usada. A sintaxe GeneralizedTime usa quatro caracteres
para representar o ano em vez de dois como com UTCTime.

O formato da sintaxe GeneralizedTime é "YYYYYMMDDHHMMSS.0Z". Um exemplo de


um valor aceitável é "20010928060000.0Z". O "Z" não indica nenhum diferencial de
tempo. O Active Directory armazena data/hora como Gmt (Hora Média de Greenwich).
Se nenhum diferencial de tempo for especificado, GMT será o padrão.

Se a hora for especificada em um fuso horário diferente de GMT, o diferencial entre o


fuso horário e o GMT será acrescentado à cadeia de caracteres em vez de "Z" no
formato "YYYYMMDDHHMMSS.0[+/-]HHMM". Um exemplo de um valor aceitável é
"20010928060000.0+0200".

O diferencial é baseado na fórmula: GMT=Local+diferencial.

Boolean
VB

Syntax Type: ADSTYPE_BOOLEAN

O Active Directory aceita apenas um valor assinado de 32 bits para essa sintaxe. Ele
manipula zero como FALSE e todos os valores não zero como TRUE.

Inteiro
VB

Syntax Type: ADSTYPE_INTEGER

Um valor numérico assinado de 32 bits.

Inteiro Grande
VB

Syntax Type: ADSTYPE_LARGE_INTEGER


Um valor numérico assinado de 64 bits. Inteiros grandes são realmente implementados
como objetos COM na interface IADsLargeInteger . Os métodos HighPart e LowPart
são usados para acessar as duas metades de 32 bits do valor inteiro grande.

Exemplo:

VB

Dim x as IADsLargeInteger
Set o = GetObject("LDAP://DC=Fabrikam,DC=com")
Set x = o.Get("UsnCreated")
Debug.Print x.HighPart
Debug.Print x.LowPart

Cadeia de caracteres de octeto


VB

Syntax Type: ADSTYPE_OCTET_STRING

Uma cadeia de caracteres de octeto é retornada como uma matriz variante de bytes.
Isso consiste em uma contagem de tamanhos (número de octetos) seguida por uma
série de octetos. Um octeto é um byte de 8 bits, portanto, uma série de octetos é uma
cadeia de caracteres de dados binários.

Classe Object
VB

Syntax Type: ADSTYPE_CASE_IGNORE_STRING

A Classe object é um identificador de objeto exclusivo para uma determinada classe de


esquema. A classe de cada instância de objeto é identificada pelo atributo objectClass .
Quando criado, você nunca pode alterar uma classe de objeto. objectClass é um
atributo com vários valores. Ele lista a classe específica do objeto e as classes de todas
as classes estruturais ou abstratas das quais a classe específica foi derivada. Isso inclui
Top, a classe da qual todas as outras classes são derivadas em última instância. O Active
Directory não lista classes auxiliares no atributo objectClass .

Descritor de Segurança
VB

Syntax Type: ADSTYPE_NT_SECURITY_DESCRIPTOR

Os direitos de acesso definem quais habilidades uma entidade de segurança tem


quando tenta executar uma operação em um objeto do Active Directory. Um descritor
de segurança descreve as informações de controle de acesso associadas a um objeto .

O descritor de segurança é armazenado como uma propriedade de um objeto de


diretório na propriedade nTSecurityDescriptor . Quando um usuário autenticado tenta
acessar um objeto de diretório, o servidor de diretório determina o acesso concedido ou
negado ao usuário com base no descritor de segurança do objeto.

A enumeração ADS_SD_CONTROL_ENUM especifica sinalizadores de controle para um


descritor de segurança.

O exemplo de código a seguir mostra como obter um descritor de segurança.

VB

' Obtain a security descriptor.


Dim x as IADs
Dim sd as IADsSecurityDescriptor
Dim acl as IADsAccessControlList

Set x = GetObject("LDAP://DC=Fabrikam, DC=com")


Set sd = x.Get("nTSecurityDescriptor")

Debug.Print sd.Control
Debug.Print sd.Group
Debug.Print sd.Owner
Debug.Print sd.Revision

Set acl = sd.DiscretionaryAcl


Set sacl = sd.SystemAcl

Tópicos relacionados
Sintaxes para atributos do Active Directory

Escolhendo uma sintaxe

Como especificar valores de comparação


Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Mapeamento da sintaxe do Active
Directory para a sintaxe ADSI
Artigo • 13/06/2023

A tabela a seguir mapeia as sintaxes do Active Directory para suas sintaxes ADSI
correspondentes.

ID da sintaxe do Tipo de sintaxe do Active Directory Tipo de sintaxe ADSI


atributo equivalente

2.5.5.1 Cadeia de caracteres DN Cadeia de caracteres DN

2.5.5.2 ID de objeto Cadeia de caracteres


CaseIgnore

2.5.5.3 Cadeia de caracteres que diferencia Cadeia de caracteres


maiúsculas CaseExact

2.5.5.4 Cadeia de caracteres ignorada por maiúsculas Cadeia de caracteres


e minúsculas CaseIgnore

2.5.5.5 Cadeia de caracteres de maiúsculas e Cadeia de caracteres


imprimível

2.5.5.6 Cadeia de caracteres numérica Cadeia de caracteres


numérica

2.5.5.7 OU Nome DNWithOctetString Sem suporte

2.5.5.8 Booliano Boolean

2.5.5.9 Integer Integer

2.5.5.10 Cadeia de caracteres de octeto Cadeia de caracteres de


octeto

2.5.5.11 Hora Hora UTC

2.5.5.12 Unicode Caso Ignorar Cadeia de


Caracteres

2.5.5.13 Endereço Sem suporte

2.5.5.14 Distname-Address

2.5.5.15 Descritor de Segurança NT IADsSecurityDescriptor

2.5.5.16 Inteiro Grande Iadslargeinteger


ID da sintaxe do Tipo de sintaxe do Active Directory Tipo de sintaxe ADSI
atributo equivalente

2.5.5.17 SID Cadeia de caracteres de


octeto

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Usando o esquema ADSI
Artigo • 13/06/2023

Um esquema define o universo de objetos armazenados em um diretório. No Active


Directory, o esquema especifica quais atributos um objeto de serviço de diretório pode
ou deve ter. Ele também especifica o intervalo de valores e a sintaxe dos atributos e se
eles dão suporte a valores únicos ou múltiplos. Em suma, o esquema é organizado por
definições de classe, definições de atributo e sintaxe de atributo. O ADSI fornece três
interfaces para ler dados de atributo, classe e sintaxe de um esquema: IADsClass,
IADsProperty e IADsSyntax.

O Active Directory usa um conjunto de objetos de esquema para fornecer


gerenciamento de esquema dinamicamente extensível. Para obter mais informações
sobre um objeto desconhecido, pesquise seus objetos de esquema associados. Para
criar uma nova definição de classe ou estender uma definição de classe existente, você
pode criar ou estender os objetos de esquema apropriados. Os objetos de esquema são
organizados no contêiner de esquema de um determinado diretório. Para acessar uma
classe de esquema de objeto, use a propriedade IADs.Schema do objeto para obter a
cadeia de caracteres ADsPath e use essa cadeia de caracteres para associar a uma
interface IADsClass na classe de esquema de objeto.

Para determinar definições de atributo, ou seja, o intervalo de valores, a sintaxe e assim


por diante, inspecione os objetos de atributo de esquema para cada propriedade
compatível com o objeto de serviço de diretório. Para obter mais informações sobre
como acessar os objetos de atributo de esquema, consulte IADsProperty.

O ADSI abstrai os dados de sintaxe conforme necessário e permite que você use
IADsSyntax para identificar a sintaxe necessária para representar os dados do objeto.

Para obter mais informações sobre o esquema do Active Directory, consulte Esquema
do Active Directory. Para obter exemplos de código a serem usados para ler o contêiner
de esquema, consulte Lendo o esquema.

Comentários
Esta página foi útil? ツ Yes ト No
Obter ajuda no Microsoft Q&A
Lendo o esquema
Artigo • 03/06/2023

A maioria dos provedores dá suporte ao esquema que é fornecido com o Active


Directory. O esquema contém definições de classe e atributo. O ADSI abstrai o esquema
em "Provider://schema". Cada objeto carrega o local do esquema no qual sua classe é
definida. Você pode usar o método de propriedade IADs::get_Class para obter essas
informações.

Para associar ao contêiner de esquema em um domínio específico, faça o seguinte:

VB

Dim SchemaContainer As Object


Set SchemaContainer = GetObject("LDAP://Fabrikam/Schema")

C++

hr = ADsGetObject(L&quot;LDAP://Fabrikam/Schema&quot;, IID_IADsContainer,
(void**) &pSchema );

Para listar informações no contêiner de esquema, associe-se ao contêiner e enumere


cada objeto no contêiner, conforme mostrado no seguinte:

VB

Dim prop As Object


Dim obj As Object
Dim SchemaContainer As Object
Dim Class As Object

Set SchemaContainer = GetObject("LDAP://Fabrikam/Schema")


'Show all items in the schema container
For Each obj In SchemaContainer
Debug.Print obj.Name & " (" & obj.Class & ")"
Next

'Show the optional attributes


For Each prop In Class.OptionalProperties
Debug.Print prop
Next

C++
IADsContainer *pSchema=NULL;
HRESULT hr;

CoInitialize(NULL);

hr = ADsGetObject(L&quot;LDAP://Fabrikam/Schema&quot;,
IID_IADsContainer, (void**) &pSchema );

if ( !SUCCEEDED(hr) )
{
return hr;
}

// Enumerate schema objects


IEnumVARIANT *pEnum = NULL;
hr = ADsBuildEnumerator( pSchema, &pEnum );
pSchema->Release(); // This is no longer needed, since we have the
enumerator already.

if ( SUCCEEDED(hr) )
{
VARIANT var;
ULONG lFetch;
IADs *pChild=NULL;
VariantInit(&var);

while( SUCCEEDED(ADsEnumerateNext( pEnum, 1, &var, &lFetch )) && lFetch


== 1 )
{
hr = V_DISPATCH(&var)->QueryInterface( IID_IADs, (void**) &pChild );
if ( SUCCEEDED(hr) )
{
BSTR bstrName;
BSTR bstrClass;
// Get more information on the child classes
pChild->get_Name(&bstrName);
pChild->get_Class(&bstrClass);

printf(&quot;%S\t\t(%S)\n&quot;, bstrName, bstrClass );

// Clean-up
SysFreeString(bstrName);
SysFreeString(bstrClass);

pChild->Release();
}
VariantClear(&var);
}
}

CoUninitialize();
Você também pode associar a um objeto e obter o local do esquema, conforme
mostrado no seguinte:

VB

Dim prop As Object


Dim dom As Object
Dim Class As Object

Set dom = GetObject("LDAP://Fabrikam")


Debug.Print dom.Schema
Set Class = GetObject(dom.Schema)
'Mandatory attributes
For Each prop In Class.MandatoryProperties
Debug.Print prop
Next

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Coleções e grupos
Artigo • 03/06/2023

O ADSI usa objetos de coleção para representar qualquer conjunto arbitrário de itens
em um serviço de diretório que pode ser representado usando o mesmo tipo de dados.
Os objetos de coleção são definidos como um conjunto de valores VARIANT ,
representando qualquer um dos tipos de dados de Automação válidos. Objetos de
coleção podem representar informações persistentes, como listas de controle de acesso
e informações voláteis, como trabalhos de impressão em uma fila de impressão.

A convenção COM padrão para listar o conteúdo de um objeto de coleção (ou


contêiner) é criar um objeto enumerador que dê suporte a IEnumVARIANT, que tem
métodos para percorrer a lista de objetos de coleção. As interfaces no ADSI que
fornecem o método get__NewEnum (observe os dois sublinhados) são IADsContainer,
IADsMembers e IADsCollection. A ADSI também fornece as funções auxiliares
ADsBuildEnumerator e ADsEnumerateNext para programas C e C++ para simplificar a
enumeração. Os clientes de automação usam enumeração implicitamente quando
chamam Next em um loop For .

Os grupos são simplesmente coleções de objetos que dão suporte à interface


IADsMembers .

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Enumerando objetos ADSI
Artigo • 03/06/2023

Esta seção descreve os seguintes tópicos:

Enumeração
Funções auxiliares de enumeração

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Enumeração
Artigo • 03/06/2023

Acessar e manipular dados com ADSI fornece vários exemplos de enumeração. Você
também pode enumerar os filhos de objetos de contêiner. Essas crianças são objetos
em si, em vez de apenas propriedades em objetos.

O exemplo a seguir usa a interface IADsContainer para enumerar os filhos do contêiner.

VB

Dim Container as IADsContainer


Dim Child as IADs

Set Container = GetObject("LDAP://MyServer/DC=MyDomain,DC=Fabrikam,DC=com")

For Each Child in Container


Debug.Print Child.Name
Next Child

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Funções auxiliares de enumeração
Artigo • 13/06/2023

Há três funções auxiliares de enumerador que podem ser usadas do C/C++ para auxiliar
na navegação de objetos do Active Directory. Eles são ADsBuildEnumerator,
ADsEnumerateNext e ADsFreeEnumerator.

ADsBuildEnumerator
A função auxiliar ADsBuildEnumerator encapsula o código necessário para criar um
objeto enumerador. Ele chama o método IADsContainer::get__NewEnum para criar um
objeto enumerador e, em seguida, chama o método QueryInterface de IUnknown para
obter um ponteiro para a interface IEnumVARIANT desse objeto. O objeto de
enumeração é o mecanismo de Automação para enumerar em contêineres. Use a
função ADsFreeEnumerator para liberar esse objeto enumerador.

ADsEnumerateNext
A função auxiliar ADsEnumerateNext preenche uma matriz VARIANT com elementos
buscados de um objeto enumerador. O número de elementos recuperados pode ser
menor do que o número solicitado.

ADsFreeEnumerator
Libera um objeto enumerador criado anteriormente por meio da função
ADsBuildEnumerator .

O exemplo de código a seguir mostra uma função que usa funções auxiliares de
enumerador em C++.

C++

/***************************************************************************
**
Function: TestEnumObject
Arguments: pszADsPath - ADsPath of the container to be enumerated
(WCHAR*).
Return: S_OK if successful, an error code otherwise.
Purpose: Example using ADsBuildEnumerator, ADsEnumerateNext and
ADsFreeEnumerator.
****************************************************************************
**/
#define MAX_ENUM 100

HRESULT
TestEnumObject( LPWSTR pszADsPath )
{
ULONG cElementFetched = 0L;
IEnumVARIANT * pEnumVariant = NULL;
VARIANT VariantArray[MAX_ENUM];
HRESULT hr = S_OK;
IADsContainer * pADsContainer = NULL;
DWORD dwObjects = 0, dwEnumCount = 0, i = 0;
BOOL fContinue = TRUE;

hr = ADsGetObject(
pszADsPath,
IID_IADsContainer,
(void **)&pADsContainer
);

if (FAILED(hr)) {

printf("\"%S\" is not a valid container object.\n", pszADsPath) ;


goto exitpoint ;
}

hr = ADsBuildEnumerator(
pADsContainer,
&pEnumVariant
);

if( FAILED( hr ) )
{
printf("ADsBuildEnumerator failed with %lx\n", hr ) ;
goto exitpoint ;
}

fContinue = TRUE;
while (fContinue) {

IADs *pObject ;

hr = ADsEnumerateNext(
pEnumVariant,
MAX_ENUM,
VariantArray,
&cElementFetched
);

if ( FAILED( hr ) )
{
printf("ADsEnumerateNext failed with %lx\n",hr);
goto exitpoint;
}
if (hr == S_FALSE) {
fContinue = FALSE;
}

dwEnumCount++;

for (i = 0; i < cElementFetched; i++ ) {

IDispatch *pDispatch = NULL;


BSTR bstrADsPath = NULL;

pDispatch = VariantArray[i].pdispVal;

hr = V_DISPATCH( VariantArray + i )->QueryInterface(IID_IADs,


(void **) &pObject) ;

if( SUCCEEDED( hr ) )
{
pObject->get_ADsPath( &bstrADsPath );
printf( "%S\n", bstrADsPath );
}
pObject->Release();
VariantClear( VariantArray + i );
SysFreeString( bstrADsPath );
}

dwObjects += cElementFetched;
}

printf("Total Number of Objects enumerated is %d\n", dwObjects);

exitpoint:
if (pEnumVariant) {
ADsFreeEnumerator( pEnumVariant );
}

if (pADsContainer) {
pADsContainer->Release();
}

return(hr);
}

Comentários
ツ Yes ト No
Esta página foi útil?

Obter ajuda no Microsoft Q&A


Pesquisando o Active Directory
Artigo • 13/06/2023

Uma função importante do Active Directory é resolve consultas de dados para pessoas,
bem como dados de configuração para computadores e serviços. Para escrever
consultas eficientes para o Active Directory, é útil estar familiarizado com o seguinte:

Determinando o escopo da consulta: o cliente deve encontrar propriedades para


objetos que podem estar localizados em qualquer lugar dentro de uma floresta ou
apenas dentro de um domínio ou dentro de uma determinada UO (unidade
organizacional)?
Determinando a profundidade da consulta: a consulta deve pesquisar apenas um
nível ou pode atravessar para outros diretórios LDAP?
Desempenho e manipulação de grandes conjuntos de resultados: como o cliente
deve lidar efetivamente com o potencial de um conjunto de resultados grande?
Determinando as melhores consultas: que tipo de consultas fornecem os
resultados mais eficientes? Que tipo de consultas o desenvolvedor deve evitar?
Noções básicas sobre a sintaxe da consulta: o ADSI dá suporte à sintaxe LDAP,
conforme documentado no RFC 2254, bem como a um subconjunto de SQL.
Escolha de interfaces: ADSI fornece suporte ao OLE DB, bem como a uma interface
C/C++ chamada IDirectorySearch. Como o ADSI funciona para vários namespaces,
você pode usar essas interfaces para consultar outros namespaces, como o
Exchange, bem como o Active Directory. Como o ADO (ActiveX Data Object) é um
modelo de objeto de acesso a dados com script simples sobre o OLE DB, as
interfaces OLE DB funcionam bem para programadores do Visual Basic e
gravadores de script de página da Web. Os novos recursos de acesso a dados em
aplicativos do Visual Studio e do Office que aproveitam o ADO e o OLE DB agora
podem acessar dados do Active Directory da mesma forma que acessam dados de
outros provedores OLE DB, como SQL Server. No entanto, se um desenvolvedor do
C/C++ precisar executar uma pesquisa de diretório simples, a interface
IDirectorySearch poderá ser mais apropriada do que as interfaces OLE DB.

Os tópicos a seguir descrevem como pesquisar o Active Directory para garantir que o
aplicativo emita a consulta mais eficiente, considerando os requisitos do cliente:

Escopo da consulta
Desempenho e manipulação de conjuntos de resultados grandes
Sintaxe de filtro de pesquisa
Interfaces de consulta
Pesquisando dados binários
Consulta Distribuída
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Escopo da consulta
Artigo • 13/06/2023

O escopo de uma consulta é determinado pelo objeto ao qual você associa. Se você não
tiver certeza de onde o objeto está localizado na empresa, precisará fazer a pesquisa o
mais ampla possível. No entanto, se você souber que o objeto estará contido em um
domínio específico, como o domínio ao qual o usuário está conectado ou dentro de um
grupo específico, como o grupo Gerentes, defina o escopo da pesquisa para refletir a
circunstância. Para obter o melhor desempenho, você deve tentar direcionar o escopo
para pesquisar o menor número de objetos possível.

Quando você não tiver certeza de onde um objeto estará localizado na empresa, você
poderá associar ao serviço de catálogo global. O serviço de catálogo global contém
uma lista de cada objeto no diretório e um pequeno subconjunto dos atributos de cada
objeto. Depois de encontrar o objeto no catálogo global, você pode recuperar seu
nome diferenciado do catálogo global e usá-lo para associar ao objeto para executar
outras operações.

Depois de decidir a qual objeto associar, você pode restringir ainda mais a consulta a
um dos seguintes escopos: uma consulta base, uma consulta de um nível ou uma
pesquisa de subárvore, conforme mostrado na ilustração a seguir.

Base
Uma consulta base limita a pesquisa apenas ao objeto base. O número máximo de
objetos retornados é sempre um. Essa pesquisa pode ser usada para verificar a
existência de um objeto . Por exemplo, se você tiver o nome diferenciado de um objeto
e precisar verificar a existência do objeto com base no caminho, poderá usar uma
pesquisa de um nível. Se a pesquisa falhar, você poderá assumir que o objeto pode ter
sido renomeado ou movido para um local diferente ou que recebeu dados incorretos
sobre o objeto. Lembre-se de que você deve armazenar o GUID em vez do nome
diferenciado se quiser revisitar um objeto. Isso permite que o objeto seja renomeado ou
movido na hierarquia de diretório sem quebrar o link persistente.

Um Nível
Uma pesquisa de um nível é restrita aos filhos imediatos de um objeto base, mas exclui
o próprio objeto base. Essa configuração pode executar uma pesquisa direcionada para
objetos filho imediatos de um objeto pai. Por exemplo, se você tiver um objeto pai
chamado P1 e seus filhos imediatos forem: C1, C2, C3, em uma pesquisa de um nível,
C1, C2 e C3 devem ser incluídos ao avaliar os critérios, mas P1 não faria parte da
pesquisa. Uma pesquisa de um nível pode ser usada para enumerar todos os filhos de
um objeto. Na verdade, em alguns provedores ADSI, a enumeração IADsContainer é
convertida em uma pesquisa de um nível.

Subárvore
Uma pesquisa de subárvores, também conhecida como uma pesquisa profunda, inclui
todos os objetos abaixo do objeto base, excluindo o próprio objeto base. Essa pesquisa
pode gerar indicações para outros servidores. Essa pesquisa tem o maior escopo e pode
retornar um grande conjunto de resultados. Se possível, pesquise em pelo menos um
atributo indexado e defina as configurações de indicações (para obter mais informações,
consulte Desempenho e manipulação de conjuntos de resultados grandes) para
corresponder aos seus requisitos de pesquisa. Também é sugerido que os resultados de
uma pesquisa de subárvore sejam executados de forma assíncrona e paginados para
reduzir a sobrecarga do servidor e a eficácia da rede. Normalmente, uma pesquisa de
subárvores é usada para pesquisar objetos em um determinado escopo. Por exemplo,
pesquise todos os usuários com contas que expirarão em 30 dias ou menos.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Desempenho e manipulação de
conjuntos de resultados grandes
Artigo • 03/06/2023

Lidar com grandes conjuntos de resultados pode levar a tempos de resposta muito
longos. Esta seção descreve métodos para otimizar pesquisas para obter o melhor
desempenho do aplicativo habilitado para diretório. Os seguintes tópicos são
abordados:

O que faz uma consulta rápida?


Processando um conjunto de resultados

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


O que faz uma consulta rápida?
Artigo • 13/06/2023

Considere os seguintes conceitos de aprimoramento de desempenho ao executar uma


consulta:

Se possível, filtre somente os atributos indexados. Use atributos de índice que você
espera que gerem o menor número de ocorrências. Para obter mais informações e
uma lista abrangente de atributos indexados para Windows, consulte Esquema do
Active Directory.
Pesquise objectCategory em vez de objectClass porque objectClass não é uma
propriedade indexada.
Esteja ciente das indicações. Considere pesquisar o catálogo global se os atributos
estiverem listados como replicados pelo GC.
Evite pesquisar texto no meio e no final de uma cadeia de caracteres. Por exemplo,
"cn=*hille*" ou "cn=*larouse".
Suponha que uma pesquisa de subárvore retorne um conjunto de resultados
grande. Use a paginação ao executar pesquisas de subárvores. Em seguida, o
servidor poderá transmitir um grande conjunto de resultados em partes, reduzindo
os recursos de memória do lado do servidor. Isso nivela efetivamente o uso da
rede e reduz a necessidade de enviar partes extremamente grandes de dados pela
rede.
Defina corretamente o escopo de suas pesquisas para não recuperar mais do que
o necessário.
Execute uma pesquisa complexa em vários atributos, pois ela tem menos uso
intensivo de desempenho do que a execução de várias pesquisas. Uma pesquisa
por um objeto que lê dois atributos é mais eficiente do que duas pesquisas para o
mesmo objeto, cada uma retornando um atributo.
Para ler o atributo com um grande número de valores, use limites de intervalo para
minimizar o tamanho da pesquisa para que você possa ler alguns milhares de
membros por vez. Para obter mais informações sobre como especificar limites de
intervalo de atributos, consulte Recuperação de intervalo de atributos.
Associar a um objeto mantém o identificador de associação para o restante da
sessão. Não associe e desassocie para cada chamada. Se você estiver usando o
ADO ou o OLE DB, não crie muitos objetos de conexão.
Leia o rootDSE uma vez e lembre-se de seu conteúdo para o restante da sessão.
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Indexação
Artigo • 03/07/2023

Quando possível, pesquise atributos indexados ou pelo menos um atributo indexado.


Como em geral com bancos de dados, a pesquisa em um atributo indexado permite
que o servidor calcule com mais eficiência o conjunto de resultados.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


objectCategory vs. objectClass
Artigo • 13/06/2023

Os atributos objectCategory e objectClass podem se referir a uma determinada classe


de esquema de um objeto de diretório. No entanto, há uma distinção importante na
semântica entre os dois. "objectClass=joy" refere-se a esses objetos de diretório nos
quais "joy" representa qualquer classe na hierarquia de classe de objeto.
"objectCategory=joy", por outro lado, refere-se a esses objetos de diretório nos quais
"joy" identifica uma classe específica na hierarquia da classe de objeto.

objectClass pode ter vários valores, enquanto objectCategory usa um único valor. Por
isso, objectCategory é mais adequado para correspondência de tipos de objetos em
uma pesquisa de diretório. ADSI usa isso como o critério de correspondência padrão.
Pesquisas usando um objetoClass não são escalonáveis para bancos de dados grandes.
O ADSI dá suporte a sintaxes "(objectCategory=SomeDN)" e "
(objectCategory=Ldap_Display_Name_of_Class)".

A exceção a tudo isso é que o filtro de pesquisa LDAP "(objectClass=*)" não especifica
uma pesquisa na classe de objeto, mas apenas testa a presença dos objetos.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Indicações (ADSI)
Artigo • 12/06/2023

As indicações ocorrem quando o servidor que você está consultando não contém esses
dados, mas pode encontrá-los. O servidor de destino retorna o conjunto de resultados,
que pode incluir os dados reais e uma indicação para outro servidor para recuperar os
dados adicionais. Ao habilitar a busca de referências, o código do cliente ADSI
subjacente usará esses dados de indicação para tentar recuperar o objeto de destino do
servidor descrito nos dados de referência. Lembre-se de que a desabilitação da busca
de referências pode resultar em um conjunto de resultados menor, enquanto habilitar a
busca de referências pode fazer com que uma consulta se estenda por muitos
servidores. Quando possível, a solução recomendada é usar o catálogo global.

Para obter mais informações sobre indicações e busca de referências no Active


Directory, consulte Indicações.

Por exemplo, quando um cliente instrui o Servidor A (A) a consultar um objeto de


usuário (U), A pode sugerir que o cliente continue a pesquisa no Servidor B (B) se U não
residir em A, mas é conhecido por estar em B. O cliente tem a opção de buscar a
indicação ou não. As indicações de pesquisa liberam o cliente de exigir reconhecimento
avançado da funcionalidade de cada servidor. No entanto, o cliente deve especificar o
tipo de indicações que um servidor deve fazer.

O Active Directory oferece serviços de indicação de pesquisa. Um cliente pode escolher


qualquer um dos seguintes tipos de busca de referência:

Nunca: o servidor não deve gerar uma indicação para um cliente, embora
reconheça que outro servidor armazena os dados solicitados.

Externo: o servidor deverá gerar indicações se a solicitação puder ser resolvida em


outro servidor de uma árvore de diretório diferente. Por exemplo, um cliente
consulta "OU=Sales,DC=Fabrikam,DC=COM" no servidor "fab01" no domínio
"Fabrikam.com". No entanto, o objeto não pertence a "fab01", mas é conhecido
por estar no servidor "arc01" no domínio "Fabrikam.com". Assim, "fab01" refere o
cliente a "arc01".

Subordinado: o servidor deve gerar indicações se a solicitação puder ser resolvida


em um servidor cujo nome forma um caminho contíguo do servidor de origem. O
escopo de pesquisa deve estar no nível da subárvore.

Por exemplo, o Servidor A contém objetos em "DC=Sales,DC=Fabrikam,DC=Com".


O servidor B contém objetos em "DC=Seattle,DC=Sales,DC=Fabrikam,DC=Com".
Lembre-se de que o nome do Servidor B forma um caminho contíguo do Servidor
A. Quando um cliente entra em contato com o Servidor A, solicita uma pesquisa de
subárvore em "DC=Sales,DC=Fabrikam,DC=Com" e especifica a indicação para ser
um tipo subordinado, o seguinte evento ocorre:
O servidor A retorna todos os objetos que ele conhece dentro de seu escopo.
O Servidor A informa ao cliente que os objetos em
"DC=Seattle,DC=Sales,DC=Fabrikam,DC=COM" podem ser encontrados no
Servidor B.

O cliente pode optar por entrar em contato com o Servidor B. Nesse caso, o
seguinte evento ocorrerá:
O servidor B responde com os objetos solicitados.
Se o Servidor B detectar outros servidores no caminho de nomenclatura
contíguo e o processo continuar.

Sempre: o servidor gerará indicações se a pesquisa puder ser resolvida com base
no tipo externo ou no tipo subordinado.

7 Observação

No Active Directory, o catálogo global contém todos os objetos em uma


determinada empresa. Pesquisar um servidor de catálogo global gera melhor
desempenho do que buscar indicações de um servidor para outro.

Na maioria dos casos, a busca de referência será transparente para o chamador. Se a


indicação for para um objeto em um domínio ou floresta diferente, a API LDAP
subjacente tentará usar as credenciais atuais para associar ao destino da indicação. Se
isso for bem-sucedido, a perseguição de indicação será transparente. Se isso não for
bem-sucedido, a indicação e um código de erro de indicação serão retornados.

Para obter mais informações sobre como usar as opções de busca de referência com
uma interface de pesquisa específica, consulte:

Busca de indicação com IDirectorySearch


Pesquisando com objetos de dados ActiveX
Pesquisando com OLE DB
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Montando cadeias de caracteres de
consulta
Artigo • 13/06/2023

No Active Directory, o uso de critérios de filtragem específicos pode aumentar o


desempenho da pesquisa. Isso ocorre porque o Active Directory avalia todos os
predicados, identifica os índices e seleciona um índice que provavelmente produzirá o
menor conjunto de valores retornados.

Evite pesquisar texto no meio ou no final de uma cadeia de caracteres, por exemplo,
"cn=*hille*" ou "cn=*larouse".

Quando possível, pesquise atributos indexados. Os atributos indexados são


armazenados em todos os controladores de domínio, portanto, a consulta
provavelmente será mais rápida do que pesquisar um atributo não indexado.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Recuperando grandes conjuntos de
resultados
Artigo • 13/06/2023

Quando houver a possibilidade de que o conjunto de resultados que será retornado


contenha mais de 1000 itens, você deverá usar uma pesquisa paginada. As pesquisas do
Active Directory executadas sem paginação estão limitadas a retornar um máximo dos
primeiros 1000 registros. Com uma pesquisa paginada, o conjunto de resultados é
apresentado como páginas individuais, cada uma contendo um número
predeterminado de entradas de resultado. Com esse tipo de pesquisa, novas páginas de
entradas de resultado são retornadas até que o final do conjunto de resultados seja
atingido.

Por padrão, o servidor que responde a uma solicitação de consulta calcula


completamente um conjunto de resultados antes de retornar dados. Em um conjunto de
resultados grande, isso requer memória do servidor à medida que o conjunto de
resultados é adquirido e largura de banda de rede quando o resultado grande é
retornado. Definir um tamanho de página permite que o servidor envie os dados em
páginas à medida que as páginas estão sendo criadas. Em seguida, o cliente armazena
esses dados em cache e fornece um cursor para o código no nível do aplicativo. A
paginação é definida definindo quantas linhas o servidor calcula antes que os dados
sejam retornados pela rede para o cliente.

A pesquisa paginada oferece benefícios ao cliente e ao servidor. Por exemplo, o cliente


pode ser mais responsivo ao apresentar os resultados aos usuários finais. Isso é
especialmente relevante para ferramentas gráficas de interface do usuário que podem
exibir dados enquanto outro thread recebe simultaneamente mais dados do servidor.

Ao configurar sua consulta, se você especificar uma ordem de classificação para o


conjunto de resultados, o servidor deverá calcular completamente o conjunto de
resultados antes de retornar os dados ao cliente, o que afeta o tempo de resposta da
consulta.

No lado do servidor, a pesquisa paginada torna a operação escalonável. Por exemplo, se


cem clientes emitirem solicitações de pesquisa simultaneamente e, em média, cada
cliente retornar 200 objetos, se o tamanho da página não for especificado, o servidor
deverá ter memória suficiente para manter o conjunto de resultados completo de
20.000 entradas. Como alternativa, se cada cliente especificasse um tamanho de página
de dez objetos, os requisitos de memória no servidor seriam reduzidos por um fator de
20.
7 Observação

Nem todos os serviços de diretório dão suporte a pesquisas paginada. O Active


Directory implementa a arquitetura de tamanho da página.

Muitos servidores de diretório especificam um Limite Administrativo para o número


máximo de objetos que podem ser retornados se um cliente não especificar o tamanho
da página. Quando o Limite Administrativo é atingido, ADSI gera o erro
ERROR_DS_ADMIN_LIMIT_EXCEEDED Win32.

No lado do cliente, uma pesquisa paginada permite que um cliente interrompa a


operação enquanto ela ainda está em andamento. Por outro lado, em uma pesquisa não
paginada, o cliente é bloqueado até que os dados sejam completamente retornados ou
ocorra um erro. Isso poderá afetar o desempenho da rede se o conjunto de resultados
for maior e levar mais tempo do que o esperado.

Em nome do cliente, o ADSI manipula o tamanho da página de forma transparente. O


cliente não precisa contar o número de objetos em andamento. O ADSI encapsula a
interação do servidor para o cliente. Da perspectiva do cliente, a pesquisa retorna um
conjunto de resultados completo.

Para obter mais informações sobre como usar a opção de tempo limite de pesquisa com
uma interface de pesquisa específica, consulte:

Paginação com IDirectorySearch


Pesquisando com objetos de dados ActiveX
Pesquisando com o OLE DB

Uma pesquisa paginada é transparente para seu aplicativo porque o ADSI continua a
recuperar automaticamente páginas adicionais de resultados até chegar ao final do
conjunto de resultados ou ao final do limite de tempo definido. Quando você usa uma
pesquisa paginada, o limite de tamanho não substitui o tamanho da página. O limite de
tamanho só pode ser usado quando você recupera um conjunto de resultados que
contém menos de 1000 entradas.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Somente atributos de pesquisa
Artigo • 13/06/2023

Às vezes, você executa uma pesquisa para determinar que tipo de dados está disponível
para um objeto. Nesse caso, você está interessado apenas nos atributos e não nos
valores do objeto. Para fazer isso, defina a opção "somente atributos de pesquisa".
Especificar essa opção retorna os nomes de atributo sem seus valores. No entanto, o
conjunto de resultados inclui apenas os atributos que têm valores atribuídos. Por
exemplo, considere um objeto com os seguintes atributos:

syntax

First Name = Jeff


Last Name = Smith
Department = <Empty>
Phone Number = (425) 432-3442

Quando a opção somente atributos de pesquisa é definida, o conjunto de resultados


inclui:

syntax

First Name
Last Name
Phone Number

Para obter mais informações sobre como usar a opção somente atributos de pesquisa
com uma interface de pesquisa específica, consulte:

Retornando apenas nomes de atributo com IDirectorySearch


Pesquisando com objetos de dados ActiveX
Pesquisando com OLE DB

Comentários
Esta página foi útil? ツ Yes ト No
Obter ajuda no Microsoft Q&A
Limite de Tamanho da Pesquisa
Artigo • 12/06/2023

Para reduzir os requisitos de memória, um cliente pode se concentrar em um pequeno


número de objetos retornados do servidor e ignorar o restante do conjunto de
resultados. Para fazer isso, o cliente especifica um limite de tamanho de pesquisa e
outros critérios de pesquisa apropriados. Por exemplo, se um diretório armazenar as
pontuações de teste de um distrito escolar, você poderá consultar os dez melhores
alunos com as notas de teste mais altas especificando um limite de tamanho de dez e
uma ordem de classificação decrescente.

Para obter mais informações sobre como usar a opção de limite de tamanho de
pesquisa com uma interface de pesquisa específica, consulte:

Limite de tamanho com IDirectorySearch


Pesquisando com objetos de dados ActiveX
Pesquisando com OLE DB

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Limite de Tempo de Pesquisa
Artigo • 03/06/2023

Ao solicitar uma pesquisa em um servidor que esteja sob uma carga de trabalho pesada,
convém instruir o servidor a restringir a pesquisa a um limite de tempo especificado. Por
exemplo, para executar um aplicativo para gerar um relatório semanal em um servidor
que está em execução perto da capacidade e evitar maximizar o tempo da CPU e
impedir que outros trabalhos sejam executados, você pode definir o tempo de pesquisa
como um valor pequeno e executar novamente o aplicativo mais tarde se ele não gerar
o relatório.

Alguns servidores podem impor seu próprio limite de tempo administrativo. Nesses
casos, se você especificar um valor de limite de tempo de pesquisa maior que o limite
de tempo administrativo, o servidor ignorará sua especificação e usará seu limite de
tempo administrativo interno.

Para obter mais informações sobre como usar a opção de limite de tempo de pesquisa
com uma interface de pesquisa específica, consulte:

Limite de tempo do servidor com IDirectorySearch


Pesquisando com objetos de dados ActiveX
Pesquisando com OLE DB

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Tempo Limite de Pesquisa
Artigo • 13/06/2023

Um cliente também pode impor um limite de tempo que aguardará que um servidor
retorne o conjunto de resultados. O valor da opção "tempo limite de pesquisa"
especifica esse limite. Quando o servidor não responde a uma consulta dentro do
período de tempo especificado, o cliente pode interromper a pesquisa e tentar
novamente mais tarde.

A propriedade de tempo limite é útil quando um cliente solicita uma pesquisa


assíncrona. Em uma pesquisa assíncrona, o cliente faz uma solicitação e, em seguida,
prossegue com outras tarefas enquanto aguarda o servidor retornar os resultados. É
possível que o servidor possa ficar offline sem notificar o cliente. Nesse caso, o cliente
não tem como reconhecer que o servidor ainda está processando a consulta ou se ela
deixou de estar ativa. A propriedade de tempo limite fornece ao cliente algum controle
nessas instâncias.

Para obter mais informações sobre como usar a opção de tempo limite de pesquisa com
uma interface de pesquisa específica, consulte:

Limite de tempo do cliente com IDirectorySearch


Pesquisando com objetos de dados ActiveX
Pesquisando com OLE DB

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Pesquisas assíncronas
Artigo • 13/06/2023

Habilitar a pesquisa assíncrona (assíncrona) resulta em uma chamada para GetFirstRow


ou a primeira chamada para blocos GetNextRow até que a primeira entrada seja
retornada do servidor. Ou seja, se a pesquisa no servidor exigir muito tempo, os
primeiros resultados serão retornados rapidamente. Isso pode ajudar ao preencher uma
caixa de listagem com os resultados da pesquisa. Os resultados da pesquisa são
exibidos conforme são retornados.

Se async estiver desabilitado, a primeira chamada para GetFirstRow ou GetNextRow


será bloqueada até que o servidor compute todo o conjunto de resultados e retorne.
Somente então é a primeira linha retornada. Isso não é recomendado se espera-se que
o conjunto de resultados seja grande.

Se a paginação e a assíncrona estiverem habilitadas, a primeira chamada para


GetFirstRow ou GetNextRow será bloqueada até que o servidor gere e envie a primeira
página de resultados. Se um tamanho de página razoável tiver sido definido, os
resultados serão exibidos imediatamente. Mais importante, se espera-se que os
resultados da pesquisa sejam muito grandes e você pesquisa uma entrada específica,
não é necessário que você solicite mais resultados do servidor depois de encontrar as
entradas que lhe interessam.

Uma pesquisa assíncrona paginada fornece um controle fino de uma pesquisa. Isso será
útil se os resultados da pesquisa puderem ser muito grandes e exigirem tempo extenso
do servidor.

Para obter mais informações sobre como usar pesquisas assíncronas com uma interface
de pesquisa específica, consulte:

Pesquisas síncronas e assíncronas com IDirectorySearch


Pesquisando com objetos de dados ActiveX
Pesquisando com OLE DB

Comentários

ツ Yes ト No
ツ Yes ト No
Esta página foi útil?

Obter ajuda no Microsoft Q&A


Recuperação de intervalo de atributo
Artigo • 13/06/2023

Um atributo de vários valores pode ter quase qualquer número de valores. Em muitos
casos, pode ser vantajoso ou até mesmo necessário limitar o intervalo de valores
recuperados por uma consulta.

A recuperação de intervalo envolve a solicitação de um número limitado de valores de


atributo em uma única consulta. O número de valores solicitados deve ser menor ou
igual ao número máximo de valores com suporte pelo servidor. Para reduzir o número
de vezes que a consulta deve entrar em contato com o servidor, o número de valores
solicitados deve estar o mais próximo possível desse máximo. Para permitir que um
aplicativo funcione corretamente com todos os servidores Windows, um número
máximo de 1000 deve ser usado.

Os especificadores de intervalo para uma consulta de propriedade exigem o seguinte


formulário:

C++

range=<low range>-<high range>

em que "<low range>" é o índice baseado em zero do primeiro valor de propriedade a


ser recuperado e "<high range>" é o índice baseado em zero do último valor de
propriedade a ser recuperado. Zero é usado para "<intervalo> baixo" para especificar a
primeira entrada. O caractere curinga (*) pode ser usado para "<alto intervalo>" para
especificar todas as entradas restantes.

A tabela a seguir lista exemplos de especificadores de intervalo.

Exemplo Descrição

range=0-* Recupere todos os valores de propriedade. Isso está sujeito a limites impostos pelo
servidor.

range=0- Recupere de 1º a 501º valores, inclusive.


500

range=2-3 Recupere os valores 3º e 4º.

range=501- Recupere o 502º e todos os valores restantes. Isso está sujeito a limites impostos
* pelo servidor.
Há várias maneiras diferentes de recuperar um intervalo de valores de propriedade. O
método IADs.GetInfoEx pode ser usado em uma linguagem de automação ou C++. O
método IADs.GetInfoEx é o método preferencial para executar a recuperação de
intervalo. Para obter mais informações sobre como usar IADs.GetInfoEx para
recuperação de intervalo, consulte Usando IADs::GetInfoEx para recuperação de
intervalo.

Se uma linguagem de automação for usada, o ADO (ActiveX Directory Objects) poderá
ser usado para recuperar um intervalo de valores de propriedade. Para obter mais
informações sobre como usar o ADO para recuperação de intervalo, consulte Usando o
ADO para recuperação de intervalo.

Se c++ for usado, as interfaces IDirectorySearch e IDirectoryObject poderão ser usadas


para recuperar um intervalo de valores de propriedade. Para obter mais informações
sobre como usar IDirectorySearch e IDirectoryObject para recuperação de intervalo,
consulte Using IDirectorySearch and IDirectoryObject for Range Retrieval. Esse tipo de
recuperação deve ser feito em consultas com um tipo de escopo base
(ADS_SCOPE_BASE).

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Usando IADs::GetInfoEx para
recuperação de intervalo
Artigo • 13/06/2023

O método IADs.GetInfoEx pode ser usado para recuperar um intervalo de valores de


atributo. O intervalo de valores a serem recuperados é especificado na matriz de nome
do atributo passada para o método .

Os especificadores de intervalo para uma consulta de propriedade exigem o seguinte


formulário:

C++

<property name>;range=<low range>-<high range>

em que "<property name>" é o ldapDisplayName do atributo, "<low range>" é o


índice baseado em zero do primeiro valor de atributo a ser recuperado e "<high
range>" é o índice baseado em zero do último valor de atributo a ser recuperado. Zero
é usado para "<intervalo> baixo" para especificar a primeira entrada. O caractere
curinga (*) pode ser usado para "<alto intervalo>" para especificar todas as entradas
restantes.

O exemplo de código a seguir contém uma função que mostra como usar a
recuperação de intervalo com IADs::GetInfoEx para enumerar os membros de um
grupo.

C++

HRESULT EnumGroupWithGetInfoEx(LPCWSTR pwszGroupDN,


LPCWSTR pwszUsername,
LPCWSTR pwszPassword)
{
if(NULL == pwszGroupDN)
{
return E_POINTER;
}

HRESULT hr;
IADs *pads;

hr = ADsOpenObject( pwszGroupDN,
pwszUsername,
pwszPassword,
ADS_SECURE_AUTHENTICATION,
IID_IADs,
(void**)&pads);

if(SUCCEEDED(hr))
{
const DWORD dwStep = 1000;
DWORD dwLowRange;
DWORD dwHighRange;
WCHAR wszAttr[MAX_PATH];
LPWSTR rgAttrs[1];

rgAttrs[0] = wszAttr;

dwLowRange = 0;
dwHighRange = dwLowRange + (dwStep - 1);

do
{
VARIANT var;

// Perform this query with the "range=<lowRange>-<highRange>"


range.
swprintf_s(wszAttr, L"member;range=%d-%d", dwLowRange,
dwHighRange);

hr = ADsBuildVarArrayStr(rgAttrs, 1, &var);
if(SUCCEEDED(hr))
{
hr = pads->GetInfoEx(var, 0);

VariantClear(&var);

if(SUCCEEDED(hr))
{
hr = pads->Get(CComBSTR("member"), &var);
if(SUCCEEDED(hr))
{
if(var.vt == (VT_VARIANT | VT_ARRAY))
{
VARIANT *pVar;
long lLBound, lUBound;

// Get the array of VARIANTs.


hr = SafeArrayAccessData((SAFEARRAY*)
(var.pparray), (void HUGEP* FAR*)&pVar);
if(SUCCEEDED(hr))
{
// Get the bounds for the array.
hr = SafeArrayGetLBound((SAFEARRAY*)
(var.pparray), 1, &lLBound);
hr = SafeArrayGetUBound((SAFEARRAY*)
(var.pparray), 1, &lUBound);

// Get the number of elements.


long cElements = lUBound - lLBound + 1;
// Enumerate the elements.
for(long i = 0; i < cElements; i++)
{
switch(pVar[i].vt)
{
case VT_BSTR:
wprintf(pVar[i].bstrVal);
wprintf(L"\n");
break;
}
}

// Release the array.


SafeArrayUnaccessData((SAFEARRAY*)
(var.pparray));
}
}
// This occurs only if one element is retrieved.
else if (var.vt == VT_BSTR)
{
wprintf(var.bstrVal);
wprintf(L"\n");
}

VariantClear(&var);
}

// Increment the high and low ranges to query for the


next block of objects.
dwLowRange = dwHighRange + 1;
dwHighRange = dwLowRange + (dwStep - 1);
}
}
}while(SUCCEEDED(hr));

pads->Release();
}

return hr;
}

O exemplo de código a seguir contém uma função que mostra como usar a
recuperação de intervalo com IADs.GetInfoEx para enumerar os membros de um grupo.

VB

Private Sub EnumGroupMembersWithGetInfoEx(strGroupDN As String, strUsername


As String, strPassword As String)
Dim oGroup As IADs
Dim dso As IADsOpenDSObject

On Error GoTo quit


strPath = "LDAP://" & strGroupDN

If "" <> strUsername Then


' Bind to the group with the specified user name and password.
Set dso = GetObject("LDAP:")
Set oGroup = dso.OpenDSObject(strPath, strUsername, strPassword, 1)
Else
' Bind to the group with the current credentials.
Set oGroup = GetObject(strPath)
End If

' For compatibility with all operating systems, the number of objects
' retrieved by each query should not exceed 999. The number of objects
' to retrieve should be as close as possible to 999 to reduce the number
' of round trips to the server necessary to retrieve the objects.
rangeStep = 999
lowRange = 0
highRange = lowRange + rangeStep

Do
' Use the "member;range=<lowRange>-<highRange>" syntax.
strCommandText = "member;range=" & lowRange & "-" & highRange
Debug.Print "Current search command: " & strCommandText

' Load the specified range of members into the local cache. This
will
' throw an error if the range exceeds the properties contained in
the
' object. The "On Error GoTo quit" error handler will cause the loop
' to terminate when this happens.
On Error GoTo quit
oGroup.GetInfoEx Array(strCommandText), 0

' Enumerate the retrieved members.


oMembers = oGroup.Get("member")
If vbArray And VarType(oMembers) Then
For Each oMember In oMembers
' Add the member.
Debug.Print oMember
nRetrieved = nRetrieved + 1
Next
Else
' oGroup.Get returned only one member, so add it to the list.
Debug.Print oMembers
nRetrieved = nRetrieved + 1
End If

' Increment the high and low ranges to query for the next block of
objects.
lowRange = highRange + 1
highRange = lowRange + rangeStep
Loop While True

quit:
End Sub
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Usando o ADO para recuperação de
intervalo
Artigo • 12/06/2023

Se uma linguagem de automação for usada, o ADO (ActiveX Directory Objects) deverá
ser usado para recuperar um intervalo de valores de propriedade.

Ao usar o ADO para recuperação de intervalo, há um problema que deve ser resolvido
especificamente. Ao consultar o grupo final de valores de propriedade, o objeto ADO
recuperará zero objetos, mesmo que mais permaneçam. Para recuperar os valores
restantes, use o caractere curinga '*'. Por exemplo, se um grupo contiver 150 membros,
os valores de membro 0 a 100 poderão ser recuperados normalmente usando a
recuperação de intervalo. Se o intervalo 101-200 for solicitado, o objeto ADO retornará
zero objetos. Neste ponto, é necessário modificar a consulta para o intervalo de
solicitação 101-*. Isso recuperará valores de 101 a 150. Para obter mais informações e
um exemplo de código, consulte Código de exemplo para usar o intervalo para
recuperar membros de um grupo.

Para obter mais informações sobre como usar o ADO para recuperação de intervalo,
consulte:

Dialeto De Variação LDAP do ADO


Dialeto De Variação de SQL do ADO
Código de exemplo para usar o intervalo para recuperar membros de um grupo

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Dialeto Variando LDAP do ADO
Artigo • 12/06/2023

Ao usar o ADO (ActiveX Directory Objects) com o dialeto LDAP, o atributo e o


especificador de intervalo não exigem aspas.

Veja a seguir um exemplo do dialeto LDAP do ADO.

C++

Command.Text = "<LDAP://CN=NewGroup,DC=Fabrikam,DC=Com>;
(objectCategory=group);name,member;Range=51-*;base"

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Dialeto De Variação de SQL do ADO
Artigo • 13/06/2023

Ao usar o ADO (ActiveX Directory Objects), usando o dialeto SQL, as aspas simples (')
devem ser usadas em torno do atributo e do especificador de intervalo. Veja a seguir
um exemplo do dialeto SQL do ADO.

SQL

Command.CommandText = "select Name, 'member;Range=0-50' from


'LDAP://CN=Group1,DC=Fabrikam,DC=Com' where objectCategory='group'"

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Código de exemplo para usar o
intervalo para recuperar membros de
um grupo
Artigo • 03/06/2023

O exemplo de código a seguir usa o ADO (ActiveX Directory Objects) para recuperar os
membros de um grupo.

O snippet de código a seguir requer uma referência à Biblioteca 6.0 do Microsoft


ActiveX Data Objects.

VB

Private Sub EnumGroupWithADO(ByVal strGroupDN As String, ByVal strUsername


As String, ByVal strPassword As String)
Dim oConn
Dim oComm
Dim rangeStep
Dim lowRange
Dim highRange
Dim lastLoop
Dim commandPrefix
Dim amp
Dim commandSuffix
Dim oRS
Dim nRetrieved
oConn = CreateObject("ADODB.Connection")
oComm = CreateObject("ADODB.Command")

oConn.Provider = "ADsDSOObject"
oConn.Properties("ADSI Flag") = 1

If strUsername <> "" Then


oConn.Properties("User ID") = strUsername
oConn.Properties("Password") = strPassword
End If

oConn.Open()
oComm.ActiveConnection = oConn

' For compatibility with all operating systems, the number of


objects
' retrieved by each query should not exceed 999.
rangeStep = 999

lastLoop = False
lowRange = 0
highRange = lowRange + rangeStep
commandPrefix = "<LDAP://" & strGroupDN > ">;
(objectClass=*);member;range="
commandSuffix = ";base"

Do
If lastLoop Then
' Perform this query with the "range=<lowRange>-*" range.
oComm.CommandText = commandPrefix & lowRange & "-*" &
commandSuffix
Else
' Perform this query with the "range=<lowRange>-<highRange>"
range.
oComm.CommandText = commandPrefix & lowRange & "-" &
highRange & commandSuffix
End If
Debug.Print("Current search command: " & oComm.CommandText)

' Execute the query.


oRS = oComm.Execute

' Reset the retrieved members counter.


nRetrieved = 0

' Enumerate the retrieved members.


While Not oRS.EOF
For Each oField In oRS.Fields
If VarType(oField) = (vbArray + vbVariant) Then
For Each oValue In oField.Value
Debug.Print(vbTab & oValue)
nRetrieved = nRetrieved + 1
Next
End If
Next
oRS.MoveNext()
End While

' If the last query was performed, exit the loop.


If lastLoop = True Then
Exit Do
End If

If nRetrieved = 0 Then
' No objects were retrieved by the last query; perform one
last query
' with the “range=<lowRange>-*” range.
lastLoop = True
Else
' Increment the high and low ranges to query for the next
block of objects.
lowRange = highRange + 1
highRange = lowRange + rangeStep
End If
Loop While nRetrieved = lowRange
End Sub
End Module

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Usando IDirectorySearch e
IDirectoryObject para recuperação de
intervalo
Artigo • 12/06/2023

As interfaces IDirectoryObject ou IDirectorySearch podem ser usadas para recuperar


um intervalo de valores de propriedade. Para fazer isso, especifique o atributo e o
intervalo para um dos atributos solicitados na consulta.

Recuperação de intervalo com IDirectoryObject


A interface IDirectoryObject pode ser usada para recuperação de intervalo
especificando o atributo e o intervalo para um dos atributos na matriz pAttributesName
ao chamar o método IDirectoryObject::GetObjectAttributes .

C++

PADS_ATTR_INFO pAttrInfo;
DWORD dwRetrieved;
LPWSTR pszAttrs[2];

pszAttrs[0] = L"Name";
pszAttrs[1] = L"member;range=0-100";

hr = pdo->GetObjectAttributes(pszAttrs, 2, &pAttrInfo, &dwRetrieved);

Para obter mais informações e um exemplo de código que mostra como usar a interface
IDirectoryObject para recuperação de intervalo, consulte Código de exemplo para
variação com IDirectoryObject.

Recuperação de intervalo com IDirectorySearch


A interface IDirectorySearch pode ser usada para recuperação de intervalo
especificando o atributo e o intervalo para um dos atributos recuperados na matriz
pAttributesName ao chamar o método IDirectorySearch::ExecuteSearch .

C++

ADS_SEARCH_HANDLE hSearch;
LPWSTR pszAttrs[2];
pszAttrs[0] = L"Name";
pszAttrs[1] = L"member;range=0-100";

hr = pdo->ExecuteSearch(L"(objectClass=user)", pszAttrs, 2, &hSearch);

Ao usar a interface IDirectorySearch para recuperação de intervalo, há um problema


que deve ser resolvido especificamente. Quando o intervalo solicitado exceder o
número de valores restantes, IDirectorySearch::GetColumn retornará
E_ADS_COLUMN_NOT_SET. Para recuperar os valores restantes, é necessário usar o
curinga de intervalo '*'. Por exemplo, se um grupo contiver 150 membros, os valores de
membro 0 a 100 poderão ser recuperados normalmente usando a recuperação de
intervalo. Se o intervalo 101-200 for solicitado, IDirectorySearch::GetColumn retornará
E_ADS_COLUMN_NOT_SET. Esse problema pode ser evitado usando o método
IDirectorySearch::GetNextColumnName . Normalmente, GetNextColumnName
retornará a cadeia de caracteres de consulta original. No entanto, quando o intervalo
solicitado exceder o número de valores restantes, GetNextColumnName retornará uma
versão modificada da cadeia de caracteres de consulta substituindo o valor de intervalo
alto pelo curinga de intervalo '*'. No exemplo acima, a primeira consulta seria executada
com uma cadeia de caracteres de atributo de "member;range=0-100" e
GetNextColumnName retornará "member;range=0-100". Na segunda consulta, a cadeia
de caracteres de atributo seria "member;range=101-200", mas GetNextColumnName
retornará "member;range=101-*". Esse caso pode ser determinado comparando a
cadeia de caracteres de atributo original com o resultado de GetNextColumnName. Se
as cadeias de caracteres forem diferentes, o último bloco de valores deverá ser
solicitado novamente com o curinga do intervalo.

Para obter mais informações e um exemplo de código que mostra como usar a interface
IDirectorySearch para recuperação de intervalo, consulte Código de exemplo para
variação com IDirectorySearch.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Código de exemplo para variação com
IDirectoryObject
Artigo • 03/06/2023

O exemplo de código a seguir usa para recuperar os membros de um grupo usando a


interface IDirectoryObject .

C++

//**************************************************************************
*
//
// EnumGroupWithIDirectoryObject()
//
//**************************************************************************
*

HRESULT EnumGroupWithIDirectoryObject(LPCWSTR pwszGroupDN,


LPCWSTR pwszUsername,
LPCWSTR pwszPassword)
{
if(NULL == pwszGroupDN)
{
return E_POINTER;
}

HRESULT hr;
IDirectoryObject *pdo;

hr = ADsOpenObject( pwszGroupDN,
pwszUsername,
pwszPassword,
ADS_SECURE_AUTHENTICATION,
IID_IDirectoryObject,
(void**)&pdo);

if(SUCCEEDED(hr))
{
PADS_ATTR_INFO pAttrInfo;
const DWORD dwStep = 1000;
DWORD dwLowRange;
DWORD dwHighRange;
DWORD dwRetrieved;
WCHAR wszAttr[MAX_PATH];
LPWSTR rgAttrs[1];

rgAttrs[0] = wszAttr;

dwLowRange = 0;
dwHighRange = dwLowRange + (dwStep - 1);
do
{
swprintf_s(wszAttr, L"member;range=%d-%d", dwLowRange,
dwHighRange);
hr = pdo->GetObjectAttributes(rgAttrs, 1, &pAttrInfo,
&dwRetrieved);
if(SUCCEEDED(hr))
{
DWORD i;

for(i = 0; i < dwRetrieved; i++)


{
DWORD x;

for(x = 0; x < pAttrInfo[i].dwNumValues; x++)


{
wprintf(L"%s\n",
pAttrInfo[i].pADsValues[x].CaseIgnoreString);
}
}

FreeADsMem(pAttrInfo);

dwLowRange = dwHighRange + 1;
dwHighRange = dwLowRange + (dwStep - 1);
}

if(0 == dwRetrieved)
{
break;
}

}while(SUCCEEDED(hr));

pdo->Release();
}

return hr;
}

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Código de exemplo para variação com
IDirectorySearch
Artigo • 03/06/2023

O exemplo de código a seguir usa para recuperar os membros de um grupo usando a


interface IDirectorySearch .

C++

HRESULT EnumGroupWithIDirectorySearch(LPCWSTR pwszGroupDN,


LPCWSTR pwszUsername,
LPCWSTR pwszPassword)
{
if(NULL == pwszGroupDN)
{
return E_POINTER;
}

HRESULT hr;
IDirectorySearch *pSearch;

hr = ADsOpenObject( pwszGroupDN,
pwszUsername,
pwszPassword,
ADS_SECURE_AUTHENTICATION,
IID_IDirectorySearch,
(void**)&pSearch);

if(SUCCEEDED(hr))
{
const DWORD dwStep = 1000;
DWORD dwLowRange;
DWORD dwHighRange;
BOOL fLastQuery;
BOOL fExit;

// Only search for properties of this object.


ADS_SEARCHPREF_INFO rgSearchPrefs[1];
rgSearchPrefs[0].dwSearchPref = ADS_SEARCHPREF_SEARCH_SCOPE;
rgSearchPrefs[0].vValue.dwType = ADSTYPE_INTEGER;
rgSearchPrefs[0].vValue.Integer = ADS_SCOPE_BASE;

// Set the search preference.


hr = pSearch->SetSearchPreference(rgSearchPrefs, 1);
if (FAILED(hr))
{
return hr;
}

dwLowRange = 0;
dwHighRange = dwLowRange + (dwStep - 1);

// Set the search filter.


LPWSTR pszSearch = L"(CN=*)";

fLastQuery = FALSE;
fExit = FALSE;

do
{
WCHAR wszName[] = L"name";
WCHAR wszAttribute[MAX_PATH];
ADS_SEARCH_HANDLE hSearch;

if(fLastQuery)
{
// Perform this query with the "range=<lowRange>-*" range.
swprintf_s(wszAttribute, L"member;range=%d-*", dwLowRange);
}
else
{
// Perform this query with the "range=<lowRange>-
<highRange>" range.
swprintf_s(wszAttribute, L"member;range=%d-%d", dwLowRange,
dwHighRange);
}

OutputDebugStringW(L"Query:");
OutputDebugStringW(wszAttribute);
OutputDebugStringW(L"\n");

LPWSTR rgAttributes[2] = {wszName, wszAttribute};

// Execute the query.


hr = pSearch->ExecuteSearch(pszSearch, rgAttributes, 2,
&hSearch);
if(SUCCEEDED(hr))
{
// Enumerate the rows.
while(SUCCEEDED(hr = pSearch->GetNextRow(hSearch)))
{
if(S_OK == hr)
{
LPWSTR pwszColumnName;
hr = pSearch->GetNextColumnName(hSearch,
&pwszColumnName);
if(SUCCEEDED(hr))
{
/*
If the column name retrieved from the server is
different than the query string, this indicates
that
last range requested was beyond the range of
property values. Perform one last query with the
"range=<lowRange>-*" range.
*/
if(0 != lstrcmpiW(pwszColumnName, wszAttribute))
{
if(fLastQuery)
{
/*
The request failed to retrieve the
attribute in
two of two attempts. This will occur if
the group has
no members. Exit the loop to avoid an
infinite loop
condition.
*/
fExit = TRUE;
}

fLastQuery = TRUE;

FreeADsMem(pwszColumnName);

break;
}
else
{
ADS_SEARCH_COLUMN col;

// Get the column.


hr = pSearch->GetColumn(hSearch,
pwszColumnName, &col);
if(SUCCEEDED(hr))
{
DWORD i;

// Enumerate the retrieved property


values.
for(i = 0; i < col.dwNumValues; i++)
{
wprintf(L"%s\n",
col.pADsValues[i].CaseIgnoreString);
}

// Free the column.


pSearch->FreeColumn(&col);
}

FreeADsMem(pwszColumnName);

if(fLastQuery)
{
/*
The last query was just completed, so
exit the loop.
*/
fExit = TRUE;
break;
}
}
}
}
else if(S_ADS_NOMORE_ROWS == hr)
{
/*
Call ADsGetLastError to verify that the search is
waiting
for a response to a previous query.
*/
DWORD dwError = ERROR_SUCCESS;
WCHAR szError[512];
WCHAR szProvider[512];

ADsGetLastError(&dwError, szError, 512, szProvider,


512);
if(ERROR_MORE_DATA != dwError)
{
break;
}
/*
The search is waiting for a response to a previous
query. Call GetNextRow again.
*/
}
else
{
break;
}

// Close the search handle to cleanup.


pSearch->CloseSearchHandle(hSearch);

// If the last query was performed, exit the loop.


if(!fLastQuery)
{
// Increment the high and low ranges to query for the
next block of objects.
dwLowRange = dwHighRange + 1;
dwHighRange = dwLowRange + (dwStep - 1);
}
}
}while(!fExit);

pSearch->Release();
}

return hr;
}
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Processando um conjunto de resultados
Artigo • 13/06/2023

Um conjunto de resultados é retornado como uma série de linhas. Cada linha pode ou
não conter um determinado atributo. Com o provedor OLE DB, o conjunto de resultados
aparece semelhante a um conjunto de resultados SQL normal. Se você usar o ADO para
a consulta, o ADODB. O objeto Recordset é usado para percorrer o conjunto de
resultados. IDirectorySearch (disponível somente em idiomas que dão suporte a
associações vtable) contém membros para mover o cursor de linha e verificar valores de
propriedade em uma determinada linha. Como alternativa, você pode usar
IDirectoryObject para obter e definir propriedades.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Armazenando o resultado em cache
(lado do cliente)
Artigo • 13/06/2023

O cache do lado do cliente armazena o conjunto de resultados na memória do cliente,


fornecendo aprimoramentos de desempenho para o lado do cliente. Um cliente pode
revisitar um objeto repetidamente sem várias viagens ao servidor. Por padrão, o ADSI
armazena em cache o conjunto de resultados para os clientes. Isso permite que o ADSI
forneça aos clientes suporte a cursores semelhantes a SQL. Você pode iterar por um
determinado conjunto de resultados várias vezes.

O ADSI também permite que os clientes desativem o cache para reduzir os requisitos de
memória. Se o cache do lado do cliente estiver desabilitado, o cliente não manterá o
conjunto de resultados na memória. Cada linha é liberada depois que o aplicativo a
recupera. Desabilitar o cache do lado do cliente pode ser útil para diminuir os requisitos
de memória do lado do cliente em casos como quando você pretende fazer apenas uma
única passagem pelo conjunto de resultados. No entanto, quando os clientes optam por
não armazenar em cache o resultado, eles asistem do suporte ao cursor.

Para obter mais informações sobre o cache de resultados com uma interface de
pesquisa específica, consulte:

Cache de resultados com IDirectorySearch


Pesquisando com objetos de dados ActiveX
Pesquisando com OLE DB

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Classificação (ADSI)
Artigo • 13/06/2023

Um cliente pode solicitar um servidor para classificar o conjunto de resultados. É


possível especificar:

Ordem de classificação: a ordem de classificação crescente ou decrescente pode


ser especificada.
Atributos de classificação: vários atributos podem ser especificados em uma cadeia
de caracteres de classificação. Por exemplo, classifique por Sobrenome e, em
seguida, Nome.

Ao especificar a ordem de classificação, você deve tentar usar um dos atributos


indexados. Caso contrário, o servidor deve calcular um conjunto de resultados completo
antes de enviá-lo ao cliente. Isso é verdadeiro mesmo que você tenha solicitado uma
pesquisa paginada e especificado um tamanho de página.

7 Observação

Nem todos os servidores de diretório dão suporte a várias classificações de


atributo ou ordem de classificação.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Sintaxe de filtro de pesquisa
Artigo • 13/06/2023

Os filtros de pesquisa permitem definir critérios de pesquisa e fornecer pesquisas mais


eficientes e eficazes.

O ADSI dá suporte aos filtros de pesquisa LDAP, conforme definido em RFC2254. Esses
filtros de pesquisa são representados por cadeias de caracteres Unicode. A tabela a
seguir lista alguns exemplos de filtros de pesquisa LDAP.

Filtro de pesquisa Descrição

"(objectClass=*)" Todos os objetos.

"((&objectCategory=person)(objectClass=user)(!( Todos os objetos de usuário, exceto "andy".


cn=andy))".

"(sn=sm*)" Todos os objetos com um sobrenome que


começa com "sm".

"((&objectCategory=person)(objectClass=contact) Todos os contatos com um sobrenome igual


(|( sn=Smith)(sn=Johnson)))" a "Smith" ou "Johnson".

Esses filtros de pesquisa usam um dos seguintes formatos.

C++

<filter>=(<attribute><operator><value>)

ou

C++

(<operator><filter1><filter2>)

Os filtros de pesquisa ADSI são usados de duas maneiras. Eles fazem parte do dialeto
LDAP para enviar consultas por meio do provedor OLE DB. Eles também são usados
com a interface IDirectorySearch .

Operadores
A tabela a seguir lista os operadores de filtro de pesquisa usados com frequência.
Operador lógico Descrição

= Igual a

~= Aproximadamente igual a

<= Lexicograficamente menor ou igual a

>= Lexicograficamente maior ou igual a

& AND

| OU

! NOT

Além dos operadores acima, o LDAP define dois OIDs (identificadores de objeto de
regra) correspondentes que podem ser usados para executar comparações bit a bit de
valores numéricos. As regras de correspondência têm a sintaxe a seguir.

C++

<attribute name>:<matching rule OID>:=<value>

"<attribute name>" é o lDAPDisplayName do atributo, "<rule OID>" é o OID da regra


correspondente e "<value>" é o valor a ser usado para comparação. Lembre-se de que
os espaços não podem ser usados nesta cadeia de caracteres. "<value>" deve ser um
número decimal; não pode ser um número hexadecimal ou um nome constante, como
ADS_GROUP_TYPE_SECURITY_ENABLED. Para obter mais informações sobre os
atributos disponíveis do Active Directory, consulte Todos os atributos.

A tabela a seguir lista os OIDs de regra correspondentes implementados pelo LDAP.

OID da regra de Identificador de cadeia de Descrição


correspondência caracteres (de Ntldap.h)

1.2.840.113556.1.4.803 LDAP_MATCHING_RULE_BIT_AND Uma correspondência será


encontrada somente se todos os
bits do atributo corresponderem
ao valor. Essa regra é equivalente
a um operador AND bit a bit.
OID da regra de Identificador de cadeia de Descrição
correspondência caracteres (de Ntldap.h)

1.2.840.113556.1.4.804 LDAP_MATCHING_RULE_BIT_OR Uma correspondência será


encontrada se algum bit do
atributo corresponder ao valor.
Essa regra é equivalente a um
operador OR bit a bit.

1.2.840.113556.1.4.1941 LDAP_MATCHING_RULE_IN_CHAIN Essa regra é limitada a filtros que


se aplicam ao DN. Este é um
operador especial de
correspondência "estendida" que
orienta a cadeia de
ancestralidade em objetos até a
raiz até encontrar uma
correspondência.

A cadeia de caracteres de consulta de exemplo a seguir pesquisa objetos de grupo que


têm o sinalizador ADS_GROUP_TYPE_SECURITY_ENABLED definido. Lembre-se de que
o valor decimal de ADS_GROUP_TYPE_SECURITY_ENABLED (0x80000000 =
2147483648) é usado para o valor de comparação.

C++

(&(objectCategory=group)(groupType:1.2.840.113556.1.4.803:=2147483648))

O LDAP_MATCHING_RULE_IN_CHAIN é um OID de regra correspondente que foi


projetado para fornecer um método para pesquisar a ancestralidade de um objeto.
Muitos aplicativos que usam o AD e o AD LDS geralmente funcionam com dados
hierárquicos, que são ordenados por relações pai-filho. Anteriormente, os aplicativos
realizavam a expansão transitiva do grupo para descobrir a associação de grupo, que
usava muita largura de banda de rede; aplicativos necessários para fazer várias viagens
de ida e volta para descobrir se um objeto caiu "na cadeia" se um link for percorrido até
o final.

Um exemplo dessa consulta é projetado para marcar se um usuário "user1" for membro
do grupo "group1". Você definiria a base para o DN (cn=user1, cn=users, dc=x) do
usuário e o escopo como base e usaria a consulta a seguir.

C++

(memberof:1.2.840.113556.1.4.1941:=cn=Group1,OU=groupsOU,DC=x)
Da mesma forma, para localizar todos os grupos dos quais "user1" é membro, defina a
base para o DN do contêiner de grupos; por exemplo (OU=groupsOU, dc=x) , e o escopo
para subtree e usam o filtro a seguir.

C++

(member:1.2.840.113556.1.4.1941:=cn=user1,cn=users,DC=x)

Observe que, ao usar LDAP_MATCHING_RULE_IN_CHAIN, o escopo não é limitado,


pode ser base , one-level ou subtree . Algumas dessas consultas em subárvores podem
ser mais intensivas em processadores, como perseguir links com um alto fan-out; ou
seja, listando todos os grupos dos quais um usuário é membro. Pesquisas ineficientes
registrarão as mensagens de log de eventos apropriadas, como com qualquer outro
tipo de consulta.

Curingas
Você também pode adicionar curingas e condições a um filtro de pesquisa LDAP. Os
exemplos a seguir mostram subcadeias de caracteres que podem ser usadas para
pesquisar o diretório.

Obter todas as entradas:

C++

(objectClass=*)

Obtenha entradas que contenham "bob" em algum lugar no nome comum:

C++

(cn=*bob*)

Obter entradas com um nome comum maior ou igual a "bob":

C++

(cn>='bob')

Obtenha todos os usuários com um atributo de email:

C++
(&(objectClass=user)(email=*))

Obtenha todas as entradas de usuário com um atributo de email e um sobrenome igual


a "smith":

C++

(&(sn=smith)(objectClass=user)(email=*))

Obtenha todas as entradas de usuário com um nome comum que comece com "andy",
"steve" ou "margaret":

C++

(&(objectClass=user)(| (cn=andy*)(cn=steve*)(cn=margaret*)))

Obtenha todas as entradas sem um atributo de email:

C++

(!(email=*))

A definição formal do filtro de pesquisa é a seguinte (da RFC 2254 ):

C++

<filter> ::= '(' <filtercomp> ')'


<filtercomp> ::= <and> | <or> | <not> | <item>
<and> ::= '&' <filterlist>
<or> ::= '|' <filterlist>
<not> ::= '!' <filter>
<filterlist> ::= <filter> | <filter> <filterlist>
<item>::= <simple> | <present> | <substring>
<simple> ::= <attr> <filtertype> <value><filtertype> ::= <equal> | <approx>
| <ge> | <le>
<equal> ::= '='
<approx> ::= '~='
<ge> ::= '>='
<le> ::= '<='
<present> ::= <attr> '=*'
<substring> ::= <attr> '=' <initial> <any> <final>
<initial> ::= NULL | <value><any> ::= '*' <starval>
<starval> ::= NULL | <value>'*' <starval>
<final> ::= NULL | <value>
O token <attr> é uma cadeia de caracteres que representa um AttributeType. O valor>
do token <é uma cadeia de caracteres que representa um AttributeValue cujo formato é
definido pelo serviço de diretório subjacente.

Se um <valor> precisar conter o caractere asterisco (*), parêntese esquerdo (() ou


parêntese direito ()), o caractere deverá ser precedido pelo caractere de escape de barra
invertida (\).

Caracteres Especiais
Se qualquer um dos caracteres especiais a seguir precisar aparecer no filtro de pesquisa
como literais, eles deverão ser substituídos pela sequência de escape listada.

Caractere ASCII Substituto de sequência de escape

* \2a

( \28

) \29

\ \5c

NUL \00

/ \2f

7 Observação

Nos casos em que um Conjunto de Caracteres MultiByte está sendo usado, as


sequências de escape listadas acima deverão ser usadas se a pesquisa for
executada pelo ADO com o dialeto SQL.

Além disso, dados binários arbitrários podem ser representados usando a sintaxe de
sequência de escape codificando cada byte de dados binários com a barra invertida (\)
seguida por dois dígitos hexadecimais. Por exemplo, o valor de quatro bytes
0x00000004 é codificado como \00\00\00\04 em uma cadeia de caracteres de filtro.

Tópicos relacionados
Dialeto LDAP

Dialeto SQL

Pesquisando com a interface IDirectorySearch

Pesquisando com objetos de dados ActiveX

Pesquisando com OLE DB

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Dialect
Artigo • 03/06/2023

Duas das interfaces ADSI para pesquisar um diretório, ADO e OLE DB, usam uma cadeia
de caracteres de pesquisa para especificar os parâmetros da pesquisa. Os parâmetros de
pesquisa incluem a base da pesquisa, o filtro de pesquisa, os atributos a serem
recuperados e a profundidade da pesquisa.

Você pode especificar a cadeia de caracteres de pesquisa em um dos dois dialetos:

Dialeto LDAP
Dialeto SQL

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Dialeto SQL
Artigo • 13/06/2023

O dialeto SQL, derivado do linguagem SQL, usa expressões legíveis por humanos para
definir instruções de consulta. Use uma instrução de consulta SQL com as seguintes
interfaces de pesquisa ADSI:

As interfaces do ADO (ActiveX Data Object), que são interfaces de Automação que
usam OLE DB.
OLE DB, que é um conjunto de interfaces C/C++ para consultar bancos de dados.

As instruções SQL exigem a sintaxe a seguir.

SQL

SELECT [ALL] * | select-list FROM 'ADsPath' [WHERE search-condition] [ORDER


BY sort-list]

A tabela a seguir lista as palavras-chave da instrução de consulta SQL.

Palavra- Descrição
chave

SELECT Especifica uma lista separada por vírgulas de atributos a serem recuperados para cada
objeto. Se você especificar *, a consulta recuperará apenas o ADsPath de cada objeto.

FROM Especifica o ADsPath da base da pesquisa. Por exemplo, o ADsPath do contêiner


Usuários em um domínio do Active Directory pode ser
'LDAP://CN=Users,DC=Fabrikam,DC=COM'. Lembre-se de que o caminho está entre
aspas simples (').

WHERE Um palavra-chave opcional que especifica o filtro de consulta.

ORDER Um palavra-chave opcional que gera uma classificação do lado do servidor se o


BY servidor der suporte ao controle de classificação LDAP. O Active Directory dá suporte
ao controle de classificação, mas pode afetar o desempenho do servidor,
especialmente se o conjunto de resultados for grande. A lista de classificação é uma
lista separada por vírgulas de atributos nos quais classificar. Lembre-se de que o
Active Directory dá suporte apenas a uma única chave de classificação. Você pode usar
as palavras-chave opcionais ASC e DESC para especificar a ordem de classificação
crescente ou decrescente; o padrão é crescente. A palavra-chave ORDER BY substitui
qualquer chave de classificação especificada com a propriedade "Sort on" do objeto
Command do ADO.
7 Observação

Nos casos em que um Conjunto de Caracteres MultiByte está sendo usado, se a


pesquisa for executada pelo ADO com o dialeto SQL, uma barra invertida não
poderá ser usada para escapar caracteres. Em vez disso, as sequências de escape
listadas em Caracteres Especiais devem ser usadas. Por exemplo, para uma
instrução que usou a sintaxe "samAccountName=(Test", que usa a barra invertida,
"\", para escapar dos parênteses abertos, "(", em vez disso, você substituiria a barra
invertida pelo caractere especial "\28", da seguinte maneira:
"samAccountName=\28Test".

As instruções de consulta a seguir são exemplos de dialeto SQL no ADSI.

Para pesquisar todos os objetos de grupo.

SQL

SELECT ADsPath, cn FROM 'LDAP://DC=Fabrikam,DC=COM' WHERE


objectCategory='group'

Para pesquisar todos os usuários cujo Sobrenome começa com a letra H.

SQL

SELECT ADsPath, cn FROM 'LDAP://OU=Sales,DC=Fabrikam,DC=COM' WHERE


objectCategory='person' AND objectClass='user' AND sn = 'H*' ORDER BY sn

A gramática formal para consultas SQL é definida no exemplo de código a seguir. Todas
as palavras-chave não diferenciam maiúsculas de minúsculas.

SQL

statement ::= select-statement


select-statement ::= SELECT [ALL] select-list FROM table-identifier [WHERE
search-condition] [ORDER BY sort-list]
select-list ::= * | select-sublist [, select-sublist]...
select-sublist ::= column-identifier
column-identifier ::= user-defined-name
table-identifier ::= string-literal
search-condition ::= boolean-term [OR search-condition]
sort-list ::= column-identifier [ASC | DESC] [,column-identifier [ASC |
DESC]]...
boolean-term ::= boolean-factor [AND boolean-term]
boolean-factor ::= [NOT] boolean-primary
boolean-primary ::= comparison-predicate | (search-condition)
comparison-predicate ::= column-identifier comparison-operator literal
comparison-operator ::= < | > | <= | >= | = | <>
user-defined-name ::= letter [letter | digit]...
literal ::= string-literal | numeric-literal | boolean-literal
string-literal ::= '{character}...' (Any sequence of characters delimited by
quotes)
numeric-literal ::= digits [fraction] [exponent]
digits ::= digit [digit]...
fraction ::= . digits
exponent ::= E digits
boolean-literal ::= TRUE | FALSE | YES | NO | ON | OFF

As junções internas do SQL não são compatíveis com o provedor OLE DB do Active
Directory, mas você pode usar o SQL para ingressar dados do SQL e do Active Directory.
Para obter mais informações, consulte Criando uma junção heterogênea entre SQL
Server e o Active Directory.

Tópicos relacionados
Sintaxe de filtro de pesquisa

Dialeto LDAP

Pesquisando com a interface IDirectorySearch

Pesquisando com objetos de dados ActiveX

Pesquisando com OLE DB

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Dialeto LDAP
Artigo • 13/06/2023

O dialeto LDAP é um formato para instruções de consulta que usam a sintaxe de filtro
de pesquisa LDAP. Use uma instrução de consulta LDAP com as seguintes interfaces de
pesquisa ADSI:

As interfaces do ADO (Objeto de Dados ActiveX), que são interfaces de Automação


que usam o OLE DB.
OLE DB, que é um conjunto de interfaces C/C++ para consultar bancos de dados.
IDirectorySearch, que é a interface C/C++ do Active Directory.

Uma cadeia de caracteres de dialeto LDAP consiste em quatro partes separadas por
ponto e vírgula (;).

Nome diferenciado de base. Por exemplo:

VB

<LDAP://DC=Fabrikam,DC=COM>

Filtros de pesquisa LDAP. Para obter mais informações sobre filtros de pesquisa,
consulte Sintaxe de filtro de pesquisa.

O nome de exibição LDAP dos atributos a serem recuperados. Vários atributos são
separados por uma vírgula.

Especifica o escopo da pesquisa. Os valores válidos são "base", "onelevel" e


"subtree". O escopo especificado em uma cadeia de caracteres de consulta LDAP
substitui qualquer escopo de pesquisa especificado com a propriedade
"SearchScope" do objeto Command do ADO.

Veja a seguir um exemplo de código do dialeto LDAP no ADSI que pesquisa todos os
objetos na subárvore.

VB

"<LDAP://DC=Fabrikam,DC=com>;(objectClass=*);AdsPath, cn;subTree"

Nem todas as opções de pesquisa (tamanho da página de pesquisa, por exemplo)


podem ser expressas no dialeto LDAP, portanto, você deve definir as opções antes que a
execução real da consulta seja iniciada.
Código de exemplo para executar uma consulta
LDAP
O exemplo de código a seguir mostra como usar uma consulta LDAP

VB

Dim con As New Connection, rs As New Recordset


Dim adVariant
Dim i 'Used for counter
Dim j 'Used for counter
Dim Com As New Command
Dim strDomain As String
Dim strPassword As String

' Open a Connection object.


con.Provider = "ADsDSOObject"
con.Properties("ADSI Flag") = 1
con.Properties("User ID") = strDomain + "\" + strUserID
con.Properties("Password") = strPassword

con.Open "Active Directory Provider"

' Create a command object on this connection.


Set Com.ActiveConnection = con

' Set the query string.


Com.CommandText = "<LDAP://MyServer/DC=MyDomain,DC=Fabrikam,DC=com>;
(objectClass=*);ADsPath, objectclass;base"

' Set search preferences.


Com.Properties("Page Size") = 1000
Com.Properties("Timeout") = 30 'seconds

' Execute the query.


Set rs = Com.Execute

' Navigate the record set.


rs.MoveFirst
While Not rs.EOF
For i = 0 To rs.Fields.Count - 1
If rs.Fields(i).Type = adVariant And Not
(IsNull(rs.Fields(i).Value)) Then
Debug.Print rs.Fields(i).Name, " = "
For j = LBound(rs.Fields(i).Value) To UBound(rs.Fields(i).Value)
Debug.Print rs.Fields(i).Value(j), " # "
Next j
Else
Debug.Print rs.Fields(i).Name, " = ", rs.Fields(i).Value
End If
Next i
rs.MoveNext
Wend

rs.MoveLast
Debug.Print "No. of rows = ", rs.RecordCount

Para obter detalhes sobre a sintaxe da consulta, consulte Sintaxe de filtro de pesquisa.

Tópicos relacionados
Sintaxe de filtro de pesquisa

Dialeto SQL

Pesquisando com a interface IDirectorySearch

Pesquisando com objetos de dados ActiveX

Pesquisando com o OLE DB

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interfaces de consulta
Artigo • 13/06/2023

Três tipos de interfaces ADSI podem ser usados para executar pesquisas de diretório. O
ambiente do aplicativo e outros requisitos podem indicar qual interface é usada.

IDirectorySearch. IDirectorySearch é uma interface COM básica disponível apenas


para programadores C/C++. Para obter mais informações, consulte Pesquisando
com a interface IDirectorySearch.
ADO. As interfaces do ADO (ActiveX Data Object) são interfaces de Automação
que usam OLE DB. Use o ADO para consultas em aplicativos que dependem da
Automação. Isso inclui aplicativos do Visual Basic, Active Server Pages e assim por
diante. Para obter mais informações, consulte Pesquisando com objetos de dados
ActiveX.
OLE DB. O OLE DB é um conjunto de interfaces C/C++ usadas para consultar
bancos de dados. Ao dar suporte a essas interfaces, os provedores ADSI podem
implementar recursos avançados do OLE DB, como consultas distribuídas com
outros provedores OLE DB. Para obter mais informações, consulte Pesquisando
com o OLE DB.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Pesquisando com a interface
IDirectorySearch
Artigo • 03/06/2023

A interface IDirectorySearch fornece uma interface de alto nível e baixa sobrecarga para
consultar dados de um diretório ou de um catálogo global. A interface COM
IDirectorySearch só pode ser usada com uma vtable e, portanto, não está disponível
para ambientes de desenvolvimento baseados em Automação.

Para executar uma pesquisa

1. Associar a um objeto no diretório.


2. Chame QueryInterface para obter o ponteiro IDirectorySearch .
3. Execute a pesquisa usando o ponteiro IDirectorySearch . Chame o método
IDirectorySearch::ExecuteSearch e passe um filtro de pesquisa, os nomes de
atributo solicitados e outros parâmetros.

Para obter mais informações sobre a sintaxe do filtro de pesquisa, consulte Sintaxe de
Filtro de Pesquisa.

A execução da consulta é específica do provedor. Com alguns provedores, a execução


da consulta real não ocorre até que IDirectorySearch::GetFirstRow ou
IDirectorySearch::GetNextRow seja chamado. A interface IDirectorySearch funciona
diretamente com filtros de pesquisa. Nem o dialeto SQL nem o dialeto LDAP são
necessários.

A interface IDirectorySearch fornece métodos para enumerar o conjunto de resultados,


linha por linha. O método IDirectorySearch::GetFirstRow recupera a primeira linha e
IDirectorySearch::GetNextRow move você para a próxima linha da linha atual. Quando
você chegou à última linha, chamar esses métodos retorna o código de erro
S_ADS_NOMORE_ROWS. Por outro lado, IDirectorySearch::GetPreviousRow move você
para trás uma linha de cada vez. Um valor retornado S_ADS_NOMORE_ROWS indica que
você atingiu a primeira linha do conjunto de resultados. Esses métodos operam no
conjunto de resultados, residentes na memória, no cliente. Assim, quando pesquisas
paged e assíncronas são executadas e a opção _CACHE_RESULTS é desativada, a
rolagem para trás pode ter consequências inesperadas.

Quando você tiver localizado a linha apropriada, chame IDirectorySearch::GetColumn


para obter itens de dados, coluna por coluna. Para cada chamada, você passa o nome
da coluna de interesse. O item de dados retornado é um ponteiro para uma estrutura
de ADS_SEARCH_COLUMN . GetColumn aloca essa estrutura para você, mas você deve
liberá-la usando o FreeColumn. Chame CloseSearchHandle para concluir a operação de
pesquisa.

Para executar uma pesquisa de diretório

1. Associar a um provedor LDAP. Pode ser um controlador de domínio ou um


provedor de catálogo global.

2. Recuperar a interface COM IDirectorySearch com uma chamada para


QueryInterface; essa operação pode ter sido feita na Etapa 1 durante a associação
inicial.

Opcionalmente, chame SetSearchPreference para selecionar opções para lidar


com os resultados da pesquisa.

3. Chame ExecuteSearch. Dependendo das opções definidas em


SetSearchPreference , isso pode ou não iniciar a execução da consulta.

4. Chame GetNextRow para mover o índice de linha (interno para IDirectorySearch)


para a primeira linha.

5. Leia os dados da linha usando GetColumn e, em seguida, chame FreeColumn para


liberar a memória alocada pelo GetColumn.

6. Repita a Etapa 5 até que todos os dados sejam recuperados do resultado da


pesquisa ou até GetNextRow retornar S_ADS_NOMORE_ROWS.

7. Chame AbandonSearch e CloseSearchHandle quando concluído.

O exemplo de código a seguir mostra esse cenário. Para iniciar a associação ao ADSI,
chame a função ADsOpenObject .

C++

HRESULT hr = S_OK; // COM result variable


ADS_SEARCH_COLUMN col; // COL for iterations
LPWSTR szUsername = NULL; // user name
LPWSTR szPassword = NULL; // password

// Interface Pointers.
IDirectorySearch *pDSSearch =NULL;

// Initialize COM.
CoInitialize(0);

// Add code to securely retrieve the user name and password or


// leave both as NULL to use the default security context.

// Open a connection with server.


hr = ADsOpenObject(L"LDAP://coho.salmon.Fabrikam.com",
szUsername,
szPassword,
ADS_SECURE_AUTHENTICATION,
IID_IDirectorySearch,
(void **)&pDSSearch);

Isso fornece um ponteiro para a interface IDirectorySearch .

Agora que há uma interface COM para uma instância IDirectoryInterface, chame
IDirectorySearch::SetSearchPreference.

Crie uma matriz de nomes de atributo para se preparar para chamar a função
IDirectorySearch::ExecuteSearch . Os nomes de atributo são definidos dentro do
esquema do Active Directory. Para obter mais informações sobre a definição de
esquema, consulte ADSI Schema Model. Os nomes de atributo listados serão
retornados, se houver suporte do objeto, como o conjunto de resultados da pesquisa.

C++

LPWSTR pszAttr[] = { L"description", L"Name", L"distinguishedname" };


ADS_SEARCH_HANDLE hSearch;
DWORD dwCount = 0;
DWORD dwAttrNameSize = sizeof(pszAttr)/sizeof(LPWSTR);

Agora, chame a função ExecuteSearch . A pesquisa não é executada até que você
chame o método GetNextRow .

C++

// Search for all objects with the 'cn' property that start with c.
hr = pDSSearch->ExecuteSearch(L"(cn=c*)",pszAttr ,dwAttrNameSize,&hSearch );

Chame GetNextRow para iterar linhas no resultado. Cada linha é então consultada para
o atributo "description". Se o atributo for encontrado, ele será exibido.

C++

LPWSTR pszColumn;
while( pDSSearch->GetNextRow( hSearch) != S_ADS_NOMORE_ROWS )
{
// Get the property.
hr = pDSSearch->GetColumn( hSearch, L"description", &col );

// If this object supports this attribute, display it.


if ( SUCCEEDED(hr) )
{
if (col.dwADsType == ADSTYPE_CASE_IGNORE_STRING)
wprintf(L"The description property:%s\r\n", col.pADsValues-
>CaseIgnoreString);
pDSSearch->FreeColumn( &col );
}
else
puts("description property NOT available");
puts("------------------------------------------------");
dwCount++;
}
pDSSearch->CloseSearchHandle(hSearch);
pDSSearch->Release();

Para encerrar a pesquisa, chame o método AbandonSearch .

Lembre-se de que, se um tamanho de página não estiver definido, GetNextRow será


bloqueado até que todo o conjunto de resultados seja retornado ao cliente. Se o
tamanho da página estiver definido, o GetNextRow será bloqueado até que a primeira
página (tamanho da página = número de linhas em uma página) seja retornada. Se o
tamanho da página for definido e a consulta for classificada e você não estiver
pesquisando pelo menos um atributo indexado, o valor do tamanho da página será
ignorado e o servidor calculará todo o conjunto de resultados antes de retornar os
dados. Isso tem o efeito do bloqueio GetNextRow até que a consulta seja concluída.

7 Observação

Para alterar essa consulta de uma pesquisa de diretório para uma pesquisa de
catálogo global, a chamada ADsOpenObject é alterada.

C++

// Open a connection with the server.


hr = ADsOpenObject(L"GC://coho.salmon.Fabrikam.com",
szUsername,
szPassword,
ADS_SECURE_AUTHENTICATION,
IID_IDirectorySearch,
(void **)&pDSSearch);
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Especificando outras opções de
pesquisa com IDirectorySearch
Artigo • 12/06/2023

A interface IDirectorySearch fornece controle adicional sobre como a pesquisa é


executada por meio do uso de opções de pesquisa. Essas opções de pesquisa são
definidas preenchendo uma matriz de estruturas de ADS_SEARCHPREF_INFO e
chamando o método IDirectorySearch::SetSearchPreference . Para obter mais
informações, consulte estes tópicos:

Usando o método SetSearchPreference


Pesquisas síncronas e assíncronas com IDirectorySearch
Paginação com IDirectorySearch
Cache de resultados com IDirectorySearch
Executando uma consulta de escopo de atributo
Classificando os resultados da pesquisa com IDirectorySearch
Busca de referência com IDirectorySearch
Limite de tamanho com IDirectorySearch
Limite de tempo do servidor com IDirectorySearch
Limite de tempo do cliente com IDirectorySearch
Retornando apenas nomes de atributo com IDirectorySearch

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Usando o método SetSearchPreference
Artigo • 03/06/2023

Chamar o método IDirectorySearch::SetSearchPreference altera a maneira como os


resultados da pesquisa são obtidos e apresentados por meio da interface
IDirectorySearch .

A documentação do SDK define SetSearchPreference da seguinte maneira:

C++

HRESULT SetSearchPreference(
//Search preferences to be set.
PADS_SEARCHPREF_INFO pSearchPrefs,
//Number of preferences.
DWORD dwNumPrefs
);

Várias preferências podem ser definidas passando uma matriz como o primeiro
parâmetro e o tamanho da matriz como o segundo parâmetro.

C++

ADS_SEARCHPREF_INFO arSearchPrefs[2];

arSearchPrefs[0].dwSearchPref = ADS_SEARCHPREF_PAGESIZE;
arSearchPrefs[0].vValue.dwType = ADSTYPE_INTEGER;
arSearchPrefs[0].vValue.Integer = 100;

arSearchPrefs[1].dwSearchPref = ADS_SEARCHPREF_SEARCH_SCOPE;
arSearchPrefs[1].vValue.dwType = ADSTYPE_INTEGER;
arSearchPrefs[1].vValue.Integer = ADS_SCOPE_SUBTREE;

hr = pDSearch->SetSearchPreference(&arSearchPrefs, 2);

Este exemplo define o tamanho da página como 100 linhas e o escopo para o tipo
ADS_SCOPE_SUBTREE. A configuração de tamanho da página faz com que o servidor
retorne imediatamente os dados ao cliente, depois que 100 linhas forem calculadas. A
configuração ADS_SCOPE_SUBTREE faz com que a pesquisa engloba todos os branches
na árvore abaixo do ponto do qual a pesquisa está sendo executada.
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Pesquisas síncronas e assíncronas com
IDirectorySearch
Artigo • 03/06/2023

Quando você executa uma pesquisa usando a interface IDirectorySearch , o método


IDirectorySearch::ExecuteSearch não envia a solicitação de pesquisa para o servidor.
Esse método salva apenas os parâmetros de pesquisa. A solicitação de pesquisa é
realmente enviada quando você chama IDirectorySearch::GetFirstRow ou
IDirectorySearch::GetNextRow.

Para pesquisas do Active Directory, a principal diferença entre síncrono e assíncrono é


quando a primeira linha do resultado é retornada, ou seja, quando a primeira chamada
GetFirstRow ou GetNextRow retorna.

Em uma pesquisa síncrona, se a paginação não estiver habilitada, a primeira linha será
retornada quando o servidor tiver construído e retornado todo o conjunto de resultados
para o cliente. Se a paginação estiver habilitada, a primeira linha será retornada quando
a primeira página do conjunto de resultados for retornada.

Em uma pesquisa assíncrona, se a paginação não estiver habilitada, a primeira linha será
retornada quando o servidor tiver construído a primeira linha do conjunto de
resultados. Se a paginação estiver habilitada, a primeira linha será retornada quando a
primeira página do conjunto de resultados for retornada.

O tipo de pesquisa padrão é síncrono. Para especificar uma pesquisa assíncrona, defina
uma opção de pesquisa ADS_SEARCHPREF_ASYNCHRONOUS com um valor
ADSTYPE_BOOLEANde TRUE na matriz ADS_SEARCHPREF_INFO passada para o
método IDirectorySearch::SetSearchPreference . Essa operação é mostrada no exemplo
de código a seguir.

C++

ADS_SEARCHPREF_INFO SearchPref;
SearchPref.dwSearchPref = ADS_SEARCHPREF_ASYNCHRONOUS;
SearchPref.vValue.dwType = ADSTYPE_BOOLEAN;
SearchPref.vValue.Boolean = TRUE;
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Paginação com IDirectorySearch
Artigo • 13/06/2023

A paginação especifica quantas linhas o servidor retorna ao cliente. Uma página pode
ser definida pelo número de linhas ou um limite de tempo. O objeto COM ADSI
recupera cada página de resultados com base nos valores listados na tabela a seguir. O
chamador chama IDirectorySearch::GetNextRow quando ele chega ao final da página e
o objeto ADSI COM recupera a próxima página.

Valor Descrição

ADS_SEARCHPREF_PAGESIZE Especifica o número máximo de linhas a serem


retornadas em uma página.

ADS_SEARCHPREF_PAGED_TIME_LIMIT Especifica o tempo máximo, em segundos, que o


servidor deve gastar coletando uma página de
resultados antes de retornar a página para o cliente. Se
o limite for atingido, o servidor interromperá a pesquisa
e retornará as linhas já recuperadas para a página.

Se nenhuma dessas preferências de pesquisa estiver definida, o padrão não será


paginação. As pesquisas do Active Directory executadas sem paginação estão limitadas
a retornar um máximo dos primeiros 1000 registros, portanto, você deve usar uma
pesquisa paginada se houver a possibilidade de que o conjunto de resultados contenha
mais de 1000 itens.

Uma operação de pesquisa pode resultar em um grande número de objetos sendo


retornados. Se o servidor retornar o resultado em um conjunto, ele poderá diminuir o
desempenho do cliente e do servidor, bem como afetar a carga de rede. Pesquisas
paginada podem ser usadas para evitar isso. Em uma pesquisa paginada, o cliente pode
aceitar resultados em pacotes menores. O tamanho de um pacote é conhecido como o
tamanho da página de pesquisa.

Pesquisas paginada oferecem benefícios ao cliente e ao servidor. O cliente pode ser


mais responsivo ao apresentar os resultados aos usuários. Isso é especialmente
relevante para ferramentas gráficas de interface do usuário que podem iniciar o
processo de exibição da janela enquanto o outro thread recebe simultaneamente os
dados.

No lado do servidor, pesquisas paginada tornam a operação escalonável. Por exemplo,


se cem clientes emitirem solicitações de pesquisa simultaneamente e, em média, cada
cliente receber 200 objetos. Se nenhum tamanho de página for especificado, no pior
cenário, o servidor deverá ter memória suficiente para conter 20.000 objetos. Por outro
lado, se cada cliente especificar um tamanho de página para ser, por exemplo, dez
objetos, o requisito de memória no servidor será reduzido por um fator de 20.

Além disso, usando uma pesquisa paginada, um cliente pode abandonar a operação em
andamento. Por outro lado, em uma pesquisa não paginada, o cliente recebe um
conjunto de resultados em um pacote. Isso pode diminuir o desempenho da rede.

O ADSI manipula o tamanho da página do cliente. O cliente não precisa contar o


número de objetos em andamento. O ADSI encapsula a interação do servidor para o
cliente. Da perspectiva do cliente, a pesquisa retorna um conjunto de resultados
completo.

É recomendável que a paginação seja usada.

Para especificar um tamanho máximo de página, defina uma opção de pesquisa


ADS_SEARCHPREF_PAGESIZE com um valor ADSTYPE_INTEGER definido como o
número máximo de linhas por página na matriz ADS_SEARCHPREF_INFO passada para
o método IDirectorySearch::SetSearchPreference .

O exemplo de código a seguir mostra como definir o tamanho máximo da página.

C++

ADS_SEARCHPREF_INFO SearchPref;
SearchPref.dwSearchPref = ADS_SEARCHPREF_PAGESIZE;
SearchPref.vValue.dwType = ADSTYPE_INTEGER;
SearchPref.vValue.Integer = 1000;

Para especificar um tempo de página, defina uma opção de pesquisa


ADS_SEARCHPREF_PAGED_TIME_LIMIT com um valor ADSTYPE_INTEGER definido
como o número máximo de segundos que o servidor deve gastar recuperando uma
página na matriz ADS_SEARCHPREF_INFO passada para o método
IDirectorySearch::SetSearchPreference .

O exemplo de código a seguir mostra como especificar a hora da página.

C++

ADS_SEARCHPREF_INFO SearchPref;
SearchPref.dwSearchPref = ADS_SEARCHPREF_PAGED_TIME_LIMIT;
SearchPref.vValue.dwType = ADSTYPE_INTEGER;
SearchPref.vValue.Integer = 60;
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Cache de resultados com
IDirectorySearch
Artigo • 12/06/2023

A preferência ADS_SEARCHPREF_CACHE_RESULTS armazena em cache o conjunto de


resultados no cliente. O cache de resultados permite que um aplicativo mantenha um
conjunto de resultados recuperado e passe pelas linhas recuperadas novamente. Ele
também habilita o suporte ao cursor em que os métodos
IDirectorySearch::GetNextRow e IDirectorySearch::GetPreviousRow podem ser usados
para mover para cima e para baixo o conjunto de resultados.

Por padrão, o cache de resultados está desabilitado. O cache de resultados deverá ser
habilitado se qualquer um dos seguintes itens for verdadeiro:

Se o mesmo conjunto de resultados precisar ser enumerado várias vezes sem


executar a pesquisa novamente no servidor.
Se a execução da pesquisa for com uso intensivo de recursos no servidor (conexão
lenta, conjunto de resultados grande ou consulta complexa).
Se o suporte ao cursor for necessário.

Desative o cache se o aplicativo precisar reduzir os requisitos de memória para


armazenar em cache um grande conjunto de resultados no cliente.

O cache de resultados aumenta os requisitos de memória no cliente, portanto, o cache


de resultados deve ser desabilitado se isso for uma preocupação.

Para habilitar o cache de resultados, defina uma opção de pesquisa


ADS_SEARCHPREF_CACHE_RESULTS com um valor ADSTYPE_BOOLEANde TRUE na
matriz ADS_SEARCHPREF_INFO passada para o método
IDirectorySearch::SetSearchPreference .

O exemplo de código a seguir mostra como habilitar o cache de resultados.

C++

ADS_SEARCHPREF_INFO SearchPref;
SearchPref.dwSearchPref = ADS_SEARCHPREF_CACHE_RESULTS;
SearchPref.vValue.dwType = ADSTYPE_BOOLEAN;
SearchPref.vValue.Boolean = TRUE;
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Executando uma consulta de escopo de
atributo
Artigo • 12/06/2023

A consulta de escopo do atributo é uma preferência de pesquisa que permite que uma
pesquisa de atributos com valor de nome diferenciado de um objeto seja executada. O
atributo a ser pesquisado pode ser individual ou de vários valores, mas deve ser do tipo
ADS_DN_STRING . Quando a pesquisa for executada, ADSI enumerará os valores de
nome diferenciados do atributo e executará a pesquisa nos objetos representados pelos
nomes diferenciados. Por exemplo, se uma pesquisa com escopo de atributo for
executada do atributo membro de um objeto de grupo, ADSI enumerará os nomes
diferenciados no atributo membro e pesquisará cada um dos membros do grupo para
obter os critérios de pesquisa especificados.

Se uma consulta com escopo de atributo for executada em um atributo que não é do
tipo ADS_DN_STRING, a pesquisa falhará. A consulta no escopo do atributo também
exige que a preferência de ADS_SEARCHPREF_SEARCH_SCOPE seja definida como
ADS_SCOPE_BASE. A preferência ADS_SEARCHPREF_SEARCH_SCOPE será definida
automaticamente como ADS_SCOPE_BASE, mas se a preferência
ADS_SEARCHPREF_SEARCH_SCOPE for definida como qualquer outro valor,
IDirectorySearch::SetSearchPreference falhará com E_ADS_BAD_PARAMETER.

Os resultados de uma consulta de escopo de atributo podem abranger vários servidores


e um servidor pode não retornar todos os dados solicitados para todas as linhas
retornadas. Se isso ocorrer, quando a última linha for recuperada chamando
IDirectorySearch::GetNextRow ou IDirectorySearch::GetFirstRow, ADSI retornará
S_ADS_ERRORSOCCURRED em vez de S_ADS_NOMORE_ROWS.

Para especificar uma consulta de escopo de atributo, defina uma opção de pesquisa
ADS_SEARCHPREF_ATTRIBUTE_QUERY com um valor ADSTYPE_CASE_IGNORE_STRING
definido como lDAPDisplayName do atributo a ser pesquisado na matriz
ADS_SEARCHPREF_INFO passada para o método
IDirectorySearch::SetSearchPreference . Essa operação é mostrada no exemplo de
código a seguir.

C++

ADS_SEARCHPREF_INFO SearchPref;
SearchPref.dwSearchPref = ADS_SEARCHPREF_ATTRIBUTE_QUERY;
SearchPref.vValue.dwType = ADSTYPE_CASE_IGNORE_STRING;
SearchPref.vValue.Boolean = L"member";
O exemplo de código a seguir mostra como usar a opção de pesquisa
ADS_SEARCHPREF_ATTRIBUTE_QUERY .

C++

/***************************************************************************

SearchGroupMembers()

Searches the members of a group that are of type user and prints each
user's cn and distinguishedName values to the console.

Parameters:

pwszGroupDN - Contains the distinguished name of the group whose


members will be searched.

***************************************************************************/

HRESULT SearchGroupMembers(LPCWSTR pwszGroupDN)


{
HRESULT hr;
CComPtr<IDirectorySearch> spSearch;
CComBSTR sbstrADsPath;

// Bind to the group and get the IDirectorySearch interface.


sbstrADsPath = "LDAP://";
sbstrADsPath += pwszGroupDN;
hr = ADsOpenObject(sbstrADsPath,
NULL,
NULL,
ADS_SECURE_AUTHENTICATION,
IID_IDirectorySearch,
(void**)&spSearch);
if(FAILED(hr))
{
return hr;
}

ADS_SEARCHPREF_INFO SearchPrefs[1];

// Set the ADS_SEARCHPREF_ATTRIBUTE_QUERY search preference.


SearchPrefs[0].dwSearchPref = ADS_SEARCHPREF_ATTRIBUTE_QUERY;
SearchPrefs[0].vValue.dwType = ADSTYPE_CASE_IGNORE_STRING;
SearchPrefs[0].vValue.CaseIgnoreString = L"member";

// Set the search preferences.


hr = spSearch->SetSearchPreference(SearchPrefs,
sizeof(SearchPrefs)/sizeof(ADS_SEARCHPREF_INFO));
if(FAILED(hr))
{
return hr;
}
ADS_SEARCH_HANDLE hSearch;

// Create the search filter.


LPWSTR pwszSearchFilter = L"(&(objectClass=user))";

// Set attributes to return.


LPWSTR rgpwszAttributes[] = {L"cn", L"distinguishedName"};
DWORD dwNumAttributes = sizeof(rgpwszAttributes)/sizeof(LPWSTR);

// Execute the search.


hr = spSearch->ExecuteSearch(pwszSearchFilter,
rgpwszAttributes,
dwNumAttributes,
&hSearch);
if(FAILED(hr))
{
return hr;
}

// Get the first result row.


hr = spSearch->GetFirstRow(hSearch);
while(S_OK == hr)
{
ADS_SEARCH_COLUMN col;

// Enumerate the retrieved attributes.


for(DWORD i = 0; i < dwNumAttributes; i++)
{
hr = spSearch->GetColumn(hSearch, rgpwszAttributes[i], &col);
if(SUCCEEDED(hr))
{
switch(col.dwADsType)
{
case ADSTYPE_DN_STRING:
wprintf(L"%s: %s\n\n", rgpwszAttributes[i],
col.pADsValues[0].DNString);
break;

case ADSTYPE_CASE_IGNORE_STRING:
wprintf(L"%s: %s\n\n", rgpwszAttributes[i],
col.pADsValues[0].CaseExactString);
break;

default:
break;
}

// Free the column.


spSearch->FreeColumn(&col);
}
}

// Get the next row.


hr = spSearch->GetNextRow(hSearch);
}
// Close the search handle to cleanup.
hr = spSearch->CloseSearchHandle(hSearch);

return hr;
}

Quando essa pesquisa é executada e os resultados são enumerados, ela retorna o


nome, o número de telefone e o número do escritório de todos os objetos de usuário
contidos na lista de atributos de membro do grupo.

Tratamento de erros: os resultados de uma consulta de escopo de atributo podem


abranger vários servidores e um servidor pode não retornar todos os dados solicitados
para todas as linhas retornadas. Se isso ocorrer, quando a última linha for recuperada
chamando GetNextRow ou GetFirstRow, ADSI retornará S_ADS_ERRORSOCCURRED,
em vez de S_ADS_NOMORE_ROWS.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Classificando os resultados da pesquisa
com IDirectorySearch
Artigo • 13/06/2023

Por padrão, os resultados de uma pesquisa são retornados sem ordem garantida. A
preferência de ADS_SEARCHPREF_SORT_ON instrui o servidor a classificar o conjunto
de resultados em um valor de atributo especificado antes de ser retornado ao cliente.

É recomendável que os atributos indexados sejam usados para classificação. Caso


contrário, o servidor deverá recuperar o conjunto de resultados completo e classificá-lo
antes de enviar os resultados para o cliente. Isso também se aplica a pesquisas
paginada. Lembre-se de que o desempenho de uma pesquisa classificada será
aumentado se o filtro incluir um atributo indexado e esse atributo for especificado
como a chave de classificação; nesse caso, o Active Directory pode satisfazer a
classificação durante o processamento do filtro. Por exemplo, uma consulta de
classificação eficiente para um conjunto de usuários pode ter um filtro que inclua
(sn>smith) e uma chave de classificação de sn.

A classificação do lado do servidor com a opção de pesquisa


ADS_SEARCHPREF_SORT_ON reduzirá o desempenho do servidor. Se você estiver
executando muitas pesquisas, considere classificar os resultados manualmente no lado
do cliente para reduzir a carga de trabalho no servidor.

Por padrão, a classificação de resultados está desabilitada. Para habilitar a classificação


de resultados, defina uma opção de pesquisa ADS_SEARCHPREF_SORT_ON com uma
ADSTYPE_PROV_SPECIFIC que aponta para uma estrutura ADS_SORTKEY na matriz
ADS_SEARCHPREF_INFO passada para o método
IDirectorySearch::SetSearchPreference . A estrutura ADS_SORTKEY é usada para
especificar o atributo no qual classificar e a ordem da classificação.

O exemplo de código a seguir mostra como habilitar a classificação de resultados.

C++

ADS_SORTKEY SortKey;
SortKey.pszAttrType = L"cn";
SortKey.pszReserved = NULL;
SortKey.fReverseorder = FALSE;

ADS_SEARCHPREF_INFO SearchPref;
SearchPref.dwSearchPref = ADS_SEARCHPREF_SORT_ON;
SearchPref.vValue.dwType = ADSTYPE_PROV_SPECIFIC;
SearchPref.vValue.ProviderSpecific.dwLength = sizeof(SortKey);
SearchPref.vValue.ProviderSpecific.lpValue = (LPBYTE)&SortKey;

O Active Directory não dá suporte à classificação em atributos construídos, portanto,


não é possível especificar um atributo construído para classificação. O atributo
distinguishedName também não pode ser usado para classificação. O Active Directory
também não permite a classificação em mais de um atributo, portanto, a opção de
pesquisa ADS_SEARCHPREF_SORT_ON pode conter apenas uma estrutura
ADS_SORTKEY .

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Busca de referência com
IDirectorySearch
Artigo • 13/06/2023

Uma indicação é o mecanismo que um servidor de diretório usa para direcionar um


cliente para outro servidor quando ele não contém dados suficientes sobre o objeto
solicitado por uma consulta.

Em uma pesquisa de um nível ou subárvore, as indicações são retornadas apenas para


contêineres de domínio, esquema ou configuração conhecidos e subordinados
imediatamente; ou seja, domínios filho que são descendentes diretos. Para obter mais
informações, consulte Escopo da pesquisa.

Em um diretório, nem todos os dados estão disponíveis em um único servidor, em vez


disso, eles são distribuídos em vários servidores diferentes em toda a rede. Se os
servidores compartilharem os dados que outros servidores podem fornecer, eles
poderão fornecer indicações a um cliente quando uma consulta solicitada não puder ser
resolvida no servidor de origem. Por exemplo, quando um cliente solicita ao Servidor A
para consultar um objeto de usuário (U), A pode sugerir que o cliente continue a
pesquisa no Servidor B se U não residir em A, mas for identificado como sendo no B. O
cliente tem a opção de prosseguir com a indicação ou não. As indicações liberam o
cliente de ter que ter conhecimento anterior da capacidade de cada servidor, mas o
cliente deve especificar o tipo de indicações que um servidor deve executar.

Para habilitar ou desabilitar a perseguição de indicação, defina uma opção de pesquisa


ADS_SEARCHPREF_CHASE_REFERRALS com um valor ADSTYPE_INTEGER que contém
um dos valores de enumeração ADS_CHASE_REFERRALS_ENUM na matriz
ADS_SEARCHPREF_INFO passada para o método
IDirectorySearch::SetSearchPreference .

O exemplo de código a seguir mostra como habilitar indicações de perseguição.

C++

ADS_SEARCHPREF_INFO SearchPref;
SearchPref.dwSearchPref = ADS_SEARCHPREF_CHASE_REFERRALS;
SearchPref.vValue.dwType = ADSTYPE_INTEGER;
SearchPref.vValue.Integer = ADS_CHASE_REFERRALS_ALWAYS;

Para obter mais informações sobre indicações no Active Directory, consulte Indicações.
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Limite de tamanho com
IDirectorySearch
Artigo • 12/06/2023

Para reduzir o requisito de memória ou para outras finalidades, o cliente pode se


concentrar em um pequeno número de objetos retornados do servidor e ignorar o
restante do conjunto de resultados que não são de interesse. Para fazer isso, o cliente
especifica o limite de tamanho da pesquisa e outros critérios de pesquisa apropriados.
Por exemplo, se o diretório armazenar as pontuações de teste de um distrito escolar,
você poderá consultar os dez melhores alunos com as notas de teste mais altas
especificando um limite de tamanho de dez (10) e uma ordem de classificação
decrescente.

O padrão para o limite de tamanho não é limite. Para definir um limite de tamanho,
defina uma opção de pesquisa ADS_SEARCHPREF_SIZE_LIMIT com um valor
ADSTYPE_INTEGER que contém o tamanho máximo na matriz ADS_SEARCHPREF_INFO
passada para o método IDirectorySearch::SetSearchPreference .

O exemplo de código a seguir mostra como definir o limite de tamanho. Um valor de


limite de tamanho igual a zero indica nenhum limite de tamanho.

C++

ADS_SEARCHPREF_INFO SearchPref;
SearchPref.dwSearchPref = ADS_SEARCHPREF_SIZE_LIMIT;
SearchPref.vValue.dwType = ADSTYPE_INTEGER;
SearchPref.vValue.Integer = 1000;

Para o Active Directory, o limite de tamanho especifica o número máximo de objetos a


serem retornados pela pesquisa. Também para o Active Directory, o número máximo de
objetos retornados por uma pesquisa é de 1000 objetos.

Comentários
Esta página foi útil? ツ Yes ト No
Obter ajuda no Microsoft Q&A
Limite de tempo do servidor com
IDirectorySearch
Artigo • 03/06/2023

Ao solicitar uma pesquisa em um servidor ocupado, convém solicitar que o servidor


restrinja a pesquisa a um limite de tempo especificado. Por exemplo, você deseja
executar um aplicativo para gerar um relatório semanal em um servidor que está em
execução perto de sua capacidade. Para evitar o uso de todo o tempo de CPU e impedir
a execução de outras operações, especifique o limite de tempo de pesquisa para um
valor pequeno e execute novamente o aplicativo mais tarde se ele não conseguir gerar
o relatório.

Alguns servidores podem impor seu próprio limite de tempo administrativo. Nesses
casos, se você especificar um valor de limite de tempo de pesquisa maior que o limite
de tempo administrativo, o servidor ignorará sua especificação e usará seu valor de
limite de tempo interno.

O padrão para o limite de tempo do servidor não é limite. Para definir um limite de
tempo do servidor, defina uma opção de pesquisa ADS_SEARCHPREF_TIME_LIMIT com
um valor ADSTYPE_INTEGER que contém o limite de tempo do servidor, em segundos,
na matriz ADS_SEARCHPREF_INFO passada para o método
IDirectorySearch::SetSearchPreference . Essa operação é mostrada no exemplo de
código a seguir. Um limite de tempo de servidor de zero indica nenhum limite de
tempo.

C++

ADS_SEARCHPREF_INFO SearchPref;
SearchPref.dwSearchPref = ADS_SEARCHPREF_TIME_LIMIT;
SearchPref.vValue.dwType = ADSTYPE_INTEGER;
SearchPref.vValue.Integer = 10;

Comentários
Esta página foi útil? ツ Yes ト No
Obter ajuda no Microsoft Q&A
Limite de tempo do cliente com
IDirectorySearch
Artigo • 13/06/2023

Um cliente pode impor um limite de tempo para um servidor retornar o conjunto de


resultados. Quando o servidor não responde a uma consulta dentro do período de
tempo especificado, o cliente pode abandonar a pesquisa e tentar novamente mais
tarde.

A preferência de limite de tempo do cliente é útil quando um cliente solicita uma


pesquisa assíncrona. Em uma pesquisa assíncrona, o cliente faz uma solicitação e, em
seguida, prossegue com outras tarefas enquanto aguarda o servidor retornar os
resultados. É possível que o servidor possa ficar offline sem notificar o cliente. Nesse
caso, o cliente não terá notificação de se o servidor ainda está processando a consulta
ou se não está mais ativo. A preferência de limite de tempo do cliente dá ao cliente
algum controle de situações como essa.

O padrão para o limite de tempo do cliente não é limite. Para definir um limite de
tempo do cliente, defina uma opção de pesquisa ADS_SEARCHPREF_TIMEOUT com um
valor ADSTYPE_INTEGER que contém o limite de tempo do cliente, em segundos, na
matriz ADS_SEARCHPREF_INFO passada para o método
IDirectorySearch::SetSearchPreference . Um limite de tempo do cliente de zero indica
que não há limite de tempo.

O exemplo de código a seguir mostra como definir o limite de tempo do cliente.

C++

ADS_SEARCHPREF_INFO SearchPref;
SearchPref.dwSearchPref = ADS_SEARCHPREF_TIMEOUT;
SearchPref.vValue.dwType = ADSTYPE_INTEGER;
SearchPref.vValue.Integer = 10;

Comentários
Esta página foi útil? ツ Yes ト No
Obter ajuda no Microsoft Q&A
Retornando apenas nomes de atributo
com IDirectorySearch
Artigo • 13/06/2023

Você pode executar uma pesquisa para determinar que tipo de dados está disponível
para um objeto específico. Nesse caso, você só está interessado nos nomes dos
atributos, não nos valores de atributo do objeto. A opção
ADS_SEARCHPREF_ATTRIBTYPES_ONLY faz com que o servidor retorne apenas os
nomes de atributo e não os valores de atributo. No entanto, o conjunto de resultados
inclui apenas os atributos que têm valores atribuídos. Por exemplo, considere um objeto
com os seguintes atributos:

syntax

name = Jeff
sn = Smith
department = Empty
phone = 206-555-0111

Quando a opção ADS_SEARCHPREF_ATTRIBTYPES_ONLY é definida, o conjunto de


resultados inclui:

syntax

name
sn
department
phone

O padrão é que os valores de atributo e os nomes sejam retornados.

Para recuperar apenas nomes de atributo, defina uma opção de pesquisa


ADS_SEARCHPREF_ATTRIBTYPES_ONLY com um valor ADSTYPE_BOOLEANde TRUE na
matriz ADS_SEARCHPREF_INFO passada para o método
IDirectorySearch::SetSearchPreference .

O exemplo de código a seguir mostra como recuperar apenas nomes de atributo.

C++

ADS_SEARCHPREF_INFO SearchPref;
SearchPref.dwSearchPref = ADS_SEARCHPREF_ATTRIBTYPES_ONLY;
SearchPref.vValue.dwType = ADSTYPE_BOOLEAN;
SearchPref.vValue.Boolean = TRUE;

Para obter mais informações e um exemplo de código que mostra como usar a opção
de pesquisa ADS_SEARCHPREF_ATTRIBTYPES_ONLY , consulte Código de exemplo para
pesquisar atributos.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Código de exemplo para pesquisar
atributos
Artigo • 13/06/2023

O exemplo de código a seguir mostra como usar a preferência de pesquisa


ADS_SEARCHPREF_ATTRIBTYPES_ONLY para recuperar apenas os nomes de atributos
aos quais os valores foram atribuídos. O exemplo inicializa uma estrutura
ADS_SEARCHPREF_INFO e define a preferência de pesquisa chamando o método
SetSearchPreference da interface IDirectorySearch . Em seguida, o exemplo chama o
método ExecuteSearch para executar a pesquisa.

C++

// Setting the search preference.


// m_pSearch is a valid pointer to an IDirectorySearch interface.
ADS_SEARCHPREF_INFO prefInfo[1];
LPWSTR pszColumn = NULL;

// Set the search preference to indicate attribute names only.


prefInfo[0].dwSearchPref = ADS_SEARCHPREF_ATTRIBTYPES_ONLY;
prefInfo[0].vValue.dwType = ADSTYPE_BOOLEAN;
prefInfo[0].vValue.Integer = TRUE;
hr = m_pSearch->SetSearchPreference(prefInfo, 1);

// Execute the search.


hr = m_pSearch->ExecuteSearch(
L"(|(objectCategory=domainDNS)
(objectCategory=organizationalUnit))",
NULL, -1, &hSearch );

if(FAILED(hr))
{
return;
}

// Retrieve the column name.


hr = m_pSearch->GetNextRow(hSearch);

if(FAILED(hr))
{
return;
}

while( m_pSearch->GetNextColumnName( hSearch, &pszColumn ) !=


S_ADS_NOMORE_COLUMNS )
{
wprintf(L"%S ", pszColumn );
FreeADsMem( pszColumn );
}
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Como pesquisar usando o VLV
Artigo • 13/06/2023

O Active Directory dá suporte a pesquisas de VLV (exibição de lista virtual). Esse estilo de
pesquisa foi projetado especificamente para grandes conjuntos de resultados e permite
que um aplicativo exiba um subconjunto de milhares de entradas sem realmente
precisar recuperar todas as entradas.

Há duas maneiras distintas de usar uma pesquisa VLV. A primeira é recuperar os


atributos para entradas específicas com base em um deslocamento numérico. Esse
método é útil ao recuperar os resultados da pesquisa em resposta a uma operação de
rolagem.

A segunda maneira de usar pesquisas VLV é pesquisar parte ou todo um atributo textual
e exibir apenas os resultados da pesquisa. Um exemplo de uso disso é um catálogo de
endereços. Se o usuário digitar um "s", o aplicativo poderá usar uma pesquisa VLV para
pesquisar entradas que tenham um nome comum que comece com "s". Se o usuário
adicionar um "m" aos "s", o aplicativo poderá usar outra pesquisa VLV para pesquisar
entradas que tenham um nome comum que comece com "sm".

Para executar uma pesquisa VLV, instrua ADSI a usar o controle VLV. Para fazer isso,
chame o método IDirectorySearch::SetSearchPreference com uma opção de pesquisa
ADS_SEARCHPREF_VLV com um valor ADSTYPE_PROV_SPECIFIC . O valor
ADSTYPE_PROV_SPECIFIC é um ponteiro para uma estrutura ADS_VLV que contém
dados sobre a pesquisa. A função de exemplo GetVLVItemCount mostra como definir
ambas as preferências de pesquisa.

Todas as pesquisas VLV devem usar a classificação de resultados do lado do servidor,


que é executada definindo a preferência de pesquisa ADS_SEARCHPREF_SORT_ON .
Para obter mais informações sobre o ADS_SEARCHPREF_SORT_ON preferência de
pesquisa, consulte Classificando os resultados da pesquisa com IDirectorySearch.

Quando uma pesquisa VLV é executada, uma determinada quantidade de metadados


sobre a pesquisa é retornada em uma coluna que é recuperada chamando
IDirectorySearch::GetColumn com o identificador ADS_VLV_RESPONSE . Esses dados
estão contidos em uma estrutura ADS_VLV . De particular importância são os membros
dwContentCount e lpContextID . O membro dwContentCount conterá o número de
resultados que atendem aos critérios de pesquisa do VLV. Esse valor pode ser usado
como uma estimativa do número total de itens que seriam retornados para uma
pesquisa desse tipo. O membro lpContextID contém um valor definido pelo servidor
que pode ser passado para a próxima pesquisa para identificar a pesquisa. O uso do
lpContextID pode aprimorar o desempenho da pesquisa. Lembre-se de que
lpContextID é um valor definido pelo servidor e seu comprimento está contido no
membro dwContextIDLength . Esse buffer é liberado quando o método
IDirectorySearch::FreeColumn é chamado, portanto, o chamador deve alocar um buffer
do tamanho apropriado e copiar e salvar o conteúdo do buffer entre pesquisas.

Para obter mais informações sobre o controle VLV LDAP, consulte Pesquisando com o
controle VLV LDAP.

Para obter mais informações, consulte:

Obtendo o número de itens


Pesquisando por deslocamento
Pesquisando por cadeia de caracteres
Código de exemplo para usar uma pesquisa VLV

Obtendo o número de itens


Para obter uma estimativa do número de itens que serão retornados para uma
pesquisa específica, execute as etapas a seguir.

1. Preencha uma estrutura ADS_VLV com todos os valores zero ou NULL .

2. Preencha um ADS_SEARCHPREF_INFO com os valores a seguir.

Defina o membro dwSearchPref como ADS_SEARCHPREF_VLV.


Defina o membro vValue.dwType como ADSTYPE_PROV_SPECIFIC.
Defina o membro vValue.ProviderSpecific.dwLength para o tamanho da
estrutura ADS_VLV .
Defina o membro vValue.ProviderSpecific.lpValue como o endereço da
estrutura ADS_VLV da Etapa 1.

3. Preencha uma estrutura ADS_SORTKEY conforme mostrado em Classificando os


resultados da pesquisa com IDirectorySearch para classificar o atributo desejado.

4. Preencha outra ADS_SEARCHPREF_INFO para adicionar a estrutura ADS_SORTKEY


às preferências de pesquisa, conforme mostrado em Classificando os resultados da
pesquisa com IDirectorySearch.

5. Adicione quaisquer outras preferências de pesquisa desejadas e chame


IDirectorySearch::SetSearchPreference para definir as preferências de pesquisa.

6. Execute a pesquisa com IDirectorySearch::ExecuteSearch.


7. Obtenha a primeira linha de resultados chamando IDirectorySearch::GetFirstRow.

8. Chame IDirectorySearch::GetColumn com ADS_VLV_RESPONSE para obter os


metadados de pesquisa do VLV.

9. Converta o pADsValues-ProviderSpecific.lpValue> da estrutura


ADS_SEARCH_COLUMN em um ponteiro de estrutura ADS_VLV. O membro
dwContentCount dessa estrutura ADS_VLV contém o número aproximado de itens
que seriam retornados por uma pesquisa desse tipo.

10. Se outras pesquisas VLV do mesmo tipo forem executadas, faça uma cópia dos
dados lpContextID e preserve-os para a próxima pesquisa VLV.

A função de exemplo GetVLVItemCount mostra como fazer isso.

Pesquisando por deslocamento


Uma coisa que torna as pesquisas VLV tão rápidas é que é possível pesquisar um
resultado específico por um deslocamento numérico. Por exemplo, se uma pesquisa
resultar em 10.000 itens sendo retornados, uma pesquisa VLV possibilita obter as
informações para aproximadamente o 4072º item sem precisar recuperar todos os itens
antes do item em questão.

Os deslocamentos são especificados como uma taxa entre o deslocamento e a


contagem de conteúdo. As taxas são úteis porque o servidor pode não ter uma
estimativa precisa do número de entradas que existem na lista ou o tamanho da lista
pode estar mudando durante o tempo em que o usuário está navegando. Como você
deve indicar o início e o fim da lista, você pode usar um valor estimado para a contagem
de conteúdo na primeira solicitação de pesquisa, juntamente com um valor de
deslocamento. O servidor usa esses dados para calcular os deslocamentos
correspondentes na lista, com base em sua ideia de contagem de conteúdo, que é
enviada em sua resposta ao cliente por meio do membro dwContentCount da estrutura
ADS_VLV . Por exemplo, se você estimar o tamanho da lista como 3000 e quiser que o
deslocamento seja a entrada de lista 1500, você definirá dwContentCount como 3000 e
dwOffset como 1500. Se o servidor estimar o tamanho real da lista como 4500, ele
recalculará o deslocamento para 2250 e retornará as novas estimativas em
dwContentCount e dwOffset.

7 Observação

Todos os valores numéricos em uma pesquisa VLV são aproximações e não devem
ser usados para valores absolutos. Por exemplo, se você emitir uma pesquisa VLV
para o 50º item em uma ração de 100, não há garantia de obter o item do meio
exato.

Para pesquisar um item específico por deslocamento, execute as etapas a seguir.

1. Preencha uma estrutura ADS_VLV com os valores a seguir. Membros


adicionais da estrutura devem ser definidos como zero ou NULL.

Defina o membro dwContentCount como o valor máximo da taxa de


itens a serem recuperados.
Defina o membro dwOffset como a taxa, em relação a
dwContentCount, do item ou dos itens a serem recuperados.
Defina o membro lpContextID como o endereço da cópia do buffer de
ID de contexto e dwContextIDLength para o comprimento, em bytes, do
buffer de ID de contexto. Se nenhuma ID de contexto tiver sido salva,
ambos os membros deverão ser zero ou NULL.

2. Defina as preferências de pesquisa conforme mostrado nas Etapas 2 a 5 do


procedimento Obtendo o número de itens.

3. Execute a pesquisa com IDirectorySearch::ExecuteSearch.

4. Obtenha a primeira linha de resultados chamando


IDirectorySearch::GetFirstRow.

5. Chame IDirectorySearch::GetColumn com o nome do atributo a ser


recuperado para obter os dados reais do item solicitado.

6. Chame IDirectorySearch::GetColumn com ADS_VLV_RESPONSE para obter os


metadados de pesquisa do VLV.

7. Converta o pADsValues-ProviderSpecific.lpValue> da estrutura


ADS_SEARCH_COLUMN em um ponteiro de estrutura ADS_VLV.

8. Faça uma cópia dos dados lpContextID e preserve-os para a próxima


pesquisa VLV.

A função de exemplo GetVLVItemText mostra como fazer isso.


Também é possível recuperar mais de uma linha de dados com uma única chamada de
pesquisa. Isso é feito na Etapa 1 definindo os membros dwBeforeCount e
dwAfterCount da estrutura ADS_VLV adequadamente. O membro dwBeforeCount
contém o número de itens que aparecem na lista antes do item em questão e o
membro dwAfterCount contém o número de itens que aparecem na lista após o item
em questão. Ambas as contagens excluem o item em si, portanto, definir
dwBeforeCount como 10 e dwAfterCount como 10 resultará em um total de 21 itens
retornados. Essa opção permite armazenar em cache os resultados da pesquisa no lado
do cliente.

Pesquisando por cadeia de caracteres


Também é possível usar uma pesquisa VLV para localizar itens que têm um atributo de
cadeia de caracteres cujo valor corresponde a toda ou parte de uma cadeia de
caracteres sem precisar recuperar todos os itens. A correspondência de cadeia de
caracteres é executada em relação ao atributo especificado na estrutura ADS_SORTKEY
da preferência de pesquisa ADS_SEARCHPREF_SORT_ON .

Para pesquisar um item específico por cadeia de caracteres, execute as etapas a


seguir.

1. Preencha uma estrutura ADS_VLV com os valores a seguir. Membros adicionais da


estrutura devem ser definidos como zero ou NULL.

Defina o membro pszTarget como um ponteiro para uma cadeia de


caracteres terminada em NULL que contém a cadeia de caracteres a ser
pesquisada.
Defina o membro lpContextID como o endereço da cópia do buffer de ID de
contexto e dwContextIDLength para o comprimento, em bytes, do buffer de
ID de contexto. Se nenhuma ID de contexto tiver sido salva, ambos os
membros deverão ser zero ou NULL.

2. Defina as preferências de pesquisa conforme mostrado nas Etapas 2 a 5 do


procedimento Obtendo o número de itens.

3. Execute a pesquisa com IDirectorySearch::ExecuteSearch.

4. Obtenha a primeira linha de resultados chamando IDirectorySearch::GetFirstRow.

5. Chame IDirectorySearch::GetColumn com o nome do atributo a ser recuperado


para obter os dados reais do item solicitado.
6. Chame IDirectorySearch::GetColumn com ADS_VLV_RESPONSE para obter os
metadados de pesquisa do VLV.

7. Converta o pADsValues-ProviderSpecific.lpValue> da estrutura


ADS_SEARCH_COLUMN em um ponteiro de estrutura ADS_VLV.

8. Faça uma cópia dos dados lpContextID e preserve-os para a próxima pesquisa
VLV. Se necessário, o membro dwOffset contém o índice baseado em um do
primeiro item cujo atributo de cadeia de caracteres começa com o valor
especificado em pszTarget.

A função de exemplo GetVLVItemsByString mostra como fazer isso.

Da mesma forma que a pesquisa por índice, também é possível recuperar mais de uma
linha de dados com uma única chamada de pesquisa. Isso é feito da mesma maneira
definindo os membros dwBeforeCount e dwAfterCount da estrutura ADS_VLV
adequadamente.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Código de exemplo para usar uma
pesquisa VLV
Artigo • 12/06/2023

Os exemplos de código a seguir usam pesquisas VLV para obter resultados da pesquisa.

GetVLVItemCount
GetVLVItemText
GetVLVItemsByString

Funções de utilitário
Os exemplos de código a seguir são usados pelas funções de exemplo neste tópico.

C++

/***************************************************************************

CopyContextID()

***************************************************************************/

BOOL CopyContextID(LPBYTE pContextID,


DWORD dwContextIDLength,
LPBYTE* ppContextIDOut)
{

/*
Ensure that the context ID buffer is large enough and copy the context
ID
into it. Reallocation of the buffer is not required if the same size is
required.
*/
if(*ppContextIDOut && (LocalSize(*ppContextIDOut) != dwContextIDLength))
{
FreeContextID(ppContextIDOut);
*ppContextIDOut = NULL;
}

// If the buffer does not exist, allocate it.


if(!*ppContextIDOut)
{
*ppContextIDOut = (LPBYTE)LocalAlloc(LPTR, dwContextIDLength);
}

// Copy the memory.


if(*ppContextIDOut)
{
CopyMemory(*ppContextIDOut, pContextID, dwContextIDLength);
}

return (NULL != *ppContextIDOut);


}

/***************************************************************************

FreeContextID()

***************************************************************************/

void FreeContextID(LPBYTE* ppContextID)


{
LocalFree(*ppContextID);
*ppContextID = NULL;
}

/**************************************************************************

WideCharToLocal()

**************************************************************************/

int WideCharToLocal(LPTSTR pLocal, LPCWSTR pWide, DWORD dwChars)


{
if(!pLocal || !pWide)
{
return 0;
}

*pLocal = 0;

#ifdef UNICODE
wcsncpy_s(pLocal, pWide, dwChars);
#else
WideCharToMultiByte( CP_ACP,
0,
pWide,
-1,
pLocal,
dwChars,
NULL,
NULL);
#endif

return lstrlen(pLocal);
}

Função de exemplo GetVLVItemCount


O exemplo de código a seguir mostra como usar uma pesquisa VLV para obter uma
estimativa do número de itens resultantes da pesquisa.

C++

/***************************************************************************

GetVLVItemCount()

***************************************************************************/

HRESULT GetVLVItemCount(IDirectorySearch *pSearch,


LPCWSTR pwszSearchFilter,
LPCWSTR pwszAttribute,
DWORD *pdwCount,
LPBYTE* ppContextID)
{
HRESULT hr;

if(!pSearch || !pdwCount)
{
return E_INVALIDARG;
}

*pdwCount = 0;

// Initialize the ADS_VLV structure.


ADS_VLV vlvPref;
ZeroMemory(&vlvPref, sizeof(vlvPref));

// Using these values will retrieve the approximate number of items


returned by the search.
vlvPref.dwOffset = 0;
vlvPref.dwContentCount = 0;
vlvPref.dwContextIDLength = 0;

// Set the VLV search preference.


ADS_SEARCHPREF_INFO SearchPrefs[2];
SearchPrefs[0].dwSearchPref = ADS_SEARCHPREF_VLV;
SearchPrefs[0].vValue.dwType = ADSTYPE_PROV_SPECIFIC;
SearchPrefs[0].vValue.ProviderSpecific.dwLength = sizeof(ADS_VLV);
SearchPrefs[0].vValue.ProviderSpecific.lpValue = (LPBYTE)&vlvPref;

/*
Have the server perform the sorting. This option must be explicitly
added
when using VLV searching.
*/
ADS_SORTKEY sortKey;
sortKey.pszAttrType = (LPWSTR)pwszAttribute;
sortKey.pszReserved = NULL;
sortKey.fReverseorder = 0;

SearchPrefs[1].dwSearchPref = ADS_SEARCHPREF_SORT_ON;
SearchPrefs[1].vValue.dwType = ADSTYPE_PROV_SPECIFIC;
SearchPrefs[1].vValue.ProviderSpecific.dwLength = sizeof(ADS_SORTKEY);
SearchPrefs[1].vValue.ProviderSpecific.lpValue = (LPBYTE)&sortKey;

// Set the search preferences.


hr = pSearch->SetSearchPreference(SearchPrefs,
sizeof(SearchPrefs)/sizeof(SearchPrefs[0]));
if(S_OK != hr)
{
return hr;
}

// Execute the search.


ADS_SEARCH_HANDLE hSearchHandle;
LPWSTR rgAttributes[1];
rgAttributes[0] = (LPWSTR)pwszAttribute;
hr = pSearch->ExecuteSearch((LPWSTR)pwszSearchFilter,
rgAttributes,
sizeof(rgAttributes)/sizeof(rgAttributes[0]),
&hSearchHandle);
if(S_OK != hr)
{
return hr;
}

// Get the first result row.


hr = pSearch->GetFirstRow(hSearchHandle);
if(S_OK != hr)
{
return hr;
}

// Get the VLV response data.


ADS_SEARCH_COLUMN column;
hr = pSearch->GetColumn(hSearchHandle, ADS_VLV_RESPONSE, &column);
if(S_OK != hr)
{
return hr;
}

ADS_VLV *pVlv = (ADS_VLV*)column.pADsValues->ProviderSpecific.lpValue;


*pdwCount = pVlv->dwContentCount;

/*
Allocate or reallocate the buffer if required and copy the context ID
to the buffer.
*/
CopyContextID(pVlv->lpContextID, pVlv->dwContextIDLength, ppContextID);

// Release the column.


pSearch->FreeColumn(&column);

// Close the search handle.


pSearch->CloseSearchHandle(hSearchHandle);
return hr;
}

Função de exemplo GetVLVItemText


O exemplo de código a seguir mostra como usar uma pesquisa VLV para obter o texto
de um único item com base em um índice.

C++

/***************************************************************************

GetVLVItemText()

***************************************************************************/

HRESULT GetVLVItemText(IDirectorySearch *pSearch,


LPCWSTR pwszSearchFilter,
LPCWSTR pwszAttribute,
DWORD dwIndex,
LPTSTR pszADsPath,
DWORD dwChars,
LPBYTE* ppContextID)
{
HRESULT hr;

if(!pSearch)
{
return E_INVALIDARG;
}

// Initialize the ADS_VLV structure.


ADS_VLV vlvPref;
ZeroMemory(&vlvPref, sizeof(vlvPref));

// This index is one-based, but the index passed is zero-based.


vlvPref.dwOffset = dwIndex + 1;
vlvPref.dwBeforeCount = 0;
vlvPref.dwAfterCount = 0;
vlvPref.dwContentCount = 0;
if(*ppContextID)
{
vlvPref.lpContextID = *ppContextID;
vlvPref.dwContextIDLength = (DWORD)LocalSize(*ppContextID);
}

// Set the VLV search preference.


ADS_SEARCHPREF_INFO SearchPrefs[2];
SearchPrefs[0].dwSearchPref = ADS_SEARCHPREF_VLV;
SearchPrefs[0].vValue.dwType = ADSTYPE_PROV_SPECIFIC;
SearchPrefs[0].vValue.ProviderSpecific.dwLength = sizeof(ADS_VLV);
SearchPrefs[0].vValue.ProviderSpecific.lpValue = (LPBYTE)&vlvPref;

/*
Instruct the server to perform the sort. This option must be explicitly
added
when using a VLV search.
*/
ADS_SORTKEY sortKey;
sortKey.pszAttrType = (LPWSTR)pwszAttribute;
sortKey.pszReserved = NULL;
sortKey.fReverseorder = 0;

SearchPrefs[1].dwSearchPref = ADS_SEARCHPREF_SORT_ON;
SearchPrefs[1].vValue.dwType = ADSTYPE_PROV_SPECIFIC;
SearchPrefs[1].vValue.ProviderSpecific.dwLength = sizeof(ADS_SORTKEY);
SearchPrefs[1].vValue.ProviderSpecific.lpValue = (LPBYTE)&sortKey;

// Set the search preferences.


hr = pSearch->SetSearchPreference(SearchPrefs,
sizeof(SearchPrefs)/sizeof(SearchPrefs[0]));
if(S_OK != hr)
{
return hr;
}

// Execute the search.


ADS_SEARCH_HANDLE hSearchHandle;
LPWSTR rgAttributes[1];
rgAttributes[0] = (LPWSTR)pwszAttribute;
hr = pSearch->ExecuteSearch((LPWSTR)pwszSearchFilter,
rgAttributes,
sizeof(rgAttributes)/sizeof(rgAttributes[0]),
&hSearchHandle);
if(S_OK != hr)
{
return hr;
}

// Get the first result row.


hr = pSearch->GetFirstRow(hSearchHandle);
if(S_OK == hr)
{
ADS_SEARCH_COLUMN column;

// Get the ADsPath.


hr = pSearch->GetColumn(hSearchHandle, (LPWSTR)pwszAttribute,
&column);
if(SUCCEEDED(hr))
{
WideCharToLocal(pszADsPath, column.pADsValues->CaseIgnoreString,
dwChars);
pSearch->FreeColumn(&column);
}

// Get the VLV response data.


hr = pSearch->GetColumn(hSearchHandle, ADS_VLV_RESPONSE, &column);
if(SUCCEEDED(hr))
{
ADS_VLV *pVlv = (ADS_VLV*)column.pADsValues-
>ProviderSpecific.lpValue;

/*
Allocate or reallocate the buffer if required and copy the
context ID
to the buffer.
*/
CopyContextID(pVlv->lpContextID, pVlv->dwContextIDLength,
ppContextID);

pSearch->FreeColumn(&column);
}

// Close the search handle.


pSearch->CloseSearchHandle(hSearchHandle);

return hr;
}

Função de exemplo GetVLVItemsByString


O exemplo de código a seguir mostra como usar uma pesquisa VLV para obter o texto
de um número especificado de itens com base em uma cadeia de caracteres. Este
exemplo adicionará as classificações recuperadas a uma caixa de listagem.

C++

/***************************************************************************

GetVLVItemsByString()

***************************************************************************/

HRESULT GetVLVItemsByString(HWND hwndListbox,


IDirectorySearch *pSearch,
LPCWSTR pwszSearchFilter,
DWORD dwNumToRetrieve,
LPCWSTR pwszAttribute,
LPCWSTR pwszFilter,
LPBYTE* ppContextID)
{
HRESULT hr;

if(!pSearch || (0 == dwNumToRetrieve))
{
return E_INVALIDARG;
}

// Clear the list box.


SendMessage(hwndListbox, LB_RESETCONTENT, 0, 0);

// Initialize the ADS_VLV structure.


ADS_VLV vlvPref;
ZeroMemory(&vlvPref, sizeof(vlvPref));

vlvPref.pszTarget = (LPWSTR)pwszFilter;
vlvPref.dwBeforeCount = 0;
vlvPref.dwAfterCount = dwNumToRetrieve - 1;
vlvPref.dwContentCount = 0;

// Set the VLV search preference.


ADS_SEARCHPREF_INFO SearchPrefs[2];
SearchPrefs[0].dwSearchPref = ADS_SEARCHPREF_VLV;
SearchPrefs[0].vValue.dwType = ADSTYPE_PROV_SPECIFIC;
SearchPrefs[0].vValue.ProviderSpecific.dwLength = sizeof(ADS_VLV);
SearchPrefs[0].vValue.ProviderSpecific.lpValue = (LPBYTE)&vlvPref;

/*
Instruct the server to perform the sort. This option must be explicitly
added
when using VLV search.
*/
ADS_SORTKEY sortKey;
sortKey.pszAttrType = (LPWSTR)pwszAttribute;
sortKey.pszReserved = NULL;
sortKey.fReverseorder = 0;

SearchPrefs[1].dwSearchPref = ADS_SEARCHPREF_SORT_ON;
SearchPrefs[1].vValue.dwType = ADSTYPE_PROV_SPECIFIC;
SearchPrefs[1].vValue.ProviderSpecific.dwLength = sizeof(ADS_SORTKEY);
SearchPrefs[1].vValue.ProviderSpecific.lpValue = (LPBYTE)&sortKey;

// Set the search preferences.


hr = pSearch->SetSearchPreference(SearchPrefs,
sizeof(SearchPrefs)/sizeof(SearchPrefs[0]));
if(S_OK != hr)
{
return hr;
}

// Execute the search.


ADS_SEARCH_HANDLE hSearchHandle;
hr = pSearch->ExecuteSearch((LPWSTR)pwszSearchFilter,
NULL,
-1,
&hSearchHandle);
if(S_OK != hr)
{
return hr;
}
ADS_SEARCH_COLUMN column;

// Get the first result row.


hr = pSearch->GetFirstRow(hSearchHandle);
while(S_OK == hr)
{
// Get the data.
hr = pSearch->GetColumn(hSearchHandle, (LPWSTR)pwszAttribute,
&column);
if(SUCCEEDED(hr))
{
TCHAR szItemText[MAX_PATH];
WideCharToLocal(szItemText, column.pADsValues->CaseIgnoreString,
MAX_PATH);
SendMessage(hwndListbox, LB_ADDSTRING, 0, (LPARAM)szItemText);

pSearch->FreeColumn(&column);
}

// Get the next row.


hr = pSearch->GetNextRow(hSearchHandle);
}

// Get the VLV response data.


hr = pSearch->GetColumn(hSearchHandle, ADS_VLV_RESPONSE, &column);
if(S_OK != hr)
{
return hr;
}

ADS_VLV *pVlv = (ADS_VLV*)column.pADsValues->ProviderSpecific.lpValue;

/*
Allocate or reallocate the buffer if required and copy the context ID
to the buffer.
*/
CopyContextID(pVlv->lpContextID, pVlv->dwContextIDLength, ppContextID);

// Release the column.


pSearch->FreeColumn(&column);

// Close the search handle.


pSearch->CloseSearchHandle(hSearchHandle);

return hr;
}
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Código de exemplo para usar
IDirectorySearch
Artigo • 03/06/2023

O SDK (Platform Software Development Kit) inclui um tópico de exemplo de código,


DsSrch, que fornece um aplicativo de prompt de comando simples que usa a interface
IDirectorySearch para consultar um serviço de diretório. O exemplo de código
completo está incluído no SDK da Plataforma no diretório
Samples\NetDs\ADSI\Samples\General\DsSrch.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Pesquisando com ADO (ActiveX Data
Objects)
Artigo • 13/06/2023

O modelo ADO (ActiveX Data Object) consiste em objetos listados na tabela a seguir.

Objeto Descrição

Conexão Uma conexão aberta com uma fonte de dados OLE DB, como ADSI.

Comando Define um comando específico a ser executado na fonte de dados.

Parâmetro Uma coleção opcional para todos os parâmetros a serem fornecidos ao objeto de
comando.

Registros Um conjunto de registros de uma tabela, objeto de comando ou sintaxe SQL. Um


conjunto de registros pode ser criado sem qualquer objeto de conexão subjacente.

Campo Uma única coluna de dados em um conjunto de registros.

Propriedade Uma coleção de valores fornecidos pelo provedor para o ADO.

Erro Contém dados sobre erros de acesso a dados. Atualizado quando ocorre um erro
em uma única operação.

Para que o ADO se comunique com ADSI, deve haver, pelo menos, dois objetos ADO:
Connection e RecordSet. Esses objetos ADO servem para autenticar usuários e
enumerar resultados, respectivamente. Normalmente, você também usará um objeto
Command para manter uma conexão ativa, especificar parâmetros de consulta, como
tamanho da página e escopo de pesquisa, e executar uma consulta. Para obter mais
informações sobre a sintaxe do filtro de pesquisa, consulte Sintaxe de filtro de pesquisa.

O objeto Connection carrega o provedor OLE DB e valida as credenciais do usuário. No


Visual Basic, chame a função CreateObject com "ADODB. Conexão" para criar uma
instância de um objeto Connection e, em seguida, defina a propriedade Provider do
objeto Connection como "ADsDSOObject". "ADODB. Connection" é o ProgID do objeto
Connection e "ADsDSOObject" é o nome do provedor OLE DB no ADSI. Se nenhuma
credencial for especificada, as credenciais do usuário conectado no momento serão
usadas.

O exemplo de código a seguir mostra como criar uma instância de um objeto


Connection .

VB
Set con = CreateObject("ADODB.Connection")
con.Provider = "ADsDSOObject"

O exemplo de código a seguir mostra como criar uma instância de um objeto


Connection .

VB

<%
Set con = Server.CreateObject("ADODB.Connection")
con.Provider = "ADsDSOObject"
%>

O exemplo de código a seguir mostra como criar uma instância de um objeto


Connection . Lembre-se de que você deve incluir a biblioteca de tipos do ADO
(msadoXX.dll) como uma das referências no projeto do Visual Basic.

VB

Dim Con As New Connection


con.Provider = "ADsDSOObject"

Especifique os dados de autenticação do usuário definindo as propriedades do objeto


Connection . A tabela a seguir lista as propriedades de autenticação de usuário
compatíveis com ADSI.

Propriedade Descrição

"ID de Uma cadeia de caracteres que identifica o usuário cujo contexto de segurança é
usuário" usado ao executar a pesquisa. Para obter mais informações sobre o formato da
cadeia de caracteres de nome de usuário, consulte
IADsOpenDSObject::OpenDSObject. Se não for especificado, o padrão será o
usuário conectado ou o usuário representado pelo processo de chamada.

"Password" Uma cadeia de caracteres que especifica a senha do usuário identificado por "ID
de usuário".

"Criptografar Um valor booliano que especifica se a senha é criptografada. O padrão é false.


Senha"

"Sinalizador Um conjunto de sinalizadores da enumeração ADS_AUTHENTICATION_ENUM


ADSI" que especificam as opções de autenticação de associação. O padrão é zero.

O exemplo de código a seguir mostra como as propriedades são definidas antes de criar
o objeto Command .
VB

Set oConnect = CreateObject("ADODB.Connection")


oConnect.Provider = "ADsDSOObject"
oConnect.Properties("User ID") = stUser
oConnect.Properties("Password") = stPass
oConnect.Properties("Encrypt Password") = True
oConnect.Open "DS Query", stUser, stPass

O segundo objeto ADO é o objeto Command . O ProgID do objeto Command é


"ADODB. Comando". Esse objeto permite emitir instruções de consulta e outros
comandos para ADSI usando a conexão ativa. O objeto Command usa sua propriedade
ActiveConnection para manter uma conexão ativa. Ele também mantém a propriedade
CommandText para manter instruções de consulta emitidas por um usuário. As
instruções de consulta são expressas no dialeto SQL ou no dialeto LDAP.

Os exemplos de código a seguir mostram como criar um objeto Command .

VB

Set command = CreateObject("ADODB.Command")


Set command.ActiveConnection = oConnect
command.CommandText =
"SELECT AdsPath, cn FROM 'LDAP://DC=Fabrikam,DC=com' WHERE objectClass =
'*'"

No exemplo de código a seguir, inclua a biblioteca de tipos do ADO (msadoXX.dll)


como uma das referências.

VB

Dim command As New Command


Set command.ActiveConnection = oConnect
command.CommandText = "<LDAP://DC=Fabrikam,DC=com>;(objectClass=*);AdsPath,
cn; subTree"

As opções de pesquisa para o objeto Command são especificadas definindo a


propriedade Properties . A tabela a seguir lista as propriedades nomeadas aceitáveis
para Propriedades.

Propriedade Descrição
nomeada
Propriedade Descrição
nomeada

"Assíncrono" Um valor booliano que especifica se a pesquisa é síncrona ou assíncrona. O


padrão é False (síncrono). Uma pesquisa síncrona bloqueia até que o servidor
retorne todo o resultado ou para uma pesquisa paginada, a página inteira. Uma
pesquisa assíncrona bloqueia até que uma linha dos resultados da pesquisa
esteja disponível ou até que o tempo especificado pela propriedade "Timeout"
desça.

"Resultados Um valor booliano que especifica se o resultado deve ser armazenado em cache
do cache" no lado do cliente. O padrão é true; O ADSI armazena em cache o conjunto de
resultados. Desativar essa opção pode ser desejável para conjuntos de
resultados grandes.

"Referências Um valor do ADS_CHASE_REFERRALS_ENUM que especifica como a pesquisa


de persegue as indicações. O padrão é ADS_CHASE_REFERRALS_NEVER. Para obter
perseguição" mais informações sobre essa propriedade, consulte Indicações.

"Somente Um valor booliano que indica que a pesquisa deve recuperar apenas o nome dos
nomes de atributos aos quais os valores foram atribuídos. O padrão é false.
coluna"

"Deref Um valor booliano que especifica se os aliases de objetos encontrados são


Aliases" resolvidos. O padrão é false.

"Tamanho da Um valor inteiro que ativa a paginação e especifica o número máximo de objetos
página" a serem retornados em um conjunto de resultados. O padrão não é nenhum
tamanho de página. Para obter mais informações, consulte Recuperando
conjuntos de resultados grandes.

"SearchScope" Um valor da enumeração ADS_SCOPEENUM que especifica o escopo da


pesquisa. O padrão é ADS_SCOPE_SUBTREE.

"Limite de Um valor inteiro que especifica o limite de tamanho para a pesquisa. Para o
tamanho" Active Directory, o limite de tamanho especifica o número máximo de objetos
retornados. O servidor para de pesquisar quando o limite de tamanho é atingido
e retorna os resultados acumulados. O padrão não é limite.

"Classificar" Uma cadeia de caracteres que especifica uma lista separada por vírgulas de
atributos a serem usados como chaves de classificação. Essa propriedade
funciona apenas para servidores de diretório que dão suporte ao controle LDAP
para classificação do lado do servidor. O Active Directory dá suporte ao controle
de classificação, mas pode afetar o desempenho do servidor, especialmente se o
conjunto de resultados for grande. Lembre-se de que o Active Directory dá
suporte apenas a uma única chave de classificação. O padrão não é classificação.

"Limite de Um valor inteiro que especifica o limite de tempo, em segundos, para a


Tempo" pesquisa. Quando o limite de tempo é atingido, o servidor para de pesquisar e
retorna os resultados acumulados. O padrão é sem limite de tempo.
Propriedade Descrição
nomeada

"Tempo Um valor inteiro que especifica o valor de tempo limite do lado do cliente, em
limite" segundos. Esse valor indica o tempo em que o cliente aguarda os resultados do
servidor antes de interromper a pesquisa. O padrão não é tempo limite.

O exemplo de código a seguir mostra como definir opções de pesquisa.

VB

Const ADS_SCOPE_ONELEVEL = 1
Const ADS_CHASE_REFERRALS_EXTERNAL = &H40

Dim Com As New Command

Com.Properties("Page Size") = 999


Com.Properties("Timeout") = 30 ' Seconds
Com.Properties("searchscope") = ADS_SCOPE_ONELEVEL
Com.Properties("Chase referrals") = ADS_CHASE_REFERRALS_EXTERNAL
Com.Properties("Cache Results") = False ' Do not cache the result set.

O terceiro objeto ADO é RecordSet. Você obtém esse objeto quando invoca o método
Execute em um objeto Command . A função primária do objeto RecordSet é enumerar
o conjunto de resultados e obter os dados. O conjunto de resultados pode conter
valores para atributos que têm valores únicos ou múltiplos. Obter um atributo de valor
único é simples, semelhante a obter o valor da coluna no banco de dados relacional, por
exemplo:

VB

Fields('name').Value

Obter um atributo com vários valores, no entanto, é mais desafiador. Nesse caso,
Field.Value é uma matriz e você deve marcar o limite inferior e superior da matriz,
conforme mostrado no exemplo de código a seguir.

VB

Set rs = Com.Execute

For i = 0 To rs.Fields.Count - 1
Debug.Print rs.Fields(i).Name, rs.Fields(i).Type
Next i

'--------------------------
' Navigate the record set.
'--------------------------
rs.MoveFirst
lstResult.Clear ' Clear the user interface.
While Not rs.EOF
For i = 0 To rs.Fields.Count - 1
' For Multi Value attribute
If rs.Fields(i).Type = adVariant And Not (IsNull(rs.Fields(i).Value))
Then
Debug.Print rs.Fields(i).Name, " = "
For j = LBound(rs.Fields(i).Value) To UBound(rs.Fields(i).Value)
Debug.Print rs.Fields(i).Value(j), " # "
lstResult.AddItem rs.Fields(i).Value(j)
Next j
Else
' For Single Value attribute.
Debug.Print rs.Fields(i).Name, " = ", rs.Fields(i).Value
lstResult.AddItem rs.Fields(i).Value
End If
Next i
rs.MoveNext
Wend

O exemplo de código a seguir desabilita as contas de usuário em um servidor LDAP.

VB

Dim X as IADs
Dim con As New Connection, rs As New Recordset
Dim MyUser As IADsUser

con.Provider = "ADsDSOObject"
con.Open "Active Directory Provider",
"CN=Test,CN=Users,DC=Fabrikam,DC=COM,O=INTERNET", "Password"
Set rs = con.Execute("<LDAP://MyMachine/DC=MyDomain,DC=Fabrikam,DC=com>;
(objectClass=User);ADsPath;onelevel")

While Not rs.EOF


' Bind to the object to make changes
' to it because ADO is currently read-only.
MyUser = GetObject(rs.Fields(0).Value)
MyUser.AccountDisabled = True
MyUser.SetInfo
rs.MoveNext
Wend

Para obter mais informações sobre o modelo de objeto do ADO, consulte Microsoft
ActiveX Data Objects.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Modificando um objeto ADSI do ADO
Artigo • 13/06/2023

ADSI para Windows 2000 e Cliente DS inclui um provedor OLE DB somente leitura. Isso
significa que você não pode, no momento, emitir a instrução UPDATE no dialeto SQL.

Para modificar um objeto retornado de uma consulta ADO

1. Solicite o ADsPath ao especificar um nome de atributo, como em "SELECT


ADsPath, ..."
2. Execute a consulta e obtenha o atributo ADsPath .
3. Associe ao conjunto de registros usando ADsPath e modifique os atributos.

O exemplo de código a seguir mostra como modificar um objeto ADSI depois de


executar as etapas descritas no exemplo anterior.

VB

Dim Con As New Connection


Dim rs As New Recordset
Dim command As New Command
Dim usr As IADsUser

' Replace department for all users in OU=sales.


Set con = Server.CreateObject("ADODB.Connection")
con.Provider = "ADsDSOObject"

Set command = CreateObject("ADODB.Command")


Set command.ActiveConnection = con

command.CommandText = "SELECT AdsPath, cn FROM


'LDAP://OU=Sales,DC=Fabrikam,DC=com' WHERE objectClass = 'user'"

command.Properties("searchscope") = ADS_SCOPE_ONELEVEL
Set rs = command.Execute
While Not rs.EOF
Set usr = GetObject(rs.Fields("AdsPath").Value)
usr.Put "department", "1001"
usr.SetInfo
rs.MoveNext
Wend
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Pesquisando com o OLE DB
Artigo • 12/06/2023

Para clientes de Automação que usam ADO (ActiveX Data Objects) e todos os clientes
que não são de Automação, o ADSI fornece um provedor OLE DB que dá suporte a um
subconjunto de interfaces de consulta OLE DB. O código do cliente que já usa interfaces
OLE DB para consultas pode usar as mesmas interfaces para consultar serviços de
diretório.

Na implementação do OLE DB, um serviço de diretório é exposto como um objeto fonte


de dados. Os objetos fonte de dados são fábricas para objetos de sessão e dão suporte
a IDBInitialize para se conectar ao diretório, IDBCreateSession para criar o objeto de
sessão, IDBProperties para fornecer dados de autenticação para o namespace
subjacente e fornecer o comando de consulta e IPersist para salvar os dados
necessários para criar o objeto de fonte de dados para o serviço de diretório subjacente.

Para executar uma consulta do Active Directory usando o OLE DB

1. Recupere a interface IDBInitialize do provedor OLE DB. No caso do Active


Directory, use o identificador de classe CLSID_ADsDSOObject.
2. Crie uma matriz DBPROP de dados de conexão especificando o nome de usuário e
a senha.
3. Consulte a interface IDBInitialize recuperada na Etapa 1 para a interface
IDBProperties .
4. Chame o método IDBProperties::SetProperties passando a matriz DBPROP criada
na Etapa 2.
5. Chame o método IDBInitialize::Initialize para estabelecer a conexão com o
provedor OLE DB; esse é o provedor do Active Directory, nesse caso.
6. Consulte a interface IDBInitialize para a interface IDBCreateSession .
7. Chame o método IDBCreateSession::CreateSession solicitando uma nova interface
do tipo IDBCreateCommand.
8. Chame o método IDBCreateCommand::CreateCommand para criar uma interface
ICommandText .
9. Chame o método ICommandText::SetCommandText . Passe o dialeto preferencial e
o texto do comando de consulta real nesse dialeto. DBGUID_LDAPDialect
ouDBGUID_DBSQL podem ser usados como dialeto.
10. Chamar ICommand::Execute; uma interface IRowset é retornada, que é a interface
para o conjunto de resultados.
11. Consulte a interface IRowset para a interface IColumnsInfo .
12. Chame o método IColumnsInfo::GetColumnInfo para recuperar dados de coluna
sobre o conjunto de resultados.
13. Preencha uma matriz de estruturas DBBINDING , descrevendo ao provedor OLE DB
como expor os tipos de dados por coluna ao código do aplicativo. Esta etapa
permite que você especifique qual TIPO está contido em uma coluna específica.
Além disso, os deslocamentos das colunas, em relação à linha retornada, são
definidos aqui em uma base coluna por coluna.
14. Consulte a interface IRowset para a interface IAccessor .
15. Chame o método IAccessor::CreateAccessor , que retorna uma matriz de
identificadores do acessador. Essa matriz é então usada para acessar as linhas do
conjunto de resultados.
16. Chame IRowset::GetNextRows passando os identificadores de linha e o número de
linhas a serem obtidos.
17. Chame IRowset::GetData passando um identificador de linha, do conjunto
retornado na Etapa 16. Um ponteiro bruto para a linha é retornado.

Para obter mais informações sobre a sintaxe do filtro de pesquisa, consulte Sintaxe de
filtro de pesquisa.

Para ler os dados de linha não processados retornados, use a estrutura DBBINDING ,
criada na Etapa 13, compute os deslocamentos de coluna no ponteiro de dados não
processados retornado na Etapa 17. Leia a parte status da coluna para obter um
resultado de recuperação nessa coluna.

Para obter mais informações e um exemplo de código que mostra como pesquisar o
Active Directory usando o provedor ADSI OLE DB, consulte Código de exemplo para
usar o OLE DB para pesquisar o Active Directory.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Código de exemplo para usar o OLE DB
para pesquisar o Active Directory
Artigo • 12/06/2023

O exemplo de código a seguir mostra como pesquisar o Active Directory usando C++,
COM e OLE DB. Este é um exemplo de uma função que usa o nome diferenciado do
contêiner para pesquisar e as credenciais a serem usadas para a pesquisa. O exemplo
executará uma pesquisa de subárvores no contêiner especificado para todos os objetos
que têm um objectClass de "user". O exemplo imprimirá o nome e os atributos
ADsPath de cada usuário na janela do console.

Há dois dialetos de consulta que podem ser usados com o provedor ADSI OLE DB, LDAP
e SQL. O dialeto é especificado no método ICommandText::SetCommandText com um
dos seguintes GUIDs:

DBGUID_SQL para o dialeto SQL.


DBGUID_LDAPDialect para o dialeto LDAP.

Este exemplo usa o dialeto LDAP.

O método ICommandText::SetCommandText também pode aceitar o GUID


DBGUID_DEFAULT para o dialeto. Nesse caso, o ADSI tentará usar o dialeto SQL
primeiro; se isso falhar, ADSI tentará usar o dialeto LDAP. Para obter mais informações,
consulte Dialeto LDAP e dialeto SQL.

Para obter mais informações sobre o OLE DB, consulte o Guia do Programador OLE DB.

C++

//********************************************************************
// #include statements
//********************************************************************

#include <atlbase.h>
#include <oledb.h>
#include <adsiid.h>
#include <oledberr.h>

//********************************************************************
// function prototypes
//********************************************************************

void PrintRowData(DBBINDING *rgBind,


DBCOLUMNINFO *pDBColumnInfo,
ULONG ulNumColsBind,
BYTE *pData);

//********************************************************************
// global variables and definitions
//********************************************************************

typedef struct
{
DBLENGTH dwLength;
DBSTATUS dwStatus;
BYTE bData[1];
}DBCOLUMNDATA, *PDBCOLUMNDATA;

#define NUMROWS_CHUNK 500

/*********************************************************************

PrintAllUsers()

*********************************************************************/

HRESULT PrintAllUsers(LPCWSTR pwszDN,


LPCWSTR pwszUsername,
LPCWSTR pwszPassword)
{
HRESULT hr;
DBCOLUMNINFO *rgDBColumnInfo = NULL;
LPWSTR pStringsBuffer = NULL;
DBBINDING *rgBind = NULL;
CComPtr<IDBInitialize> spDBInitialize;
CComPtr<IDBProperties> spDBProperties;
DBPROP InitProperties[3];
CComBSTR sbstrUsername;
CComBSTR sbstrPassword;
DBPROPSET InitPropSet;
CComPtr<IDBCreateSession> spCreateSession;
CComPtr<IDBCreateCommand> spCreateCommand;
CComPtr<ICommandText> spCommandText;
CComBSTR sbstrCommand;
CComPtr<IRowset> spRowset;
DBROWCOUNT cRows;
CComPtr<IColumnsInfo> spColumnsInfo;
DBORDINAL cColumns;
DWORD dwOffset;
DWORD cMaxRowSize;
HACCESSOR hAccessor;
BYTE *pRowData = NULL;
ULONG cRowsObtained;
CComPtr<IAccessor> spAccessor;

// Get a memory allocator for allocating and freeing memory.


CComPtr<IMalloc> spMalloc;
hr = CoGetMalloc(1, &spMalloc);
if(S_OK != hr)
{
return hr;
}

// Create an instance of the OLE DB - ODBC provider.


hr = CoCreateInstance(CLSID_ADsDSOObject,
NULL,
CLSCTX_INPROC_SERVER,
IID_IDBInitialize,
(void**)&spDBInitialize);
if(S_OK != hr)
{
return hr;
}

// Get the IDBProperties interface.


hr = spDBInitialize->QueryInterface(IID_IDBProperties,
(void**)&spDBProperties);
if(S_OK != hr)
{
return hr;
}

// Initialize the OLE DB property initializer structures.


for(UINT i = 0; i < 3; i++ )
{
VariantInit(&InitProperties[i].vValue);
InitProperties[i].dwOptions = DBPROPOPTIONS_REQUIRED;
InitProperties[i].colid = DB_NULLID;
}

// Level of prompting performed for the connection process.


InitProperties[0].dwPropertyID = DBPROP_INIT_PROMPT;
InitProperties[0].vValue.vt = VT_I2;
InitProperties[0].vValue.iVal = DBPROMPT_NOPROMPT;

// Set the user ID.


sbstrUsername = pwszUsername;
InitProperties[1].dwPropertyID = DBPROP_AUTH_USERID;
InitProperties[1].vValue.vt = VT_BSTR;
InitProperties[1].vValue.bstrVal = sbstrUsername;

// Set the password.


sbstrPassword = pwszPassword;
InitProperties[2].dwPropertyID = DBPROP_AUTH_PASSWORD;
InitProperties[2].vValue.vt = VT_BSTR;
InitProperties[2].vValue.bstrVal = sbstrPassword;

// Set the InitProperties array into the property set.


InitPropSet.guidPropertySet = DBPROPSET_DBINIT;
InitPropSet.cProperties = 3;
InitPropSet.rgProperties = InitProperties;

// Set initialization properties.


hr = spDBProperties->SetProperties(1, &InitPropSet);
if(S_OK != hr)
{
return hr;
}

// Initialize the connection.


hr = spDBInitialize->Initialize();
if(S_OK != hr)
{
return hr;
}

// Get the IDBCreateSession interface.


hr = spDBInitialize->QueryInterface(IID_IDBCreateSession,
(void**)&spCreateSession);
if(S_OK != hr)
{
return hr;
}

// Create an IDBCreateCommand object.


hr = spCreateSession->CreateSession(NULL,
IID_IDBCreateCommand,
(IUnknown**)&spCreateCommand);
if(S_OK != hr)
{
return hr;
}

// Create an ICommandText Interface from


// the ICreateCommand Interface.
hr = spCreateCommand->CreateCommand(NULL,
IID_ICommandText,
(IUnknown**)&spCommandText);
if(S_OK != hr)
{
return hr;
}

// Build the command string.


sbstrCommand = "<LDAP://";
sbstrCommand += pwszDN;
sbstrCommand += ">;(objectClass=user);name,adspath;subtree";
/*
Before executing the query, pass the command text for
the query along with the dialect of the command text.
In this case, use the LDAP dialect. You can also pass
DBGUID_DBSQL, providing the query text is in that format.
*/
hr = spCommandText->SetCommandText(DBGUID_LDAPDialect,
sbstrCommand);
if(S_OK != hr)
{
return hr;
}
/*
Instruct the Active Directory OLE DB provider
to execute the statement. If successful, an
IRowset interface is returned.
*/
hr= spCommandText->Execute(NULL,
IID_IRowset,
NULL,
&cRows,
(IUnknown**)&spRowset);

if(DB_SEC_E_PERMISSIONDENIED == hr)
{
return hr;
}
if(S_OK != hr)
{
return hr;
}

// Retrieve the search results.

/*
An IRowset object is now available. Send a query
for the IColumnsInfo interface to obtain the column
data of the result set.
*/
hr = spRowset->QueryInterface(IID_IColumnsInfo,
(void**)&spColumnsInfo);
if(S_OK != hr)
{
return hr;
}

/*
Use the IColumnsInfo::GetColumnInfo method to get
the column data from the command object.
*/
hr = spColumnsInfo->GetColumnInfo(&cColumns,
&rgDBColumnInfo,
&pStringsBuffer);
if(S_OK != hr)
{
goto PrintAllUsers_cleanup;
}

/*
Create column bindings for the result set.
This code example instructs the IAccessor to return
column data as Unicode strings.
*/
rgBind = (DBBINDING*)spMalloc->Alloc(sizeof(DBBINDING) * cColumns);
if(!rgBind)
{
goto PrintAllUsers_cleanup;
}

dwOffset = 0;
for(ULONG ulBind = 0; ulBind < cColumns; ulBind++)
{
// Binding structure.
rgBind[ulBind].dwPart = DBPART_VALUE | DBPART_LENGTH |
DBPART_STATUS;
rgBind[ulBind].eParamIO = DBPARAMIO_NOTPARAM;
rgBind[ulBind].iOrdinal = rgDBColumnInfo[ulBind].iOrdinal;
rgBind[ulBind].wType = DBTYPE_WSTR;
rgBind[ulBind].pTypeInfo = NULL;
rgBind[ulBind].obValue = dwOffset + offsetof(DBCOLUMNDATA,
bData);
rgBind[ulBind].obLength = dwOffset + offsetof(DBCOLUMNDATA,
dwLength);
rgBind[ulBind].obStatus = dwOffset + offsetof(DBCOLUMNDATA,
dwStatus);
rgBind[ulBind].cbMaxLen = rgDBColumnInfo[ulBind].ulColumnSize;
rgBind[ulBind].pObject = NULL;
rgBind[ulBind].pBindExt = NULL;
rgBind[ulBind].dwFlags = 0;
rgBind[ulBind].dwMemOwner = DBMEMOWNER_CLIENTOWNED;
rgBind[ulBind].bPrecision = 0;
rgBind[ulBind].bScale = 0;

dwOffset += rgBind[ulBind].cbMaxLen + offsetof(DBCOLUMNDATA, bData);


}
cMaxRowSize = dwOffset;

// Get the IAccessor interface from the rowset.


hr = spRowset->QueryInterface(IID_IAccessor, (void**)&spAccessor);
if(S_OK != hr)
{
goto PrintAllUsers_cleanup;
}

/*
Call the IAccessor::CreateAccessor method, which returns an
array of accessor handles. This is an array of handles
to the rows in the result set.
*/
hr = spAccessor->CreateAccessor(DBACCESSOR_ROWDATA,
ulBind,
rgBind,
0,
&hAccessor,
NULL);
if(S_OK != hr)
{
goto PrintAllUsers_cleanup;
}

// Allocate a block of memory that will hold one


// row of the result set.
pRowData = (BYTE*)spMalloc->Alloc(cMaxRowSize);
if(!pRowData)
{
goto PrintAllUsers_cleanup;
}

// Process all the rows, one by one, NUMROWS_CHUNK rows at a time.


do
{
HROW *rgRowHandles = NULL;
cRowsObtained = 0;

/*
Call the IRowset::GetNextRows method to specify
the number of rows desired, pointers to the return row data,
and the number of rows returned.
*/
hr = spRowset->GetNextRows(
0,
0,
NUMROWS_CHUNK,
&cRowsObtained,
&rgRowHandles);
if(SUCCEEDED(hr) && (cRowsObtained > 0))
{
// Loop through the rows obtained,
// getting the data for each.
for(ULONG ulRow = 0; ulRow < cRowsObtained; ulRow++)
{
// Retrieve the row.
hr = spRowset->GetData(rgRowHandles[ulRow],
hAccessor,
pRowData);

// Print to screen.
PrintRowData(rgBind, rgDBColumnInfo, ulBind, pRowData);
}

// Release the row handles.


hr = spRowset->ReleaseRows(cRowsObtained, rgRowHandles, 0, 0,
0);
}

// Free the row handles.


if(rgRowHandles)
{
spMalloc->Free(rgRowHandles);
}

}while(cRowsObtained > 0);

PrintAllUsers_cleanup:
if(rgDBColumnInfo)
{
spMalloc->Free(rgDBColumnInfo);
}

if(pStringsBuffer)
{
spMalloc->Free(pStringsBuffer);
}

if(rgBind)
{
spMalloc->Free(rgBind);
}

if(pRowData)
{
spMalloc->Free(pRowData);
}
}

/********************************************************************

PrintRowData()

********************************************************************/

void PrintRowData(DBBINDING *rgBind,


DBCOLUMNINFO pDBColumnInfo[],
ULONG ulNumColsBind,
BYTE *pData)
{
ULONG ulCurrentCol;
DBCOLUMNDATA *pColumn;

// Print each column that is bound to.


for(ulCurrentCol = 0;
ulCurrentCol < ulNumColsBind;
ulCurrentCol++)
{
/*
Get a pointer to the column data. The obLength member of
the DBBINDING structure contains the offset, in bytes, to
the column data.
*/
pColumn = (DBCOLUMNDATA*)(pData +
rgBind[ulCurrentCol].obLength);

// Only print columns that have a column name.


if(pDBColumnInfo[ulCurrentCol].pwszName)
{
// Print the column name.
wprintf(pDBColumnInfo[ulCurrentCol].pwszName);
wprintf(L": ");

// Print the column data.


switch(pColumn->dwStatus)
{
case DBSTATUS_S_ISNULL:
wprintf(L"<NULL>");
break;

case DBSTATUS_S_OK:
case DBSTATUS_S_TRUNCATED:
if((LPWSTR)pColumn->bData)
{
wprintf((LPWSTR)pColumn->bData);
}
else
{
wprintf(L"<no data>");
}
break;

case DBSTATUS_E_CANTCONVERTVALUE:
wprintf(L"<cannot convert value>");
break;

default:
wprintf(L"<unknown>");
break;
}

wprintf(L"\n");
}
}

wprintf(L"\n");
}

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Pesquisando dados binários
Artigo • 03/06/2023

Embora o recurso de pesquisa ADSI dê suporte apenas à pesquisa de dados de cadeia


de caracteres, é possível pesquisar dados binários. Para fazer isso, use a função
ADsEncodeBinaryData para converter os dados binários em uma cadeia de caracteres
que pode ser usada com os métodos de pesquisa. Pesquisar dados binários é
particularmente útil ao pesquisar um GUID ou um SID porque esses tipos de dados são
armazenados como dados binários.

Ao usar a função ADsEncodeBinaryData , a memória alocada deve ser liberada usando


a função FreeADsMem .

O exemplo de código C++ a seguir mostra como criar uma cadeia de caracteres de
consulta para pesquisar um objeto que tenha um valor objectGUID específico.

C++

LPWSTR pwszGuid = NULL;


LPWSTR pwszFormat = L"(objectGUID=%s)";
LPWSTR pwszSearch = NULL;
hr = ADsEncodeBinaryData((LPBYTE)pguid, sizeof(GUID), &pwszGuid);
if(FAILED(hr))
{
goto cleanup;
}

pwszSearch = new WCHAR[lstrlenW(pwszFormat) + lstrlenW(pwszGuid) + 1];


if(NULL == pwszSearch)
{
goto cleanup;
}

swprintf_s(pwszSearch, pwszFormat, pwszGuid);

// Use pwszSearch to perform a query for the object.

cleanup:
if(pwszGuid)
{
FreeADsMem(pwszGuid);
}
if(pwszSearch)
{
delete pwszSearch;
}
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Consulta Distribuída
Artigo • 12/06/2023

Como o ADSI é um Provedor OLE DB, ele pode participar da Consulta Distribuída
introduzida no Microsoft SQL Server 7.0. Veja a seguir cenários possíveis:

Unir objetos do Active Directory com SQL Server dados.


Atualizando dados SQL de objetos do Active Directory.
Criando junções de três ou quatro vias com outros Provedores OLE DB. Por
exemplo, Servidor de Índice, SQL Server e Active Directory.

O Provedor OLE DB dá suporte a dois dialetos de comando, LDAP e SQL, para acessar o
serviço de diretório e retornar resultados em um formulário tabular que pode ser
consultado com SQL Server consultas distribuídas.

Para iniciar o Analisador de Consulta SQL

1. Primeiro, abra o Analisador de Consulta SQL no SQL Server vinculado ao serviço


de diretório (consulte Criando um servidor vinculado).
2. Executar o Analisador de Consulta SQL (Iniciar | Programas | Microsoft SQL Server
7.0)
3. Faça logon no computador SQL Server.
4. Insira a Consulta SQL no painel Editor da janela de consulta.
5. Execute a consulta pressionando F5.

As seções a seguir fornecem mais detalhes:

Criando um servidor vinculado


Criando um logon autenticado SQL Server
Consultando o serviço de diretório

Criando um servidor vinculado


Para configurar uma junção distribuída em um serviço de diretório do Windows 2000
Server, crie um servidor vinculado. Para fazer isso, configure o mapeamento ADSI
usando o procedimento armazenado do sistema sp_addlinkedserver . Este
procedimento vincula um nome a um nome de Provedor OLE DB.

No exemplo a seguir, observe que há vários argumentos usados com o procedimento


armazenado do sistema sp_addlinkedserver :

"ADSI" é o argumento do servidor e será o nome desse servidor vinculado.


"Active Directory Services 2.5" é o argumento srvproduct , que é o nome da fonte
de dados OLE DB que você está adicionando como um servidor vinculado.
"ADSDSOObject" é o argumento provider_name .
"adsdatasource" é o argumento data_source , que é o nome da fonte de dados,
conforme interpretado pelo Provedor OLE DB.

O comando EXEC é usado para executar procedimentos armazenados do sistema.

SQL

EXEC sp_addlinkedserver 'ADSI', 'Active Directory Services 2.5',


'ADSDSOObject', 'adsdatasource'
GO

Para logons autenticados pelo Windows, o mapeamento automático é suficiente para


acessar o diretório com SQL Server Delegação de Segurança. Como o mapeamento
automático é criado por padrão para servidores vinculados criados por meio de
sp_addlinkedserver , nenhum outro mapeamento de logon é necessário.

Para logons autenticados SQL Server, você pode configurar logons e senhas adequados
para se conectar ao serviço de diretório usando o procedimento armazenado do
sistema sp_addlinkedsrvlogin .

7 Observação

Quando possível, use a Autenticação do Windows.

Criando um logon autenticado SQL Server


Se você preferir usar um logon autenticado SQL Server em vez da Autenticação do
Windows, adicione um logon ao servidor vinculado (consulte a seção anterior). Para
fazer isso, use o procedimento armazenado do sistema sp_addlinkedsrvlogin .

No exemplo a seguir, há vários argumentos que são usados com o procedimento


armazenado do sistema sp_addlinkedsrvlogin :

"ADSI" é o argumento rmtsvrname , que é o nome do servidor vinculado criado no


exemplo anterior.
"Fabrikam\Administrator" é o argumento locallogin, que é o logon no servidor
local e pode ser o logon SQL Server ou um usuário Windows NT.
"CN=Administrator,OU=Sales,DC=activeds,DC=Fabrikam,DC=com" é o argumento
rmtuser , que é o nome de usuário que você usa para se conectar porque use-se é
false.
"secret**2000" é a rmtpassword, que é a senha associada ao rmtuser

O comando EXEC é usado para executar procedimentos armazenados do sistema.

SQL

EXEC sp_addlinkedsrvlogin 'ADSI', false, 'Fabrikam\Administrator',


'CN=Administrator,OU=Sales,DC=activeds,DC=Fabrikam,DC=com', 'secret**2000'

Consultando o serviço de diretório


Depois de criar um servidor vinculado, use uma instrução OPENQUERY para enviar
uma consulta ao Serviço de Diretório. A consulta SQL a seguir cria uma tabela virtual
para manter os resultados da consulta usando a instrução CREATE VIEW . A exibição
criada é denominada "viewADContacts".

A primeira instrução SELECT define as informações que estão sendo consultadas do


serviço de diretório e as mapeia para uma coluna na tabela. Informações entre colchetes
indicam os dados que são colocados na tabela virtual. As informações que não estão
entre colchetes indicam os dados recuperados do serviço de diretório. Observe que as
informações que estão sendo recuperadas do serviço de diretório devem ser
referenciadas pelo nome de exibição LDAP.

A próxima instrução é a instrução OPENQUERY . Essa instrução tem dois argumentos:


ADSI, que é o nome do servidor vinculado que você criou e uma instrução de consulta.
A instrução query contém os seguintes itens:

A instrução SELECT contém a lista de dados que serão obtidos do serviço de


diretório. Você precisará usar o nome de exibição LDAP para indicar quais dados
você está procurando.
A instrução FROM contém o nome do servidor de diretório vinculado do qual
essas informações serão obtidas.
A instrução WHERE fornece as condições de pesquisa. Neste exemplo, ele está
procurando contatos.

A instrução SELECT final é usada para selecionar os resultados da exibição a ser


exibida.

SQL
CREATE VIEW viewADContacts
AS
SELECT [Name], sn [Last Name], street [Street], l [City], st [State]
FROM OPENQUERY( ADSI,
'SELECT name, sn, street, l, st
FROM 'LDAP:// OU=Sales,DC=activeds,DC=Fabrikam,DC=Com'
WHERE objectCategory='Person' AND
objectClass = 'contact'')
GO
SELECT * FROM viewADContacts

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Modelo de segurança ADSI
Artigo • 03/06/2023

O ADSI fornece interfaces para impor a autenticação do usuário e o controle de acesso


em objetos de serviço de diretório.

Esta seção descreve os tópicos a seguir.

Autenticação
Descritores de segurança em arquivos e chaves do registro

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Autenticação (ADSI)
Artigo • 03/06/2023

No ADSI, as credenciais que consistem em um nome de usuário e senha são usadas


para fornecer ou restringir o acesso a objetos no serviço de diretório. A função
ADsGetObject usa as credenciais do thread de chamada para autenticação. A função
ADsOpenObject e o método IADsOpenDSObject::OpenDSObject podem ser usados
para especificar credenciais diferentes daquelas do thread de chamada. Quando um
objeto é associado a um usuário autenticado, o usuário tem permissão para acessar o
objeto conforme suportado pelos requisitos de segurança do serviço de diretório
subjacente.

7 Observação

A função ADsOpenObject e o método IADsOpenDSObject::OpenDSObject não


devem ser usados para validar as credenciais do usuário.

O exemplo de código a seguir mostra como usar o método OpenDSObject para


autenticar um usuário.

VB

Dim MyNamespace As IADsOpenDSObject


Dim X
oUsername="MyUserName"
oPassword="MyPassword"

OnError GoTo CleanuUp

Set MyNamespace = GetObject("LDAP:")

' For authentication, pass a variable for the user name and password to be
used for
' authentication. For security reasons, it is recommended that you use the
ADS_SECURE_AUTHENTICATION flag.
'
Set X = MyNamespace.OpenDSObject(DN, oUserName, oPassword,
ADS_SECURE_AUTHENTICATION)

CleanUp:
MsgBox ("An error has occurred.")
Set MyNamespace = Nothing
Set X = Nothing
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Problemas de autenticação para ADSI
com ASP
Artigo • 03/06/2023

Dependendo da configuração da intranet, os problemas de autenticação podem ocorrer


quando o código ADSI é executado em uma página ASP.

A autenticação para acessar o controlador de domínio pode ser fornecida usando a


delegação. A delegação permite que um serviço atue como usuário, para que ele possa
acessar um recurso de rede usando essas credenciais de usuário. Se a intranet seguir
essa configuração, você deverá configurar o IIS para usar a delegação. Defina o
mecanismo de Autenticação do IIS como Anônimo ou NTLM. Se você escolher anônimo,
seu contexto de segurança será mapeado para IUSR_MACHINE conta. Se você selecionar
NTLM, o contexto de segurança será alterado, dependendo de qual usuário faz logon
em seu site.

Se você estiver usando um servidor IIS que usa o desafio/resposta NT ou um cliente do


navegador que não dá suporte ao Kerberos, não há suporte para autenticação de salto
duplo. A autenticação de salto duplo significa que as credenciais do usuário são
passadas do cliente do navegador para o servidor IIS e, em seguida, o servidor IIS passa
as credenciais para o servidor de back-end. Nessa situação, você pode usar uma das
seguintes soluções para permitir o acesso ao diretório na página ASP:

Use IADsOpenDSObject::OpenDSObject ou ADsOpenObject para passar


credenciais para o Active Directory. A página da Web autentica o usuário
conectado no servidor do IIS. Quando o usuário for autenticado, a página da Web
poderá usar OpenDSObject ou ADsOpenObject para passar um nome de usuário e
senha para o serviço de diretório para obter autenticação para o servidor de back-
end. A página da Web pode acessar dados do diretório.
Adicione seu código a um objeto COM e coloque esse objeto em um aplicativo
COM+ (anteriormente chamado de pacote MTS). Em seguida, o aplicativo COM+
pode ser executado como uma conta de usuário de domínio.
Use várias páginas ASP, em que uma página autentica o cliente e outra página
passa credenciais para o diretório usando a autenticação anônima em uma conta
de usuário de domínio.

Esses métodos envolvem a autenticação do cliente Web e, em seguida, a alteração das


credenciais ao entrar em contato com o diretório porque a autenticação de salto duplo,
com as mesmas credenciais, não é possível.
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Descritores de segurança em arquivos e
chaves do Registro
Artigo • 12/06/2023

As ADSI (Interfaces de Serviço do Active Directory) podem ser usadas para gerenciar e
proteger sistemas de arquivos em uma organização, incluindo a capacidade de definir
ou modificar ACLs em arquivos ou compartilhamentos de arquivos criados por usuários.
Interfaces de segurança, como IADsSecurityDescriptor, IADsAccessControlList e
IADsAccessControlEntry definem ACLs no Active Directory, Exchange, arquivo,
compartilhamento de arquivos ou objetos de chave do Registro. Antes de usar essas
interfaces, o descritor de segurança poderá precisar ser modificado se usar um formato
diferente da interface ou se você não tiver direitos de acesso à SACL do descritor de
segurança porque você não é membro do grupo de administradores de segurança.

Para obter, definir ou modificar o descritor de segurança, use a interface


IADsSecurityUtility . Essa interface permite que você recupere um descritor de
segurança de vários recursos em seu formato original, como o formato ADSI
IADsSecurityDescriptor, um descritor de segurança bruto ou como uma cadeia de
caracteres hexadecimal, conforme usado no Exchange 5.5. Quando recuperado, você
pode convertê-lo em outro formato, por exemplo, de um descritor de segurança bruto
para IADsSecurityDescriptor. Em seguida, você pode gravar o novo formato de volta no
recurso.

Alguns dos valores da propriedade IADsAccessControlEntry , como AccessMask e


AceFlags, serão diferentes para diferentes tipos de objeto. Por exemplo, um objeto do
Active Directory usará o membro ADS_RIGHT_GENERIC_READ da enumeração
ADS_RIGHTS_ENUM para a propriedade IADsAccessControlEntry.AccessMask , mas o
direito de acesso equivalente para um objeto de arquivo é FILE_GENERIC_READ. Não é
seguro assumir que todos os valores de propriedade serão iguais para objetos do Active
Directory e objetos que não são do Active Directory. A lista a seguir mostra as
propriedades IADsAccessControlEntry que diferem para objetos que não são do Active
Directory e onde os valores adequados podem ser obtidos.

Accessmask

Para obter mais informações e uma lista de valores possíveis para objetos de
compartilhamento de arquivo ou arquivo, consulte Segurança de arquivo e direitos de
acesso.

Para obter mais informações e uma lista de valores possíveis para objetos do Registro,
consulte Segurança de Chave do Registro e Direitos de Acesso.
Acetype

Para obter mais informações, consulte o membro AceType da estrutura ACE_HEADER .

Aceflags

Para obter mais informações, consulte o membro AceFlags da estrutura ACE_HEADER .

Sinalizadores

Contém zero ou uma combinação de um ou mais dos valores a seguir de WinNT.h.

ACE_OBJECT_TYPE_PRESENT (1)

ObjectType contém um valor válido.

ACE_INHERITED_OBJECT_TYPE_PRESENT (2)

InheritedObjectType contém um valor válido.

Objecttype

Para obter mais informações, consulte o membro ObjectType do


ACCESS_DENIED_OBJECT_ACE, ACCESS_ALLOWED_OBJECT_ACE e estruturas
semelhantes. Essa propriedade não deve ser definida ou modificada para objetos que
não são do Active Directory.

Inheritedobjecttype

Para obter mais informações, consulte o membro InheritedObjectType do


ACCESS_DENIED_OBJECT_ACE, ACCESS_ALLOWED_OBJECT_ACE e estruturas
semelhantes. Essa propriedade não deve ser definida ou modificada para objetos que
não são do Active Directory.

Normalmente, IADsSecurityUtility.GetSecurityDescriptor recuperará todas as partes do


descritor de segurança, como proprietário, grupo, SACL ou DACL. Da mesma forma,
IADsSecurityUtility.SetSecurityDescriptor substituirá todas as partes do descritor de
segurança por padrão. Você pode usar a propriedade IADsSecurityUtility.SecurityMask
para especificar partes individuais do descritor de segurança a serem recuperadas ou
definidas. Por exemplo, você pode definir SecurityMask como
ADS_SECURITY_INFO_DACL antes de chamar GetSecurityDescriptor para recuperar
apenas a DACL sem recuperar as outras partes do descritor de segurança.

Para obter mais informações e um exemplo de código que usa a interface


IADsSecurityUtility para adicionar uma ACE a um arquivo, consulte Código de exemplo
para adicionar uma ACE a um arquivo.
O código de exemplo a seguir fornece os identificadores constantes para objetos de
arquivo, compartilhamento de arquivo e registro para as propriedades AccessMask,
AceType, AceFlags e Flags para uso com o Visual Basic e o Microsoft Visual Basic
Scripting Edition.

VB

' Identifiers for the IADsAccessControlEntry.AccessMask property for file,


' file share, and registry objects.
Const DELETE = &H10000
Const READ_CONTROL = &H20000
Const WRITE_DAC = &H40000
Const WRITE_OWNER = &H80000
Const SYNCHRONIZE = &H100000

Const STANDARD_RIGHTS_REQUIRED = &HF0000

Const STANDARD_RIGHTS_READ = &H20000


Const STANDARD_RIGHTS_WRITE = &H20000
Const STANDARD_RIGHTS_EXECUTE = &H20000

Const STANDARD_RIGHTS_ALL = &H1F0000

Const SPECIFIC_RIGHTS_ALL = &HFFFF

' Identifiers for the IADsAccessControlEntry.AccessMask property for file


and
' file share objects.
Const FILE_READ_DATA = &H1 ' file & pipe
Const FILE_LIST_DIRECTORY = &H1 ' directory

Const FILE_WRITE_DATA = &H2 ' file & pipe


Const FILE_ADD_FILE = &H2 ' directory

Const FILE_APPEND_DATA = &H4 ' file


Const FILE_ADD_SUBDIRECTORY = &H4 ' directory
Const FILE_CREATE_PIPE_INSTANCE = &H4 ' named pipe

Const FILE_READ_EA = &H8 ' file & directory

Const FILE_WRITE_EA = &H10 ' file & directory

Const FILE_EXECUTE = &H20 ' file


Const FILE_TRAVERSE = &H20 ' directory

Const FILE_DELETE_CHILD = &H40 ' directory

Const FILE_READ_ATTRIBUTES = &H80 ' all

Const FILE_WRITE_ATTRIBUTES = &H100 ' all

Const FILE_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &H1FF


Const FILE_GENERIC_READ = STANDARD_RIGHTS_READ Or FILE_READ_DATA Or
FILE_READ_ATTRIBUTES Or _
FILE_READ_EA Or SYNCHRONIZE

Const FILE_GENERIC_WRITE = STANDARD_RIGHTS_WRITE Or FILE_WRITE_DATA Or


FILE_WRITE_ATTRIBUTES Or _
FILE_WRITE_EA Or FILE_APPEND_DATA Or SYNCHRONIZE

Const FILE_GENERIC_EXECUTE = STANDARD_RIGHTS_EXECUTE Or FILE_READ_ATTRIBUTES


Or FILE_EXECUTE Or SYNCHRONIZE

' Identifiers for the IADsAccessControlEntry.AccessMask property for


registry
' objects.
Const KEY_QUERY_VALUE = &H1
Const KEY_SET_VALUE = &H2
Const KEY_CREATE_SUB_KEY = &H4
Const KEY_ENUMERATE_SUB_KEYS = &H8
Const KEY_NOTIFY = &H10
Const KEY_CREATE_LINK = &H20
Const KEY_WOW64_32KEY = &H200
Const KEY_WOW64_64KEY = &H100
Const KEY_WOW64_RES = &H300

Const KEY_READ = ((STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or


KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY) And _
(Not SYNCHRONIZE))

Const KEY_WRITE = ((STANDARD_RIGHTS_WRITE Or KEY_SET_VALUE Or


KEY_CREATE_SUB_KEY) And (Not SYNCHRONIZE))

Const KEY_EXECUTE = ((KEY_READ) And (Not SYNCHRONIZE))

Const KEY_ALL_ACCESS = ((STANDARD_RIGHTS_ALL Or KEY_QUERY_VALUE Or


KEY_SET_VALUE Or KEY_CREATE_SUB_KEY Or _
KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY Or
KEY_CREATE_LINK) And (Not SYNCHRONIZE))

' Identifiers for the IADsAccessControlEntry.AceFlags property for file and


' file share objects.
Const OBJECT_INHERIT_ACE = &H1
Const CONTAINER_INHERIT_ACE = &H2
Const NO_PROPAGATE_INHERIT_ACE = &H4
Const INHERIT_ONLY_ACE = &H8
Const INHERITED_ACE = &H10

' Identifiers for the IADsAccessControlEntry.Flags property.


Const ACE_OBJECT_TYPE_PRESENT = 1
Const ACE_INHERITED_OBJECT_TYPE_PRESENT = 2
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Código de exemplo para adicionar um
ACE a um arquivo
Artigo • 13/06/2023

O exemplo de código a seguir mostra como usar a interface IADsSecurityUtility para


adicionar uma ACE a um arquivo.

VB

' Define constants:


'

'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'
' Define the ADS_RIGHTS_ENUM values.
'
Const ADS_RIGHT_DELETE = &H10000
Const ADS_RIGHT_READ_CONTROL = &H20000
Const ADS_RIGHT_WRITE_DAC = &H40000
Const ADS_RIGHT_WRITE_OWNER = &H80000
Const ADS_RIGHT_SYNCHRONIZE = &H100000
Const ADS_RIGHT_ACCESS_SYSTEM_SECURITY = &H1000000
Const ADS_RIGHT_GENERIC_READ = &H80000000
Const ADS_RIGHT_GENERIC_WRITE = &H40000000
Const ADS_RIGHT_GENERIC_EXECUTE = &H20000000
Const ADS_RIGHT_GENERIC_ALL = &H10000000
Const ADS_RIGHT_DS_CREATE_CHILD = &H1
Const ADS_RIGHT_DS_DELETE_CHILD = &H2
Const ADS_RIGHT_ACTRL_DS_LIST = &H4
Const ADS_RIGHT_DS_SELF = &H8
Const ADS_RIGHT_DS_READ_PROP = &H10
Const ADS_RIGHT_DS_WRITE_PROP = &H20
Const ADS_RIGHT_DS_DELETE_TREE = &H40
Const ADS_RIGHT_DS_LIST_OBJECT = &H80
Const ADS_RIGHT_DS_CONTROL_ACCESS = &H100
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'
' Ace Type definitions
'
Const ADS_ACETYPE_ACCESS_ALLOWED = 0
Const ADS_ACETYPE_ACCESS_DENIED = &H1
Const ADS_ACETYPE_SYSTEM_AUDIT = &H2
Const ADS_ACETYPE_ACCESS_ALLOWED_OBJECT = &H5
Const ADS_ACETYPE_ACCESS_DENIED_OBJECT = &H6
Const ADS_ACETYPE_SYSTEM_AUDIT_OBJECT = &H7
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'
' Ace Flag Constants
'
Const ADS_ACEFLAG_UNKNOWN = &H1
Const ADS_ACEFLAG_INHERIT_ACE = &H2
Const ADS_ACEFLAG_NO_PROPAGATE_INHERIT_ACE = &H4
Const ADS_ACEFLAG_INHERIT_ONLY_ACE = &H8
Const ADS_ACEFLAG_INHERITED_ACE = &H10
Const ADS_ACEFLAG_VALID_INHERIT_FLAGS = &H1F
Const ADS_ACEFLAG_SUCCESSFUL_ACCESS = &H40
Const ADS_ACEFLAG_FAILED_ACCESS = &H80
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'
' Flags constants for AD objects
'
Const ADS_FLAG_OBJECT_TYPE_PRESENT = &H1
Const ADS_FLAG_INHERITED_OBJECT_TYPE_PRESENT = &H2
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'
' From Winnt.h
'---------------------------------------------------------------------------
---
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' File Specific Access Rights
'
Const DELETE = &H10000
Const READ_CONTROL = &H20000
Const WRITE_DAC = &H40000
Const WRITE_OWNER = &H80000
Const SYNCHRONIZE = &H100000

Const STANDARD_RIGHTS_REQUIRED = &HF0000

Const STANDARD_RIGHTS_READ = READ_CONTROL


Const STANDARD_RIGHTS_WRITE = READ_CONTROL
Const STANDARD_RIGHTS_EXECUTE = READ_CONTROL

Const STANDARD_RIGHTS_ALL = &H1F0000

Const SPECIFIC_RIGHTS_ALL = &HFFFF

'
' AccessSystemAcl access type
'

Const ACCESS_SYSTEM_SECURITY = &H1000000

'
' MaximumAllowed access type
'

Const MAXIMUM_ALLOWED = &H2000000

'
' These are the generic rights
'

Const GENERIC_READ = &H80000000


Const GENERIC_WRITE = &H40000000
Const GENERIC_EXECUTE = &H20000000
Const GENERIC_ALL = &H10000000

'
' AccessMask constants for FILE ACEs
'
Const FILE_READ_DATA = &H1 ' file & pipe
Const FILE_LIST_DIRECTORY = &H1 ' directory

Const FILE_WRITE_DATA = &H2 ' file & pipe


Const FILE_ADD_FILE = &H2 ' directory

Const FILE_APPEND_DATA = &H4 ' file


Const FILE_ADD_SUBDIRECTORY = &H4 ' directory
Const FILE_CREATE_PIPE_INSTANCE = &H4 ' named pipe

Const FILE_READ_EA = &H8 ' file & directory

Const FILE_WRITE_EA = &H10 ' file & directory

Const FILE_EXECUTE = &H20 ' file


Const FILE_TRAVERSE = &H20 ' directory

Const FILE_DELETE_CHILD = &H40 ' directory

Const FILE_READ_ATTRIBUTES = &H80 ' all

Const FILE_WRITE_ATTRIBUTES = &H100 ' all

Const FILE_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &H1FF

Const FILE_GENERIC_READ = STANDARD_RIGHTS_READ Or _


FILE_READ_DATA Or _
FILE_READ_ATTRIBUTES Or _
FILE_READ_EA Or _
SYNCHRONIZE

Const FILE_GENERIC_WRITE = STANDARD_RIGHTS_WRITE Or _


FILE_WRITE_DATA Or _
FILE_WRITE_ATTRIBUTES Or _
FILE_WRITE_EA Or _
FILE_APPEND_DATA Or _
SYNCHRONIZE

Const FILE_GENERIC_EXECUTE = STANDARD_RIGHTS_EXECUTE Or _


FILE_READ_ATTRIBUTES Or _
FILE_EXECUTE Or _
SYNCHRONIZE

Const FILE_SHARE_READ = &H1


Const FILE_SHARE_WRITE = &H2
Const FILE_SHARE_DELETE = &H4
'
' AceFlags values for files
'
Const OBJECT_INHERIT_ACE = &H1
Const CONTAINER_INHERIT_ACE = &H2
Const NO_PROPAGATE_INHERIT_ACE = &H4
Const INHERIT_ONLY_ACE = &H8
Const INHERITED_ACE = &H10

'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'
'<<<<<<<<<<<<<<<<<<<<<<<<< BEGIN IADsSecurityUtility Constants >>>>>>>>>>>>
'
'
' ADS_PATHTYPE_ENUM
'
Const ADS_PATH_FILE = 1
Const ADS_PATH_FILESHARE = 2
Const ADS_PATH_REGISTRY = 3
'
' ADS_SD_FORMAT_ENUM
'
Const ADS_SD_FORMAT_IID = 1
Const ADS_SD_FORMAT_RAW = 2
Const ADS_SD_FORMAT_HEXSTRING = 3
'
'<<<<<<<<<<<<<<<< END IADsSecurityUtility Constants >>>>>>>>>>>>>>>>>>>>>
'

'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'
' AddACEToFile
'
' Adds an ACE to the specified file or folder that grants the trustee
' modify rights on the file.
'
Public Sub AddACEToFile(File As String, Trustee As String)
Dim oAce As AccessControlEntry ' variable for the new ACE
Dim oSD As SecurityDescriptor ' variable for the Security Descriptor
of the object
Dim oDacl As AccessControlList ' variable for the DACL of the object
Dim oADsSecurityUtility As ADsSecurityUtility
'
' Create an ADsSecurityUtlity object.
'
Set oADsSecurityUtility = CreateObject("ADsSecurityUtility")
'
' Get the Security Descriptor for the given NTFS File path.
'
Set oSD = oADsSecurityUtility.GetSecurityDescriptor(File, ADS_PATH_FILE,
ADS_SD_FORMAT_IID)
'
' Get the discretionary ACL for the key.
'
Set oDacl = oSD.DiscretionaryAcl
'
' Create an ACE object.
'
Set oAce = CreateObject("AccessControlEntry")
'
' Set the IADsAccessControlEntry::Trustee attribute.
'
oAce.Trustee = Trustee
'
' Set the IADsAccessControlEntry::AccessMask attribute.
'
oAce.AccessMask = FILE_GENERIC_READ Or _
FILE_GENERIC_WRITE Or _
FILE_GENERIC_EXECUTE Or _
DELETE
'
' Set the IADsAccessControlEntry::AceType attribute.
'
oAce.AceType = ADS_ACETYPE_ACCESS_ALLOWED
'
' Set the IADsAccessControlEntry::AceFlags attribute.
'
oAce.AceFlags = OBJECT_INHERIT_ACE Or _
CONTAINER_INHERIT_ACE
'
' Place the ACE on the DACL.
'
oDacl.AddACE oAce
'
' Place the DACL back onto the SD.
'
oSD.DiscretionaryAcl = oDacl
'
' Place the SD back onto the file.
'
oADsSecurityUtility.SetSecurityDescriptor File, ADS_PATH_FILE, oSD,
ADS_SD_FORMAT_IID
'
' Cleanup.
'
Set oAce = Nothing
Set oDacl = Nothing
Set oSD = Nothing
Set oADsSecurityUtility = Nothing
End Sub

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Extensões ADSI
Artigo • 13/06/2023

Uma extensão ADSI é um objeto COM especial que permite que um desenvolvedor
estenda um objeto ADSI. Cada extensão é associada a uma classe especificada no
diretório . Com esse modelo de extensão, os desenvolvedores podem adicionar
métodos para dar um significado mais dinâmico a um objeto. Em um modelo de
programação de diretório tradicional, um objeto é acessado obtendo e definindo os
atributos de objeto. Usando extensões ADSI, você pode adicionar mais recursos a um
objeto de diretório.

Esta seção discute os seguintes tópicos:

Benefícios do uso de extensões ADSI


Arquitetura de extensão ADSI
Como o ADSI integra extensões
O que um cliente vê?
Obtendo interfaces ADSI de sua extensão
Bibliotecas de tipos de extensão ADSI
Suporte de associação antecipada
Suporte à associação tardia
IADsExtension Interface
Suporte a interfaces duplas ou de expedição
Revisitando regras de agregação COM com extensões ADSI
Resolução de vários componentes de agregação que dão suporte à mesma
interface
Resolução de conflitos de nome de função/propriedade na automação em
extensões

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Benefícios do uso de extensões ADSI
Artigo • 03/06/2023

A maneira como os métodos de extensão são implementados depende do gravador de


extensão. Um gravador de extensão pode até mesmo implementar um método
completamente fora do escopo do diretório. Por exemplo, um desenvolvedor de planos
de software de backup e restauração para estender um objeto chamado computador. O
desenvolvedor deve criar dois métodos: BackUp e Restore. Esses métodos operam
remotamente no computador físico para o qual o objeto do computador no diretório
aponta. Atuando como uma extensão, o componente acessa a infraestrutura ADSI e é
exibido pelos clientes ADSI como parte integrante do objeto.

Os seguintes cenários descrevem situações em que a criação de uma extensão para


ADSI seria vantajosa:

Crie uma extensão para integrar um componente ao objeto de diretório. Como há


um objeto de usuário no diretório, um desenvolvedor de RH pode querer criar
uma extensão ADSI que popula outros dados no diretório quando um usuário é
criado.

Crie uma extensão se um componente exigir uma pesquisa de diretório. Um


componente pode exigir um diretório como ponto de partida para uma pesquisa.
Por exemplo, ao criar um novo aplicativo. Um objeto de aplicativo, ToolApp, pode
ser publicado no diretório. Seu aplicativo pode dar suporte a notificações de status
em uma coleção de servidores de email. Você decide tornar esse aplicativo uma
extensão ADSI.

Agora, um usuário pode pesquisar todas as instâncias do ToolApp no diretório.


Para cada objeto retornado, o usuário pode emitir uma chamada para
NotifyNow(). Um aplicativo ou extensão pode obter mais dados de objeto atuais
no diretório e notificar cada servidor de forma assíncrona.

Crie uma extensão como uma junção entre namespaces e modelos de


programação. Por exemplo, um ISV inventa um novo modelo de objeto para
serviços de impressão. O objeto printQueue já está definido no diretório. O ISV
pode criar uma extensão ADSI e associá-la ao objeto printQueue . Os usuários
ADSI podem associar a um objeto printQueue e começar a usar o modelo de
objeto para o ISV. Na perspectiva do cliente ADSI, esse ponto de junção é
transparente.

Crie uma extensão para simplificar tarefas. Muitas tarefas no diretório podem ser
realizadas pesquisando e definindo vários atributos em um objeto ou vários
objetos. Ao criar uma única função para manipular vários atributos, ela simplifica o
desenvolvimento para gravadores de aplicativos e scripts.

Para clientes ADSI, as extensões enriquecem o ambiente de programação ADSI de várias


maneiras:

Os desenvolvedores que criam clientes ADSI não precisam aprender um novo


modelo de programação. As extensões fazem parte do ADSI. Eles usariam o
mesmo paradigma para pesquisa, manipulação de dados e proteção de objetos.
Os administradores podem gerenciar aplicativos habilitados para diretório
relacionados usando extensões.
Os consumidores de extensão podem exibir um objeto ADSI e uma extensão como
um objeto integrado.
Os componentes existentes podem ser integrados ao ADSI, o que permite que as
extensões aproveitem os investimentos existentes e criem sinergia entre
componentes.

As extensões ADSI foram projetadas com os seguintes objetivos:

Fácil de implementar. Com as tecnologias atuais da Microsoft, Microsoft Visual


C++ sistema de desenvolvimento e a Biblioteca de Modelos Ativos, uma extensão
pode ser criada rapidamente.
Os clientes exibem uma IDispatch. Na perspectiva dos gravadores de script e
automação, os métodos de extensão e as propriedades são misturados de forma
transparente em um objeto ADSI.
Independente. Os gravadores de extensão podem estender o ADSI de forma
independente sem conhecimento prévio das extensões existentes.

Considere este cenário: um desenvolvedor corporativo ou um ISV precisa desenvolver


um programa de backup. Esse aplicativo de backup permite que um administrador faça
backup de todos os computadores em uma unidade organizacional. Com uma extensão
ADSI, o script a seguir é possível.

VB

Dim ou
On Error Resume Next
Set ou = GetObject("LDAP://OU=Sales, DC=Fabrikam, DC=COM")
If Err.Number<>0 Then
MsgBox("An error has occurred.")
Err.Clear
Set ou = Nothing
Exit Sub
End If

ou.Filter = Array("computer")
For each comp in ou
Debug.Print comp.Get("networkAddress")
Debug.Print comp.LastBackUp
comp.BackUpNow
Next

LastBackUp é uma propriedade e BackUpNow é um método que o gravador de


extensão fornece. O código mostra os benefícios para consumidores de extensão e
provedores. O gravador de extensão não precisa criar uma nova maneira de filtrar,
pesquisar e acessar o diretório. O consumidor de extensão não precisa reaprender um
novo paradigma de programação. Novos métodos e propriedades que o gravador de
extensão fornece são exibidos como parte do ADSI.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Arquitetura de extensão ADSI
Artigo • 13/06/2023

As extensões ADSI são baseadas no modelo de agregação COM com vários


aprimoramentos. As extensões devem aderir a todas as regras COM. Para obter mais
informações, consulte a especificação COM.

Aqui está uma revisão do modelo de agregação COM.

Uma agregação, também conhecida como objeto interno, é um objeto que um


agregador cria. Seu objeto de extensão é uma agregação.

Um agregador, também conhecido como objeto externo, é um objeto que cria uma
agregação. ADSI é um agregador.

O objeto interno delega seu IUnknown ao IUnknown do agregador.

As extensões ADSI adicionam os seguintes aprimoramentos à agregação COM para


atender aos seus requisitos:

Permite que cada gravador de extensão estenda objetos ADSI. Um gravador de


extensão pode registrar sua extensão com ADSI e não ser afetado pela existência
de outras extensões. No modelo de agregação COM, o agregador deve ter o CLSID
da agregação. O ADSI flexibiliza esse requisito fazendo-se agir como o agregador
de todas as extensões. Portanto, em vez de formar uma camada de componentes
aninhados, as extensões estão no mesmo nível.
Permite um objeto, um IDispatch. O suporte à automação é um dos recursos mais
importantes do ADSI. O suporte à automação é obtido porque o ADSI dá suporte à
interface IDispatch . Os gravadores de extensão são incentivados a dar suporte à
interface IDispatch . No entanto, deve haver apenas uma interface IDispatch em
um determinado objeto. O ADSI integra e coleta as várias interfaces IDispatch de
diferentes extensões e as apresenta como um IDispatch consistente para o
controlador de Automação. Cada extensão, quando agregada, deve rotear
novamente suas chamadas IDispatch para o IDispatch fornecido pelo ADSI.

Todas essas soluções são possíveis devido aos serviços fornecidos pelo Gerenciador de
Objetos ADSI, que residem em cada provedor ADSI.

A figura a seguir mostra a arquitetura do Modelo de Extensão ADSI.

O ADSI dá suporte a dois níveis de extensão:

Suporte de associação antecipada. Este é o primeiro nível de extensão. Uma


extensão deve dar suporte ao registro e implementar novas interfaces. Os
consumidores de extensão devem usar ferramentas ou hosts de script que dão
suporte à associação antecipada, por exemplo, Visual C++ , Visual Basic.
Suporte à associação tardia. Isso acontece quando uma extensão atende a todos
os requisitos de associação antecipada e implementa uma interface adicional,
IADsExtension. Os implementadores de extensão podem usar qualquer ferramenta
que opere como um controlador de Automação, como o Host de Script do
Windows, Páginas do Servidor Ativo ou HTML com VBScript.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Como o ADSI integra extensões
Artigo • 13/06/2023

As diretrizes a seguir descrevem como o ADSI interage com extensões:

Algo se associa a um objeto de diretório ADSI. Por exemplo,


"LDAP://CN=JeffSmith,OU=Sales,DC=Fabrikam,DC=COM".
ADSI identifica que o objeto está na classe de usuário .
O ADSI executa uma pesquisa no registro e identifica a extensão CLSIDs para o
usuário. Lembre-se de que o ADSI armazena esses dados em cache.
Algo chama o método QueryInterface para IID_IMyExtension. O ADSI pesquisa as
interfaces associadas ao objeto de usuário , começando com suas próprias
interfaces e examinando as interfaces de extensão.
Se uma correspondência for encontrada, ADSI criará uma instância do
componente que dá suporte a IID_IMyExtension e chamará QueryInterface para a
extensão. A interface resultante é retornada.
O usuário usa essa interface para chamar os métodos de interface.
Em seguida, o cliente chama QueryInterface para IID_IYourExtension, que está em
um componente diferente. Esse componente delega essa chamada QueryInterface
para a interface IUnknown do agregador, que por acaso é o próprio ADSI.
Novamente, o ADSI pesquisa as interfaces e cria a instância do componente.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


O que um cliente vê?
Artigo • 13/06/2023

Um cliente vê ADSI e todos os seus objetos de extensão como um objeto.


Um cliente ADSI vê uma interface IDispatch que manipula todas as interfaces
duplas e de expedição no objeto, independentemente de a interface dupla ou de
expedição ser implementada pelo agregador no provedor ou por uma extensão.
Consulte Resolução de conflitos de nome de função/propriedade na Automação
em Extensões.
O ADSI não expõe informações de tipo por meio dos métodos
IDispatch::GetTypeInfo ou IDispatch::GetTypeInfoCount . O ADSI fornece
informações de tipo por meio da biblioteca de tipos.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Obtendo interfaces ADSI de sua
extensão
Artigo • 13/06/2023

Uma extensão geralmente precisa obter dados do objeto de diretório ao qual ela se
associa. Por exemplo, uma extensão para um objeto de computador pode querer obter
o dnsHostName do objeto atual do diretório. Isso pode ser facilmente obtido emitindo
uma chamada QueryInterface na interface IUnknown para o agregador.

C++

HRESULT hr;
IADs *pADs; ' ADSI Interface to get/set attributes.

hr = m_pOuterUnk->QueryInterface(IID_IADs,(void**)&pADs);

if ( SUCCEEDED(hr) )
{
VARIANT var;
VariantInit(&var);
hr = pADs ->Get(_bstr_t("dnsHostName"), &var);
if ( SUCCEEDED(hr) )
{
printf("%S\n", V_BSTR(&var));
}
VariantClear(&var);
pADs->Release();
}

Você deve liberar a interface imediatamente após usá-la. Se a extensão tiver uma
referência aberta ao agregador, você criou uma referência circular e o agregador não
poderá liberar a extensão. Portanto, o agregador não pode ser liberado e o resultado
são vazamentos de memória em seu aplicativo.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Bibliotecas de tipos de extensão ADSI
Artigo • 13/06/2023

As bibliotecas de tipos para extensões não são mescladas. Os clientes ADSI devem
incluir especificamente a biblioteca de tipos para cada extensão. A biblioteca de tipos é
necessária para que o Visual Basic habilite as associações iniciais. Os aplicativos cliente
escritos em C/C++ podem chamar o método QueryInterface nas interfaces de extensão
definidas nos arquivos de cabeçalho da extensão.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Suporte de associação antecipada
Artigo • 12/06/2023

O exemplo de código a seguir apresenta um cenário com suporte de associação


antecipada em vigor.

VB

Dim x as IADsUser
Dim y as IADsExt1
Dim z as IADsExt2

Set x = GetObject("LDAP://CN=JeffSmith, OU=Sales,


DC=Fabrikam,DC=COM")
x.SetPassword("newPassword")

Set y = x
y.MyNewMethod( "\\srv\public")
y.MyProperty = "Hello World"

Set z = y
z.OtherMethod()
z.OtherProperty = 4362

Debug.Print x.LastName

Set z = GetObject("LDAP://CN=Jeff,OU=Engr,
DC=Fabrikam,DC=COM")
z.OtherProperty = 5323

Neste exemplo de código, dois componentes de extensão estendem um objeto de


usuário . Cada extensão publica sua própria interface. Cada extensão não reconhece a
outra interface de extensão; apenas ADSI reconhece a existência de ambas as extensões.
Cada extensão delega seu IUnknown para ADSI. ADSI atua como um agregador para
ambas as extensões e quaisquer outras extensões futuras. Consultar uma interface de
qualquer extensão ou de ADSI gera o mesmo resultado consistente.

O procedimento a seguir descreve como criar uma extensão.

Etapa 1: Adicionar agregação ao componente


Siga a especificação COM para adicionar agregação ao componente. Em resumo, você
deve aceitar as solicitações pUnknown ao componente durante CreateInstance e
delegar o pUnknown ao IUnknown do agregador se o componente for agregado.
Etapa 2: registrar sua extensão
Agora você deve decidir qual classe de diretório estender. Você não pode usar as
mesmas interfaces para fazer isso que usaria para uma interface ADSI, por exemplo,
IADsUser, IADsComputer. Os objetos de diretório são mantidos no diretório, enquanto
sua extensão e ADSI estão em execução no computador cliente. Os exemplos de objeto
de diretório são user, computer, printQueue, serviceConnectionPoint e nTDSService.
Você também pode adicionar uma nova classe no Active Directory e criar uma nova
extensão para essa nova classe.

Você usa chaves do Registro para associar um nome de classe de diretório aos
componentes de extensão ADSI. A figura a seguir representa o layout do Registro
existente, bem como novas chaves.

Uma nova chave, chamada Extensões, contém uma lista de chaves, cada uma
representando uma classe no diretório. Cada classe, por exemplo, usuário,
printQueue ou computador, mantém uma lista de subchaves.
Cada subchave contém o CLSID do componente de extensão ADSI.
Cada subchave CLSID contém uma entrada de cadeia de caracteres que permite
vários valores. Você só deve listar as interfaces que participam da agregação.

7 Observação

Objetos de extensão ainda são necessários para registrar chaves COM padrão.

HKEY_LOCAL_MACHINE
Software
Microsoft
ADS
Providers
LDAP
Extensions
ClassNameA
CLSID of ExtensionA1
Interfaces = List of interfaces
CLSID of ExtensionA2
Interfaces = List of interfaces
ClassNameB
CLSID of ExtensionB1
Interfaces = List of interfaces
CLSID of ExtensionB2
Interfaces = List of interfaces
Exemplo

HKEY_LOCAL_MACHINE
SOFTWARE
Microsoft
ADs
Providers
LDAP
Extensions
printQueue
{9f37f39c-6f49-11d1-8c18-00c04fd8d503}
Interfaces = {466841B0-E531-11d1-8718-
00C04FD44407}
{466841B1-E531-11d1-8718-
00C04FD44407}

A lista de interfaces da Extension1 pode ser diferente da da Extension2. O objeto,


quando ativo, dá suporte às interfaces do agregador (ADSI) e a todas as interfaces
fornecidas por Extension1 e Extension2 da agregação. A resolução de interfaces
conflitantes (a mesma interface com suporte tanto pelo agregador quanto pelas
agregações ou por várias agregações) é determinada por prioridades das extensões.

Você também pode associar sua extensão CLSID a vários nomes de classe de objeto. Por
exemplo, sua extensão pode estender o usuário e os objetos de contato .

7 Observação

O comportamento da extensão é adicionado em uma classe por objeto, não em


uma instância por objeto.

Como prática recomendada, registre suas extensões, como faria com outros
componentes COM, com uma chamada para a função DllRegisterSvr . Forneça também
uma instalação para cancelar o registro de sua extensão com a função
DllUnregisterServer .

O exemplo de código a seguir mostra como registrar uma extensão.

C++
/////
// Register the class.
///////////////////////
hr = RegCreateKeyEx( HKEY_LOCAL_MACHINE,

_T("SOFTWARE\\Microsoft\\ADs\\Providers\\LDAP\\Extensions\\User\\{E1E3EDF8-
48D1-11D2-B22B-0000F87A6B50}"),
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_WRITE,
NULL,
&hKey,
&dwDisposition );

///////////////////////////
// Register the Interface.
///////////////////////////
const TCHAR szIf[] = _T("{E1E3EDF7-48D1-11D2-B22B-0000F87A6B50}");

hr = RegSetValueEx( hKey, _T("Interfaces"), 0, REG_BINARY, (const BYTE *)


szIf, sizeof(szIf) );

RegCloseKey(hKey);
return S_OK;

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Suporte à associação tardia
Artigo • 13/06/2023

Quando o suporte à associação tardia está em vigor, cada chamada de função deve
passar pela interface IDispatch ADSI, antes de ser redirecionada para a extensão
apropriada.

Considere o exemplo de código a seguir.

C++

Set x = GetObject("LDAP://CN=JeffSmith, OU=Sales,


DC=Fabrikam,DC=COM")
x.SetPassword("newPassword")

x.MyNewMethod( "\\srv\public")
x.MyProperty = "Hello World"

x.OtherMethod()
x.OtherProperty = 4362

Debug.Print x.LastName

Não há chamadas explícitas para o método QueryInterface para acessar as extensões.


As extensões devem redirecionar suas chamadas IDispatch para a interface IDispatch
adsi. O ADSI toma a decisão e resolve todos os conflitos que ocorrem e, em seguida,
redireciona de volta para a extensão apropriada usando uma interface chamada
IADsExtension. Portanto, qualquer extensão que dê suporte à associação tardia deve
implementar IADsExtension.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Associação tardia: o que está
acontecendo nos bastidores?
Artigo • 13/06/2023

A lista a seguir descreve o processo geral para executar uma associação tardia:

Algo se associa a um objeto de diretório ADSI. Por exemplo, as associações


"LDAP://CN=Jeffsmith,OU=Sales,DC=Fabrikam,DC=COM" usam associação COM
tardia. Isso faz com que o ADSI chame o método QueryInterface na interface
IDispatch .
ADSI localiza um objeto na classe de usuário e cria um objeto que dá suporte às
interfaces apropriadas, como IADs, IADsUser.
O ADSI executa uma pesquisa no registro e localiza CLSIDs de extensão para o
usuário. Lembre-se de que o ADSI armazena esses dados em cache.
Algo faz uma chamada para o método MyNewMethod . A ADSI pesquisa sua ID
de expedição e as IDs de expedição para outras extensões ADSI. ADSI localiza a
extensão que atende a essa chamada e chama a interface IADsExtension para essa
extensão.
A extensão executa a função .
Agora, o gravador do cliente invoca o método YourNewMethod usando a
interface IDispatch para a extensão atual. A implementação de IDispatch da
extensão delega de volta ao IDispatch para ADSI.
O IDispatch para ADSI pesquisa novamente a extensão apropriada ou, em seguida,
chama a extensão apropriada usando a interface IADsExtension para essa
extensão.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Associação tardia versus acesso vtable
no modelo de extensão ADSI
Artigo • 12/06/2023

Uma interface dupla permite o acesso direto de vtable a todas as suas funções
enquanto uma interface de expedição não. Um cliente C/C++ pode consultar um
ponteiro de interface dupla e usar o acesso direto de vtable para invocar suas funções.
Isso fornece acesso mais rápido do que invocar a função usando as funções
IDispatch::GetIDsOfNames e IDispatch::Invoke . Isso é especialmente verdadeiro no
modelo de extensão, porque todas as interfaces duplas em um objeto de extensão
devem delegar suas funções GetIDsOfNames e Invoke de volta para o agregador (ADSI)
primeiro. Em seguida, o agregador deve executar etapas internas extras para identificar
qual objeto de extensão, possivelmente incluindo o agregador em si, fornece suporte
para a função chamada e redirecionar a chamada para o objeto apropriado.

O Visual Basic também invocará uma função de interface dupla usando o acesso direto
a uma vtable, se ela tiver um ponteiro para a interface e acesso aos dados de tipo da
biblioteca de tipos. Os clientes ADSI escritos no Visual Basic podem especificar um
ponteiro para uma interface dupla, por exemplo, IADs, explicitamente e, portanto,
habilitar o acesso vtable a funções na interface.

VB

Dim inf as IADs

Set inf = GetObject("LDAP://CN=jeffsmith,DC=fabrikam,DC=com") ' An object


that supports IADsDualInf.
inf.Get("name") 'IADs.Get() will be invoked through direct vtable access.

Como uma interface IDispatch não dá suporte ao acesso vtable, este exemplo não se
aplica. Ou seja, uma função de expedição é sempre invocada por meio das funções
IDispatch::GetIDsOfNames e IDispatch::Invoke apenas.

As versões atuais do VBScript e do JScript também não dão suporte ao acesso vtable.
Portanto, uma interface dupla em um ambiente VBScript ou JScript é executada como
uma interface de expedição.
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


IADsExtension Interface
Artigo • 03/06/2023

A interface IADsExtension é definida da seguinte maneira:

C++

IADsExtension : public IUnknown


{
public:
virtual HRESULT STDMETHODCALLTYPE Operate(
/* [in] */ DWORD dwCode,
/* [in] */ VARIANT varData1,
/* [in] */ VARIANT varData2,
/* [in] */ VARIANT varData3) = 0;

virtual HRESULT STDMETHODCALLTYPE PrivateGetIDsOfNames(


/* [in] */ REFIID riid,
/* [in] */ OLECHAR **rgszNames,
/* [in] */ unsigned int cNames,
/* [in] */ LCID lcid,
/* [out] */ DISPID *rgDispid) = 0;

virtual HRESULT STDMETHODCALLTYPE PrivateInvoke(


/* [in] */ DISPID dispidMember,
/* [in] */ REFIID riid,
/* [in] */ LCID lcid,
/* [in] */ WORD wFlags,
/* [in] */ DISPPARAMS *pdispparams,
/* [out] */ VARIANT *pvarResult,
/* [out] */ EXCEPINFO *pexcepinfo,
/* [out] */ unsigned int *puArgErr) = 0;
};

O agregador (ADSI) chama o método IADsExtension::Operate . A extensão deve


interpretar o parâmetro dwCode e cada parâmetro varData , de acordo com a
documentação do provedor.

O agregador (ADSI), chama o método IADsExtension::P rivateGetIDsOfNames . Ele é


chamado depois que ADSI determina a extensão para atender à expedição. A extensão
pode usar as informações de tipo para obter o DISPID, ou seja, usando a função
DispGetIDsOfNames .

O ADSI normalmente chama o método PrivateInvoke depois de chamar a função


PrivateGetIDsOfNames . A extensão deve chamar o método real que ela implementa.
Como alternativa, a extensão pode usar informações de tipo e chamar a função
DispInvoke .
Todos os parâmetros têm o mesmo significado que os parâmetros no método
IDispatch::Invoke padrão.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Uso de IADsExtension
Artigo • 03/06/2023

IADsExtension é uma interface opcional implementada pelo gravador de extensão


quando pelo menos uma das seguintes condições é atendida:

O componente de extensão requer uma notificação de inicialização conforme


definido por ADSI_EXT_dwCode no método Operate .
A extensão dá suporte a uma interface dupla ou de expedição.

Se um componente de extensão der suporte à interface IADsExtension pelo primeiro


motivo, os métodos IADsExtension::P rivateGetIDsOfNames e IADsExtension::P
rivateInvoke poderão retornar E_NOTIMPL. Como alternativa, se um componente de
extensão der suporte a uma interface dupla ou de expedição, o método Operate poderá
ignorar os dados e retornar um HRESULT de E_NOTIMPL.

O código a seguir mostra uma extensão implementando IADsExtension.

C++

STDMETHOD(Operate)(ULONG dwCode, VARIANT varData1, VARIANT varData2, VARIANT


varData3)
{
HRESULT hr = S_OK;
switch (dwCode)
{
case ADS_EXT_INIT:
// Prompt for a credential.
// MessageBox(NULL, "INITCRED", "ADsExt", MB_OK);
break;
default:
hr = E_FAIL;
break;
}
return hr;
}

STDMETHOD(PrivateGetIDsOfNames)(REFIID riid, OLECHAR ** rgszNames, unsigned


int cNames, LCID lcid, DISPID * rgdispid)
{
if (rgdispid == NULL)
{
return E_POINTER;
}
return DispGetIDsOfNames(m_pTypeInfo, rgszNames, cNames, rgdispid);
}

STDMETHOD(PrivateInvoke)(DISPID dispidMember, REFIID riid, LCID lcid, WORD


wFlags, DISPPARAMS * pdispparams, VARIANT * pvarResult, EXCEPINFO *
pexcepinfo, UINT * puArgErr)
{
return DispInvoke( (IHelloWorld*)this,
m_pTypeInfo,
dispidMember,
wFlags,
pdispparams,
pvarResult,
pexcepinfo,
puArgErr );
}

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Suporte a interfaces duplas ou de
expedição
Artigo • 03/06/2023

Assim como a interface de expedição, todas as interfaces duplas devem herdar do


IDispatch, que delega todas as suas funções IDispatch (GetIDsOfNames, Invoke,
GetTypeInfo, GetTypeInfoCount) de volta à IDispatch do agregador (ADSI). Para
delegar, um objeto de extensão deve consultar a IDispatch do agregador, chamar o
método agregador apropriado e liberar o ponteiro após o uso.

Se a extensão puder ser um componente autônomo, verifique se ela é agregada. Nesse


caso, redirecione as funções de expedição para o IDispatch do agregador, caso
contrário, você poderá chamar sua implementação interna de IDispatch ou chamar sua
implementação de IADsExtension.

O exemplo de código a seguir mostra como redirecionar a chamada IDispatch para a


IDispatch do agregador. Este exemplo de código pressupõe que a variável de membro
m_pOuterUnknown foi inicializada para o ponteiro IUnknown do agregador.

C++

///////////////////////////////////////////////////
// Delegating IDispatch Methods to the aggregator
///////////////////////////////////////////////////
STDMETHODIMP MyExtension::GetTypeInfoCount(UINT* pctinfo)
{
IDispatch *pDisp = NULL;
HRESULT hr = S_OK;
hr = m_pOuterUnknown->QueryInterface( IID_IDispatch, (void**) &pDisp );
if ( SUCCEEDED(hr) )
{
hr = pDisp->GetTypeInfoCount( pctinfo );
pDisp->Release();
}
return hr;
}

STDMETHODIMP MyExtension::GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo**


pptinfo)
{
IDispatch *pDisp = NULL;
HRESULT hr = S_OK;
hr = m_pOuterUnknown->QueryInterface( IID_IDispatch, (void**) &pDisp );
if ( SUCCEEDED(hr) )
{
hr = pDisp->GetTypeInfo( itinfo, lcid, pptinfo );
pDisp->Release();
}

return hr;
}

STDMETHODIMP MyExtension::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,


UINT cNames, LCID lcid, DISPID* rgdispid)
{
IDispatch *pDisp = NULL;
HRESULT hr = S_OK;
hr = m_pOuterUnknown->QueryInterface( IID_IDispatch, (void**) &pDisp );
if ( SUCCEEDED(hr) )
{
hr = pDisp->GetIDsOfNames( riid, rgszNames, cNames, lcid,
rgdispid);
pDisp->Release();
}

return hr;

STDMETHODIMP MyExtension::Invoke(DISPID dispidMember, REFIID riid,


LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT*
pvarResult, EXCEPINFO* pexcepinfo, UINT* puArgErr)
{
IDispatch *pDisp = NULL;
HRESULT hr = S_OK;
hr = m_pOuterUnknown->QueryInterface( IID_IDispatch, (void**) &pDisp );
if ( SUCCEEDED(hr) )
{
hr = pDisp->Invoke( dispidMember, riid, lcid, wFlags,
pdispparams, pvarResult, pexcepinfo, puArgErr);
pDisp->Release();
}

return hr;
}

Os gravadores de extensão são altamente incentivados a dar suporte a interfaces duplas


em vez de interfaces de expedição em seus objetos de extensão. Uma interface dupla
permite que um cliente tenha acesso mais rápido, desde que o acesso vtable esteja
habilitado no cliente. Para obter mais informações, consulte Associação Tardia versus
Acesso Vtable no Modelo de Extensão ADSI. Com base no modelo atual, a
implementação de interfaces duplas não deve ser mais difícil do que implementar
interfaces de expedição.
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Revisitando regras de agregação COM
com extensões ADSI
Artigo • 12/06/2023

Veja a seguir uma breve revisão das regras de agregação COM e de extensão ADSI.

O método CreateInstance retorna um ponteiro para uma interface IUnknown , da


seguinte maneira, que não delega nenhuma chamada de função para o agregador.

O método IUnknown::QueryInterface retorna ponteiros para as interfaces


compatíveis e erros para interfaces às quais ele não dá suporte.

O método IUnknown::AddRef incrementa a contagem de referência no próprio


objeto de extensão agregado.

O método IUnkown::Release diminui a contagem de referência no próprio objeto


de extensão agregado e se destrói quando a contagem de referência é 0.

O objeto de extensão deve armazenar o ponteiro IUnknown do agregador, como


m_pOuterUnknown, durante a implementação do método CreateInstance .

Todas as interfaces compatíveis com o objeto de extensão, incluindo


IADsExtension, devem herdar de IUnknown, que delega todas as chamadas de
função de volta para o agregador.
IUnknown::QueryInterface chama "m_pOuterUnknown-QueryInterface>"
IUnknown::AddRef chama "m_pOuterUnknown-AddRef>"
IUnkown::Release chama "m_pOuterUnknown-Release>"

Os gravadores de extensão podem escolher qualquer implementação interna que


preferirem, desde que obedeçam às regras de agregação COM padrão. Lembre-se de
que um objeto de extensão não precisa funcionar como um objeto autônomo. As
extensões foram projetadas para funcionar como agregações. No entanto, uma
extensão pode ser gravada para funcionar como um objeto autônomo e como uma
agregação.

Além do suporte à agregação COM padrão, um objeto de extensão pode dar suporte a
IADsExtension para recursos mais avançados. Se houver suporte para associação tardia,
a extensão deverá:

Delegar funções para IDispatch de volta para o agregador.


Implemente a interface IDispatch em IADsExtension.
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Resolução de vários componentes de
agregação que dão suporte à mesma
interface
Artigo • 03/06/2023

É incomum que duas extensões exponham a mesma interface ao ADSI. Se isso


acontecer, as seguintes regras se aplicam:

Se uma interface, como IMyInterface, for compatível com o agregador (ADSI) e


quaisquer objetos de extensão, QueryInterface sempre retornará o IMyInterface
para ADSI.
Se uma interface, como IMyInterface, não tiver suporte do agregador (ADSI), mas
tiver suporte em mais de um objeto de extensão, QueryInterface retornará o
IMyInterface do primeiro objeto de extensão listado no registro que dá suporte à
interface.

Lembre-se de que a ordem dos componentes no registro também afeta a resolução de


conflitos de nome na Automação. Para obter mais informações, consulte Resolução de
conflitos de nome de função/propriedade na Automação em Extensões.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Resolução de conflitos de nome de
função/propriedade na automação em
extensões
Artigo • 03/06/2023

Neste tópico, "object" indica o objeto, como um todo, como um cliente ADSI o exibe.
Ou seja, ADSI e todas as suas extensões.

Mesmo nome da função com os mesmos


parâmetros
Se duas ou mais interfaces IDispatch duplas em um objeto dão suporte a uma
propriedade ou método de mesmo nome, por exemplo, Func1, a invocação será
determinada usando os critérios a seguir. Se o cliente tiver um ponteiro para uma das
interfaces duplas que dão suporte a um método chamado Func1 e se o ambiente de
Automação der suporte ao acesso vtable, o Func1 será invocado diretamente por meio
do acesso de vtable ADSI.

Se qualquer uma das condições acima for falsa, IDispatch::GetIDsOfNames e


IDispatch::Invoke serão chamados para invocar o Func1.

Para obter mais informações e uma breve explicação sobre como um cliente pode
adicionar um ponteiro a uma interface dupla e uma descrição dos tipos de ambientes
que dão suporte ao acesso vtable, consulte Associação Tardia versus Acesso Vtable no
Modelo de Extensão ADSI.

Como todos os objetos de extensão redirecionam as funções IDispatch de volta para o


agregador, o agregador controla que o Func1 é invocado. As regras são:

Se alguma interface e houver apenas uma, se houver, no agregador (ADSI)


oferecer suporte a uma função chamada Func1, o agregador invocará seu próprio
Func1.
Caso contrário, o agregador passa por cada uma de suas extensões, na ordem
listada no registro, e localiza a primeira extensão que implementa uma função
chamada Func1. É possível, mas improvável, que várias interfaces IDispatch duplas
nesta primeira extensão tenham uma função chamada Func1. A extensão deve
determinar qual Func1 sempre deve ser invocado na Automação.
Mesmo nome da função com parâmetros
diferentes
A seção anterior discutiu como resolver conflitos de nome de função, ou seja, nomes de
função que têm o mesmo nome de função e a mesma lista de parâmetros, como
número, tipo e ordem, quando ocorre na Automação. E se duas funções tiverem o
mesmo nome, mas parâmetros diferentes? Se um cliente ADSI invocar a função usando
IDispatch::GetIDsOfNames sem usar vários nomes para especificar os parâmetros, o
modelo de extensão ADSI não poderá desambiguar as funções. Com base no esquema
de resolução discutido acima, a primeira extensão no Registro que dá suporte a essa
função por meio de uma de suas interfaces tem sua versão dessa função invocada e a
chamada pode falhar ou produzir resultados incorretos.

Por exemplo:

O Extn1 (primeiro no registro sob a AC de classe – prioridade mais alta) dá suporte


a IInterface1.
O Extn2 (terceiro no registro sob a AC de classe – prioridade inferior) dá suporte a
IInterface2.
O IInterface1 dá suporte a Method1(int param1, int param2).
O IInterface2 dá suporte a Method1(int param1).

Um cliente ADSI tem um ponteiro de interface IDispatch para um objeto de AC de


classe. Ele deseja invocar IInterface2::Method1. Se o cliente chamar "pDispatch-
GetIDsOfNames>(IID_NULL, rgszNames, 1, MY_LCID, rgDispId)" apenas armazenando o
nome da função "Method1" em rgszNames[0], em seguida, IInterface1::Method1 em vez
do IInterface2::Method1 desejado é invocado e a função falha porque o número de
parâmetros é diferente.

Para minimizar esse problema, os desenvolvedores de extensão podem prefixar seus


nomes de função com seus próprios identificadores específicos e evitar designs de
interface que usam funções de mesmo nome, mas parâmetros diferentes.

Se ocorrer um conflito de nomes, os clientes ADSI poderão evitar o problema por


acesso direto à vtable se a interface for uma interface dupla. Se o acesso direto à vtable
não for possível, os clientes ADSI deverão chamar IDispatch::GetIDsOfNames com
vários nomes, especificando os nomes de função, bem como os parâmetros na matriz
rgszNames descrita anteriormente.

Visual Basic 5 não chama a função IDispatch::GetIDsOfNames com vários nomes. Ou


seja, ele passa apenas o nome da função para GetIDsOfNames, mas não argumentos.
No entanto, Visual Basic 5 permite que os usuários invoquem uma função por acesso
direto à vtable, em vez de invocar a função IDispatch::GetIDsOfNames se a interface for
uma interface dupla. Os desenvolvedores devem usar o acesso direto à vtable, se
possível.

Para obter mais informações sobre a resolução de conflitos de nome, consulte Exemplo
para resolver conflitos de nome de função.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Exemplo para resolver conflitos de
nome de função
Artigo • 03/06/2023

Considere o seguinte:

IADs0 não dá suporte ao Func0.


O IADs1 dá suporte a Func1 e Func0.
O IADs2 dá suporte a Func2 e Func0.

Todas as três interfaces são interfaces duplas.

C++

IADs0 : IDispatch
{
OtherFunc();
}

IADs1 : IDispatch
{
Func0()
Func1();
}

IADs2 : IDispatch
{
Func0()
Func2();
}

VB

Dim myInf1 as IADs1

myInf1.Func1 ' IADs1::Func1 is invoked using direct vtable access

myInf1.Func2 ' IADs2::Func2 is invoked using GetIDsOfNames/Invoke

Lembre-se de que, embora o IADs1 não dê suporte ao Func2, um cliente ADSI


reconhece uma IDispatch que dá suporte a todas as interfaces duplas e de expedição
no modelo. Assim, o cliente ADSI pode chamar o Func2 diretamente usando
myInf1.Func2 sem resolver qual interface dá suporte ao Func2.

VB
myInf1.Func2

Tanto IADs1 quanto IADs2 têm uma função chamada Func0, mas IADs1::Func0 é
invocado diretamente usando o acesso vtable, pois ambos os seguintes se aplicam ao
cliente:

O cliente tem um ponteiro para o objeto IADs1 de interface dupla, que tem uma
função chamada Func0.
Visual Basic dá suporte ao acesso direto à vtable, supondo que esse tipo de dados
esteja disponível por meio da biblioteca de tipos.

No próximo exemplo de código, o cliente tem um ponteiro de interface duplo para


IADs2 em vez de IADs1. Portanto, IADs2::Func0 é invocado usando o acesso direto à
vtable.

VB

Dim myInf2 as IADs2


Set myInf2 = myInf1 ' Query for pointer to IADs2
myInf2.Func0

Novamente, no próximo exemplo de código, iads1 e IADs2 têm uma função chamada
Func0, mas, aqui, o cliente tem um ponteiro para uma interface dupla, IADs0, que não
tem uma função chamada Func0. Portanto, nenhum acesso direto à vtable pode ser
executado. Em vez disso, IDispatch::GetIDsOfNames e Invoke são chamados para
invocar o Func0.

VB

Dim myInfNone as IADs0


Set myInfNone = myInf1 ' The aggregated object that
' supports IADs1 and IADs2.
myInfNone.Func0

Considere estes dois casos:

IADs1 e IADs2 são implementados por dois componentes COM, Ext1 e Ext2,
respectivamente. Se o Ext1 vier antes do Ext2 no registro, IADs1::Func0 será
invocado. No entanto, se o Ext2 vier primeiro no registro, IADs2::Func0 será
invocado.
Se IADs1 e ADs2 forem implementados pelo mesmo objeto de extensão, o Func0
sempre será invocado pelos métodos IADsExtension::P rivateGetIDsOfNames e
PrivateInvoke da extensão.
O desenvolvedor de extensão deve determinar como resolver conflitos de funções ou
propriedades de diferentes interfaces IDispatch duplas que têm o mesmo nome em
uma extensão. A implementação dos métodos IADsExtension::P rivateGetIDsOfNames
e PrivateInvoke deve resolver esse conflito. Por exemplo, se você usar
IMyInterface1::Func1 e IMyInterface2::Func1, em que IMyInterface1 e IMyInterface2 são
interfaces IDispatch duplas compatíveis com o mesmo objeto de extensão. Os métodos
PrivateGetIDsOfNames e PrivateInvoke devem determinar qual Func1 sempre deve ser
chamado.

O mesmo se aplica a DISPIDs conflitantes em diferentes interfaces duplas ou IDispatch .

Por exemplo, o DISPID de IMyInterface1::Y é 2 no arquivo imyinterface1.odl ou


imyinterface1.idl. O DISPID de IMyInterface2::X também é 2 em iMyInterface2.odl.
IADsExtension::P rivateGetIDsOfNames deve retornar um DISPID exclusivo, dentro da
própria extensão, para cada um, em vez de retornar o mesmo DISPID para ambos.

O ADSI resolve o primeiro problema sem dar suporte a várias interfaces com nomes de
função ou propriedade conflitantes. Ele resolve o segundo problema adicionando um
exclusivo, que está dentro do mesmo objeto de extensão, o número da interface aos
bits não utilizados do DISPID.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Usando ADSI com o Exchange
Artigo • 13/06/2023

Para o Exchange 2000, as informações para usar ADSI com o Exchange estão contidas
no SDK do Exchange 2000. Para obter mais informações, consulte Tarefas de
gerenciamento para ADSI.

As seguintes tarefas podem ser encontradas nesta seção:

Criando uma URL de usuário


Criando caminhos do Active Directory
Enumerando servidores do Exchange 2000 com ADSI
Manipulando atributos de extensão com ADSI
Adicionando/removendo um objeto de gerenciador com ADSI
Enumerando propriedades de objeto do Exchange com ADSI/ADO
Recuperando um nome diferenciado herdado do Exchange com ADSI
Localizando o nome da organização do Exchange usando ADSI
Localizando listas de endereços do Exchange com ADSI
Criando uma lista de distribuição usando CDOEXM e ADSI
Definir restrição de mensagem em um servidor virtual SMTP usando ADSI

Para o Exchange 5.5, a referência ADSI e as informações de uso podem ser encontradas
no guia do Exchange ADSI .

As seguintes tarefas podem ser encontradas nesta seção:

Exibindo e modificando o esquema de Exchange Server


Exibindo as propriedades brutas de um objeto Exchange
Criando uma caixa de correio do Exchange
Definindo o descritor de segurança em uma caixa de correio do Exchange
Manipulando descritores de segurança e SIDs
Excluindo um objeto de caixa de correio
Criando um destinatário personalizado
Criando um contêiner de destinatários
Obtendo o nome da organização e do site de um servidor
Listando a versão do servidor Exchange de todos os servidores na organização
Localizando o servidor inicial de uma caixa de correio
Recuperando endereços de email
Acessando entradas ocultas ou excluídas
Recuperando alterações feitas no serviço de diretório
Criando uma lista de distribuição com base nos resultados de uma consulta
Obtendo ou modificando o tamanho da mensagem
Usando códigos de erro LDAP para solucionar problemas

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interfaces do utilitário ADSI
Artigo • 03/06/2023

O ADSI fornece várias interfaces de utilitário para objetos ADSI que podem ajudar a
acessar e manter o Active Directory. Essas interfaces são:

IADsDeleteOps
IADsObjectOptions
IADsPathname
IADsNameTranslate

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


IADsDeleteOps Interface
Artigo • 12/06/2023

A interface IADsDeleteOps é usada em rotinas de supervisão e manutenção para o


repositório de diretórios subjacente. Ele pode excluir objetos folha e subárvores inteiras
em uma única operação.

Se essa interface não tiver suporte, excluir um objeto do Active Directory exigiria que
cada objeto contido fosse enumerado e excluído recursivamente. Com essa interface,
qualquer objeto de contêiner, com todos os seus objetos e subobjetos contidos, pode
ser excluído com uma única operação.

O exemplo de código a seguir exclui o contêiner "Eng" e todos os objetos filho.

C++

HRESULT hr;
IADsDeleteOps *pDeleteOps;
LPWSTR pwszUsername = NULL;
LPWSTR pwszPassword = NULL;

// Insert code to securely retrieve the pwszUsername and pwszPassword


// or leave as NULL to use the default security context of the
// calling application.

// Bind to the LDAP provider.


hr = ADsOpenObject(L"LDAP://CN=Eng,CN=Users,DC=Fabrikam,DC=Com",
pwszUsername,
pwszPassword,
0,
ADS_SECURE_AUTHENTICATION,
IID_IADsDeleteOps,
(void**)&pDeleteOps);
if(S_OK == hr)
{
// Delete the container and all child objects.
pDeleteOps->DeleteObject(0);

// Release the interface.


pDeleteOps->Release();
}

if(pwszUsername)
{
SecureZeroMemory(pwszUsername, lstrlen(pwszUsername) * sizeof(TCHAR));
}
if(pwszPassword)
{
SecureZeroMemory(pwszPassword, lstrlen(pwszPassword) * sizeof(TCHAR));
}
O exemplo de código a seguir exclui o contêiner "Eng" e todos os objetos filho.

VB

Dim DeleteOps As IADsDeleteOps

' Bind to the LDAP provider.


Set DeleteOps = GetObject("LDAP://CN=Eng,CN=Users,DC=Fabrikam,DC=Com")

' Delete the container and all child objects.


DeleteOps.DeleteObject (0)

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


IADsObjectOptions Interface
Artigo • 03/06/2023

A interface IADsObjectOptions permite acesso direto para definir e recuperar opções


específicas do provedor.

Uma das opções de objeto do Active Directory é retornar o nome do host de um


servidor. O exemplo de código a seguir usa a interface para recuperar o nome do host
do servidor de catálogo global.

C++

HRESULT GetGCServerName(VARIANT *vGCServer)


{
HRESULT hr = S_OK
HRESULT hre = S_OK;
IADsContainer *pContainer = NULL;
IUnknown *pUnk = NULL;
IEnumVARIANT *pEnum = NULL;
IDispatch *pDisp = NULL;
IADsObjectOptions *pOpt = NULL;
VARIANT var;
ULONG lFetch = 0;

VariantInit(&var);

// Bind to the global catalog using a serverless bind.


hr = ADsOpenObject(L"GC:", NULL, NULL,
ADS_SECURE_AUTHENTICATION,
IID_IADsContainer, (void**) &pContainer );
if (FAILED(hr))
return (hr);

hr = pContainer->get__NewEnum(&pUnk);
if (SUCCEEDED(hr))
{
hr = pUnk->QueryInterface(IID_IEnumVARIANT, (void**) &pEnum);
if (SUCCEEDED(hr))
{
// Enumerate.
hr = pEnum->Next(1, &var, &lFetch);
if (SUCCEEDED(hr))
{
while (SUCCEEDED(hr))
{
if (lFetch == 1)
{
pDisp = V_DISPATCH(&var);
hre = pDisp->QueryInterface(
IID_IADsObjectOptions,
(void**)&pOpt);
if (pDisp)
pDisp->Release();
}
VariantClear(&var);
hr = pEnum->Next(1, &var, &lFetch);
}
// S_FALSE indicates that the row was read properly.
if (hr == S_FALSE)
hr = hre;
}

if (SUCCEEDED(hr))
{
// There is a valid pOpt, so request the server name.
VariantInit(vGCServer);
hr = pOpt->GetOption(ADS_OPTION_SERVERNAME,vGCServer);
}
}
}

// Cleanup.
VariantClear(&var);
if (pOpt)
pOpt->Release();
if (pEnum)
pEnum->Release();
if (pUnk)
pUnk->Release();
if (pContainer)
pContainer->Release();
return (hr);
}

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


IADsPathname Interface
Artigo • 03/06/2023

A interface IADsPathname analisa e modifica vários elementos de um ADsPath. Ele


também converte a ADsPaths entre vários formatos de exibição.

O exemplo de código a seguir extrai e retorna o nome do servidor de um ADsPath


válido para exibição para o usuário em um utilitário de manutenção.

C++

HRESULT GetServerName(BSTR adsPath, BSTR *adsServer)


{
HRESULT hr = S_OK;
IADsPathname *pIADsPathname = NULL;

// Create the IADsPathname object.


hr = CoCreateInstance(CLSID_Pathname,
NULL,
CLSCTX_INPROC_SERVER,
IID_IADsPathname,
(void**) &pIADsPathname);
if (FAILED(hr))
{
if (pIADsPathname)
pIADsPathname->Release();
return (hr);
}

// Set the path.


hr = pIADsPathname->Set(adsPath, ADS_SETTYPE_FULL);
if (SUCCEEDED(hr))
// Extract and return the server name.
hr = pIADsPathname->Retrieve(ADS_FORMAT_SERVER, adsServer);

// Cleanup.
pIADsPathname->Release();
return (hr);
}

O exemplo de código a seguir ajuda a inicializar um objeto ADSI recém-criado definindo


a propriedade Distinguished Name do objeto de seu próprio ADsPath. Lembre-se de
que a rotina de chamada deve confirmar quaisquer alterações no repositório de
diretório subjacente invocando o método SetInfo .

C++
HRESULT SetDistinguishedName(IADs *pIADs)
{
HRESULT hr = S_OK;
CComBSTR sbstrADsPath;
IADsPathname *pIADsPathname = NULL;

// Get the ADsPath for this object.


hr = pIADs->get_ADsPath(&sbstrADsPath);
if (FAILED(hr))
return (hr);

// Create the IADsPathname object.


hr = CoCreateInstance(CLSID_Pathname,
NULL,
CLSCTX_INPROC_SERVER,
IID_IADsPathname,
(void**) &pIADsPathname);
if (FAILED(hr))
{
if (pIADsPathname)
pIADsPathname->Release();
return (hr);
}
// Set the path.
hr = pIADsPathname->Set(sbstrADsPath, ADS_SETTYPE_FULL);
if (SUCCEEDED(hr))
{
CComBSTR sbstrDNPath;

// Convert the path to Distinguished Name format.


hr = pIADsPathname->Retrieve(ADS_FORMAT_WINDOWS_DN,
&sbstrDNPath);

if (SUCCEEDED(hr))
{
// Set the distinguished name property.
VARIANT var;
VariantInit(&var);
V_BSTR(&var) = sbstrDNPath;
V_VT(&var) = VT_BSTR;
hr = pIADs->Put(CComBSTR("distinguishedName"), var);
VariantClear(&var);
}
}

// Cleanup.
pIADsPathname->Release();
return (hr);

}
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


IADsNameTranslate Interface
Artigo • 13/06/2023

A interface IADsNameTranslate é usada para traduzir nomes distintos entre vários


formatos. As traduções de nome são executadas no servidor de diretório e essa
interface está disponível atualmente apenas para objetos no Active Directory.

O exemplo de código a seguir converte um nome de conta do formato Windows em


formato LDAP.

C++

HRESULT TranslateNTNameToLDAPName( BSTR * pNTName, BSTR * pLDAPName )


{
IADsNameTranslate *pTrans;
HRESULT hr = S_OK;

hr = CoCreateInstance(CLSID_NameTranslate,
NULL,
CLSCTX_INPROC_SERVER,
IID_IADsNameTranslate,
(void**) &pTrans );
if (FAILED(hr)) { return hr; }

hr = pTrans->Init(ADS_NAME_INITTYPE_DOMAIN,
CComBSTR("Fabrikam.com"));
if (FAILED(hr)) { return hr; }

hr = pTrans->Set(ADS_NAME_TYPE_NT4, *pNTName);
if (FAILED(hr)) { return hr; }

hr = pTrans->Get(ADS_NAME_TYPE_1779, pLDAPName);
pTrans->Release();
return hr;
}

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Programando ADSI com Java/COM
Artigo • 12/06/2023

Usando a máquina virtual da Microsoft para Java (Microsoft VM) e o Microsoft Java
Compiler, você tem acesso a todos os recursos ADSI expostos por meio de qualquer
componente ADSI COM, de um aplicativo Java/COM. O exemplo de código Java a seguir
mostra os elementos necessários para associar a um objeto ADSI e invocar métodos
nesse objeto. As funções de API ADSI necessárias e os métodos de objeto são expostos
por meio de Activeds.dll.

C++

import activeds.*; // ADSI COM Wrapper classes


import com.ms.com.*; // to use _Guid data type in COM.

public Class SimpleADSI


{
IADs obj;
String path = "WinNT://domain/machine,computer";
_Guid riid = IADs.iid;
public static void main(String args[])
{
try
{
obj = (IADs)ADsGetObject(path, riid);
System.out.println( "Object name: " + obj.getName() );
System.out.println( " class: " + obj.getSchema() );
System.out.println( " ADsPath: " + obj.getADsPath() );
System.out.println( " parent: " + obj.getParent() );
}
catch (Exception e)
{
System.out.println( "SimpleADSI Error: " + e.toString() );
}
}

/** @dll.import("activeds", ole) */


private static native IUnknown ADsGetObject(String path, _Guid riid);
}

O argumento na primeira instrução de importação refere-se às classes Wrapper java


empacotadas em Activeds.dll. Use o Visual J++ para criar as classes wrapper e incluí-las
em seu projeto, seguindo o procedimento abaixo.

Para criar classes wrapper e incluí-las em seu projeto


1. Em um projeto do Visual J++, selecione Adicionar Wrapper Com... no menu
Projeto .
2. Selecione "Biblioteca de Tipos de DS Ativo" nos Componentes Instalados: na caixa
de diálogo Wrappers COM. Se a biblioteca de tipos não for mostrada na caixa de
listagem, clique no botão Procurar... , navegue até o diretório onde Activeds.tlb
está armazenado e selecione a biblioteca de tipos.

O Visual J++ cria o pacote activeds para as classes Java Wrapper e inclui o pacote no
caminho padrão do projeto. Para obter mais informações, consulte o pacote activeds no
painel Explorar projeto na janela Visual J++.

Para obter um objeto ADSI que não pode ser cocriado, use uma das funções expostas
da API ADSI, por exemplo, ADsGetObject ou ADsOpenObject, que também são
empacotadas em Activeds.dll. O Microsoft J/Direct fornece acesso a essas e a outras
APIs nativas. Isso é ilustrado pelas duas últimas linhas do exemplo de código, acima.

Ao compilar, verifique se a Extensão de Idioma da Microsoft está habilitada. Para fazer


isso, selecione <Propriedades do projeto> ... no menu Projeto na janela de projeto do
Visual J++. Em seguida, clique na guia Compilar na caixa de diálogo Propriedades do<
projeto>. Desmarque a caixa Desabilitar extensões de idioma da Microsoft marcar. Se
estiver compilando a partir da linha de comando, use a opção "/x-", por exemplo:

jvc /x- SimpleADSI.java

Por fim, para que a máquina virtual carregue o componente COM, a DLL (biblioteca de
vínculo dinâmico) deve estar visível no caminho do sistema. Se um erro
"java.lang.UnsatisfiedLinkError" for retornado, defina o PATH para incluir o caminho que
contém a DLL necessária. Por exemplo, se Activeds.dll tiver sido instalado em c:\adsi\lib,
emita o seguinte comando na linha de comando:

set PATH = %PATH%; c:\adsi\lib

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Implementando provedores de
interfaces de serviço do Active Directory
Artigo • 13/06/2023

ADSI (Interfaces de Serviço do Active Directory) são interfaces COM que encapsulam
objetos de serviço de diretório para expô-los a clientes de serviços de diretório. Ao
fornecer uma implementação de ADSI, você expande sua base de clientes para o
conjunto de aplicativos cliente ADSI.

Assim como acontece com qualquer implementação COM, você pode escrever um
provedor ADSI em muitos idiomas. As interfaces COM adsi são definidas como
interfaces duplas que permitem resolução de nomes em tempo de execução e de
tempo de compilação e podem ser chamadas por linguagens compatíveis com a
Automação, como Visual Basic, Visual Basic Scripting Edition e também as linguagens
mais conscientes de desempenho e eficiência, como C e C++. Os clientes ADSI também
incluem aplicativos Web usando Páginas do Servidor Ativo e snap-ins de administração
por meio do Console de Gerenciamento da Microsoft.

Como o ADSI fornece seu próprio provedor OLE DB, implementar os recursos de
pesquisa definidos pelo IDirectorySearch também permite que clientes ADSI consultem
seu serviço de diretório em busca de dados.

Todos os objetos de serviço de diretório podem ser representados por meio de um


objeto ADSI genérico que dá suporte a IDirectoryObject. O ADSI fornece os blocos de
construção necessários para representar os recursos e serviços de qualquer serviço de
diretório.

Além disso, as meta-interfaces ADSI representam objetos comuns usados pelos


administradores de diretório. Você mapeia as propriedades das meta-interfaces para as
propriedades compatíveis com o serviço de diretório. A programação de clientes ADSI
para as Interfaces de Serviço do Active Directory obtém acesso ao serviço de diretório
assim que o provedor é instalado e o sistema reiniciado.

Se o serviço de diretório der suporte a uma representação de esquema, o suporte às


interfaces de gerenciamento de esquema tornará seu namespace diretamente acessível
para navegadores de serviço de diretório. Ao publicar seus recursos por meio do
esquema, os clientes podem consultar seu serviço de diretório online e aproveitar os
serviços que você oferece. Devido à disponibilidade do esquema online e à vantagem
da interface COM, você pode continuar disponibilizando novos recursos para o software
cliente, ao mesmo tempo em que dá suporte a versões de nível inferior.
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Requisitos mínimos do provedor
Artigo • 03/06/2023

Para escrever um provedor ADSI, implemente as Interfaces de Serviço do Active


Directory, conforme descrito nas seções a seguir.

A Implementação Principal lista brevemente os elementos de software aos quais


um provedor ADSI deve dar suporte.
A Implementação Opcional lista brevemente os elementos de software aos quais
um provedor ADSI é fortemente incentivado a dar suporte.
Propriedades personalizadas são essas propriedades e interfaces expostas por
cada provedor para fornecer programação dos recursos nativos do serviço de
diretório.
As Interfaces Duplas descrevem a convenção ADSI para fornecer interfaces
acessíveis para controladores compatíveis com Automação e não Automação.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Implementação principal
Artigo • 03/06/2023

Um provedor ADSI dá suporte aos seguintes recursos:

Cadeias de caracteres do ADsPath no formato COM e URL. Por definição, você


pode recuperar um objeto do Active Directory usando um ADsPath. Os provedores
dão suporte à sintaxe necessária pelo serviço de diretório usando a
implementação ParseDisplayName .
Um objeto Namespace de nível superior que dá suporte a IParseDisplayName::P
arseDisplayName e IADsOpenDSObject. Esse objeto contém os nós raiz desse
namespace. Parte da implementação ParseDisplayName deve incluir um
analisador que verifica se há erros de sintaxe para seu próprio namespace. Esse
objeto também deve dar suporte a IADs e IADsOpenDSObject.
A interface IADs . Isso inclui uma implementação de cache de propriedade simples
por meio de IADs::GetInfo e IADs::SetInfo. As operações que obtêm ou definem
propriedades de objeto ocorrem no modo armazenado em cache. Os valores de
cache são gravados no repositório de diretório subjacente durante IADs::SetInfo.
Um método ADSI, no entanto, não é armazenado em cache, mas é executado
imediatamente.
As interfaces IADsPropertyList, IADsPropertyEntry e IADsPropertyValue para
acessar e enumerar diretamente as propriedades no cache de propriedades. Para
serviços de diretório que não expõem um esquema, essa interface permite
manipular as propriedades de um objeto.
A interface IDirectoryObject para clientes que não são de Automação. Isso usa o
protocolo over-the-wire para o desempenho máximo e ignora o cache de
propriedades.
A interface IADsContainer . Cada objeto do Active Directory tem um contêiner pai
que controla seu tempo de vida. Lembre-se de que, para objetos de contêiner do
ADs, IADs::GetInfo afeta apenas as propriedades do contêiner e não seu
conteúdo. Os objetos de contêiner SetInfo on ADs afetam apenas as propriedades
do contêiner e não afetam objetos ou objetos recém-criados que já existem dentro
do contêiner.
A interface IDispatch . Essa é a interface de Automação para idiomas como Visual
Basic Scripting Edition, que não usam associação de tempo de compilação.
Relacionados a isso estão os dados da biblioteca de tipos que um provedor deve
fornecer. Para obter mais informações, consulte Problemas de implementação para
provedores ADSI.
Um objeto de contêiner da classe de esquema e os objetos de classe de esquema,
propriedade e sintaxe apropriados que dão suporte a IADsSyntax, IADsProperty e
IADsClass , respectivamente. No mínimo, cada nó raiz deve conter seu próprio
objeto de contêiner de classe de esquema.
A interface IADsMembers , se algum atributo com suporte for coleções de objetos
ADSI, como grupos de segurança.
A interface IADsCollection , se algum atributo com suporte for coleções do
mesmo tipo de elemento de diretório com IADsCollection::Add e
IADsCollection::Remove capability.
A enumeração IEnumXXXX dá suporte a todos os objetos enumeradores
específicos.
Rotinas para mapear a sintaxe e converter dados nativos no tipo de dados
VARIANT .
Siga as convenções ADSI para objetos ADSI fornecidos pelo provedor. Inclua
arquivos de ajuda e bibliotecas de tipos que documentam as propriedades e
métodos da interface.

Assim como em qualquer implementação COM, as chamadas para QueryInterface


devem retornar E_NOINTERFACE para interfaces não simplificadas, E_NOTIMPL para
métodos não simplificados de interfaces que, de outra forma, são implementadas e
retornam E_ADS_PROPERTY_NOT_SUPPORTED para propriedades não simplificadas.
Para obter mais informações sobre interfaces duplas e como elas afetam a
implementação da propriedade, consulte Interfaces Duplas.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Implementação opcional
Artigo • 13/06/2023

Os seguintes recursos são opcionais, mas recomendados:

A interface IDirectorySearch para clientes que não são de Automação. Como o


provedor OLE DB adsi usa IDirectorySearch para apresentar consultas e coletar
resultados do serviço de diretório subjacente, os provedores que implementam
essa interface fornecem automaticamente acesso a bancos de dados de estilo OLE
DB sem precisar implementar interfaces adicionais.
As interfaces IADsSecurityDescriptor, IADsAccessControlList e
IADsAccessControlEntry . Os provedores de serviços de diretório que dão suporte
à segurança de objeto baseada em ACL são incentivados a implementar esses
recursos adicionais.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Propriedades personalizadas
Artigo • 13/06/2023

Os provedores podem expor objetos, interfaces e propriedades adicionais não definidos


pelo esquema ADSI.

Mais detalhes sobre as diretrizes de implementação para provedores podem ser


encontrados no documento Componente do Provedor de Exemplo ADSI.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interfaces duplas (ADSI)
Artigo • 03/06/2023

Use interfaces COM para acessar as propriedades e métodos em qualquer objeto ADSI
do provedor. Uma propriedade somente leitura é mapeada para uma entrada de
interface do formulário get_<PropertyName>. Uma propriedade de leitura/gravação é
mapeada para duas entradas de interface do formulário get_<PropertyName> e
put_<PropertyName>.

Todos os métodos em uma interface COM devem:

Retornar um valor HRESULT para indicar êxito ou falha. O tipo HRESULT é


discutido na especificação COM.
Em chamadas para QueryInterface, retorne E_NOINTERFACE para interfaces não
simplificadas.
Retorne E_NOTIMPL para métodos não simplificados em interfaces que, de outra
forma, são implementadas.
Retorne E_ADS_PROPERTY_NOT_SUPPORTED para propriedades de interface que
não têm suporte.

Para manter a compatibilidade com os controladores de Automação, todos os


parâmetros e tipos de retorno devem estar dentro do subconjunto definido pelo tipo de
dados AUTOMATION VARIANT. Para obter mais informações, consulte VARIANT e
VARIANTARG no SDK (Platform Software Development Kit).

Um objeto do Active Directory do provedor pode expor interfaces que usam tipos de
dados diferentes daqueles no subconjunto VARIANT . No entanto, controladores de
automação como Visual Basic não são capazes de chamar essas interfaces. A maioria
das interfaces do provedor ADSI são derivadas de IDispatch e podem ser usadas como
ponteiros de interface IDispatch . No entanto, as interfaces ADSI IDirectoryObject,
IDirectorySearch e IADsExtension não são derivadas de IDispatch.

Comentários
Esta página foi útil? ツ Yes ト No
Obter ajuda no Microsoft Q&A
Visão geral do provedor para ADSI
Artigo • 13/06/2023

Além dos Requisitos Mínimos do Provedor, outras informações de uso incluem:

Interação de componente ADSI descreve o contexto no qual o componente do


provedor é executado.
Interfaces de esquema discutem as interfaces de gerenciamento de esquema do
ponto de vista do provedor.
Enumerar Objetos de Contêiner descreve os requisitos para dar suporte a
enumerações.
As Informações do Registro do Provedor listam as entradas do Registro que um
provedor ADSI usa.
O suporte para consultas descreve os requisitos para dar suporte à pesquisa do
diretório.
Problemas de implementação para provedores ADSI incluem anotações aos
provedores sobre vários problemas de software.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interação de componente ADSI
Artigo • 13/06/2023

O componente de roteador do Active Directory preenche uma tabela de provedor ADSI


dos provedores ADSI instalados listados no registro quando recebe a primeira
solicitação do aplicativo cliente. Para obter mais informações sobre o Registro, consulte
Instalando o componente provedor de exemplo.

As operações que fazem uma solicitação de um diretório para um ponteiro para uma
interface em um objeto do Active Directory vêm por meio de uma função (GetObject no
Visual Basic ou ADsOpenObject ou ADsGetObject em C ou C++) ou um método de
interface ( IADsContainer::GetObject). Na figura a seguir, o aplicativo cliente ADSI passa
essa solicitação de associação para o componente do roteador ADSI (1). O componente
de roteador identifica o ProgID para o provedor da primeira parte do ADsPath e usa
CLSIDFromProgID para localizar o CLSID correspondente no Registro (2) e carrega o
componente de provedor adequado (3).

Na figura anterior, o componente do provedor cria um objeto do Active Directory que


representa o elemento de diretório nomeado. O componente de suporte adsi faz um
QueryInterface no identificador de interface solicitado. Quando um ponteiro para essa
interface é recuperado (4), como com todas as implementações de cliente/servidor
COM, ele é passado de volta para o cliente (5) e, a partir daí, o aplicativo cliente
funciona diretamente com o componente do provedor (6).
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interfaces de esquema
Artigo • 12/06/2023

O contêiner de esquema contém um conjunto de definições de esquema anexadas a


parte da árvore de namespace do provedor. Normalmente, cada instância de um
namespace tem seu próprio esquema. Por exemplo, na figura a seguir, o provedor de
exemplo ADSI define um contêiner de esquema em cada um dos nós raiz "Seattle" e
"Toronto".

Para criar uma implementação adsi para um provedor, você precisa fornecer objetos de
gerenciamento de esquema que refletem o namespace subjacente do provedor e que
dão suporte a interfaces de esquema ADSI. Veja a seguir uma lista das interfaces de
esquema ADSI, que estão contidas no contêiner de esquema.

IADsClass representa classes de serviço de diretório.


IADsProperty representa propriedades de serviço de diretório que têm valores
únicos ou múltiplos.
IADsSyntax representa o único tipo VARIANT.

As interfaces definidas pelo ADSI podem dar suporte a propriedades e sintaxes


específicas para seu provedor. Os provedores podem optar por estender uma definição
ADSI usando os métodos que criam e acessam propriedades, por exemplo, você pode
usar os métodos da interface IADs , como Get, GetEx, Put e PutEx. Os provedores
também podem dar suporte a propriedades adicionais por meio de interfaces
adicionais. Para obter uma lista completa de interfaces ADSI, consulte Interfaces ADSI.

Um componente do provedor ADSI com um namespace complexo pode permitir que


vários esquemas existam em uma instância de namespace, cada um em uma parte
diferente da árvore. No entanto, a propriedade IADs::Schema de um objeto sempre
nomeia sua própria definição de esquema.
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Extensões de esquema
Artigo • 13/06/2023

A arquitetura do esquema ADSI fornece que novas classes de esquema podem ser
adicionadas ao contêiner da classe de esquema e a novas propriedades a um objeto de
classe de esquema existente em tempo de execução. A última capacidade não requer
nenhum novo código. Esse é um recurso importante para namespaces que permitem
serviços de diretório extensíveis. O componente do provedor deve permitir essa
extensibilidade e saber onde acessar e armazenar a instância de classe e os valores de
suas propriedades. Em um serviço de diretório extensível típico, essas informações são
armazenadas no banco de dados do serviço de diretório da mesma maneira que
qualquer outra classe de esquema e definições de propriedade.

7 Observação

Na terminologia da interface COM, somente as propriedades podem ser


adicionadas a uma classe de esquema existente, não a métodos. Adicionar um
novo método exigiria a adição de uma nova implementação desse método e,
portanto, exigiria um código adicional.

Para obter um exemplo de um esquema de provedor específico, consulte


Gerenciamento de esquemas.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Enumerando objetos de contêiner
Artigo • 13/06/2023

Por convenção, todos os itens em uma enumeração no ADSI devem ser do mesmo tipo
de dados de Automação. Por exemplo, uma enumeração não deve retornar alguns itens
como uma VARIANT do tipo VT_I4 e outros como uma VARIANT do tipo VT_BSTR.

Para enumerar uma lista de itens que um objeto mantém, um cliente solicita a criação
de um objeto de enumeração para o tipo específico de informações que estão sendo
listadas. No ADSI, o cliente pode listar os objetos em objetos de namespace, objetos de
contêiner genéricos, objetos de coleção, objetos membro ou objetos de esquema. ADSI
fornece um filtro que pode ser definido e modificado para limitar as correspondências
em qualquer enumeração por meio da propriedade IADsContainer.Filter . Exemplos de
implementações de objetos enumeradores podem ser encontrados no código de
componente do provedor de exemplo para os seguintes objetos de contêiner do ADs.

Tipo de objeto code

Contêiner genérico cenumobj.cpp

Contêiner de namespace cenumns.cpp

Contêiner de esquema cenumsch.cpp

Para obter informações do lado do cliente, consulte Coleções e grupos.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Informações do Registro do Provedor
Artigo • 13/06/2023

O provedor é registrado com ADSI com as seguintes chaves e valores:

HKEY_LOCAL_MACHINE
SOFTWARE
Microsoft
ADs
Providers
provider = <provider namespace>

O provedor é registrado no Windows com as seguintes chaves e valores:

HKEY_CLASSES_ROOT
provider
Clsid
(Default) = <provider CLSID>

HKEY_CLASSES_ROOT
CLSID
provider CLSID
(Default) = <friendly display name>
InProcServer32
(Default) = <provider DLL filename>
ThreadingModel = Both
ProgID = <provider object name>
TypeLib = <provider TypeLib CLSID>
Version = <provider version number>

O namespace do provedor é registrado no Windows com as seguintes chaves e valores:

HKEY_CLASSES_ROOT
provider namespace
Clsid
(Default) = <provider namespace CLSID>
HKEY_CLASSES_ROOT
CLSID
provider namespace CLSID
(Default) = <friendly display name>
InProcServer32
(Default) = <provider namespace DLL filename>
ThreadingModel = Both
ProgID = <provider namespace object name>
TypeLib = <provider namespace TypeLib CLSID>
Version = <provider namespace version number>

Nos parágrafos anteriores, o provedor é o identificador do objeto de nível superior do


provedor. O namespace do provedor é o identificador do objeto que implementa o
namespace do provedor.

Para obter um exemplo específico, consulte Instalando o componente de provedor de


exemplo.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Suporte para consultas
Artigo • 13/06/2023

Ao implementar a interface IDirectorySearch , os provedores ADSI obtêm acesso a um


subconjunto de recursos somente leitura do OLE DB.

A implementação ADSI dos métodos do IDirectorySearch em si usa as interfaces OLE


DB descritas em ADSI versão 1.0, incluindo a seguinte lista de objetos COM:

Objeto fonte de dados (o serviço de diretório), dando suporte a IDBInitialize,


IDBCreateSession, IDBProperties e IPersist.
Objeto DBSessions, com suporte para IOpenRowSet, ISessionProperties e
ICreateCommand.
Objeto Command, com suporte para ICommand, IAccessor, IColumnsInfo,
ICommandProperties, ICommandText e IConvertType.
Objeto Rowset, com suporte para IAccessor, IColumnsInfo, IConvertType, IRowset
e IRowsetInfo.

Para obter mais informações sobre o OLE DB, consulte a Referência do programador
OLE DB no SDK (Platform Software Development Kit).

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Problemas de implementação para
provedores ADSI
Artigo • 03/06/2023

Para implementar interfaces ADSI, primeiro implemente a interface COM


IDirectoryObject. Ao fornecer essa interface como uma camada de sobrecarga mínima,
você fornece aos aplicativos cliente o controle necessário para acessar objetos de
diretório diretamente do diretório e não por meio do cache ADSI, que otimiza o
desempenho da rede. O uso dessa interface também fornecerá a sua própria
implementação com mais flexibilidade.

Em segundo lugar, implemente as interfaces ADSI fundamentais, IADs, IADsContainer,


IADsCollection e iadsPropertyValue, IADsPropertyEntry, iadsPropertyList interfaces de
cache de propriedade. IADsGroup e IADsMembers também são interfaces em demanda
frequente pelo software de administração do sistema.

Em terceiro lugar, implemente as interfaces de gerenciamento de esquema se o serviço


de diretório tiver um esquema subjacente: IADsClass, IADsProperty, IADsSyntax. Se não
houver nenhum esquema subjacente, use essas interfaces para abstrair as classes e as
propriedades usadas pelo serviço de diretório. Esquemas podem ser usados para
publicar os recursos do serviço de diretório em clientes ADSI.

Coleções
Os componentes do provedor ADSI podem seguir um dos três modelos para armazenar
coleções em cache durante a enumeração. A escolha de um modelo de cache determina
o comportamento de ADSI quando um objeto em uma coleção é excluído do serviço de
diretório subjacente externo ao ADSI.

Os modelos de cache incluem:

Coleções armazenadas em cache com antecedência. A coleção de instâncias de


objeto é recuperada do serviço de diretório subjacente em sua totalidade quando
IADsCollection::get__NewEnum é chamado para criar um novo objeto
enumerador. Se o objeto de origem de uma instância de objeto do Active
Directory na coleção recuperada for excluído do serviço de diretório subjacente, o
cliente não reconhecerá a exclusão até que um IADs::GetInfo ou IADs::SetInfo
tente acessar a coleção.
Coleções armazenadas em cache incrementalmente. A coleção é recuperada do
serviço de diretório subjacente um objeto por vez quando IEnumVARIANT::Next é
chamado. IEnumVARIANT::Reset retornará ao início da coleção no cache e
IEnumVARIANT::Next retornará objetos armazenados em cache até que o final do
cache seja atingido, momento em que novos objetos serão adicionados do
repositório subjacente. Quando uma instância de objeto do Active Directory estiver
no cache, o cliente não ficará ciente de sua exclusão do serviço de diretório
subjacente até que um IADs::GetInfo ou IADs::SetInfo tente acessar o objeto.
Coleções não armazenadas em cache. A coleção é recuperada do serviço de
diretório subjacente um objeto por vez quando IEnumVARIANT::Next é chamado.
IEnumVARIANT::Reset retornará ao início da coleção no repositório subjacente. As
operações IEnumVARIANT::Next e IEnumVARIANT::Reset não podem recuperar
objetos excluídos, pois os objetos são recuperados sob demanda do serviço de
diretório subjacente. Somente o objeto atual é armazenado em cache; se o objeto
atual for excluído, o cliente não ficará ciente de sua exclusão do serviço de
diretório subjacente até que um IADs::GetInfo ou IADs::SetInfo tente acessar o
objeto.

Independentemente do modelo de cache, lembre-se de que a enumeração ADSI retorna


interfaces de serviço do Active Directory para o chamador. Para evitar a sobrecarga de
obter um novo ponteiro de interface, os aplicativos ADSI devem armazenar em cache os
ponteiros de interface retornados para objetos que eles pretendem manipular. Por
exemplo, um aplicativo Visual Basic que enumera um contêiner e preenche uma caixa
de listagem com nomes pode armazenar em cache os ponteiros de interface associados
aos nomes para uso posterior. Essa abordagem fornecerá um desempenho maior do
que preencher a caixa de listagem durante a enumeração e obter um novo ponteiro de
interface quando o usuário fizer uma seleção.

Sobre as IDs de Expedição


IDispatch é uma interface de Automação definida pelo COM para controladores que
não usam interfaces COM diretamente. O acesso a um objeto por meio do IDispatch é
chamado de acesso associado ao nome ou de limite tardio, pois ele ocorre em tempo
de execução ("tarde") e usa nomes de cadeia de caracteres de propriedades e métodos
para resolver referências ("name"). Em tempo de execução, os clientes passam o nome
da cadeia de caracteres da propriedade ou método que desejam chamar para o método
IDispatch::GetIDsOfNames(). Se a propriedade ou o método existir no objeto, o
identificador de expedição (dispID) da função correspondente será recuperado. O dispID
é usado para executar a função por meio de IDispatch::Invoke(). Usando IDispatch,
propriedades e métodos nas interfaces expostas por um único objeto aparecem como
uma lista simples. Como o acesso associado ao nome requer duas chamadas de função,
ele é menos eficiente do que usar uma interface COM diretamente. Os clientes são
incentivados a usar as interfaces ADSI COM nos objetos quando o desempenho é uma
consideração. Controladores avançados de Automação, como Visual Basic 4.0, podem
chamar outras interfaces COM, bem como IDispatch, se as interfaces estiverem em
conformidade com as restrições de Automação para tipos de dados e passagem de
parâmetro.

Os provedores ADSI geram dispIDs dinamicamente para cada objeto do Active


Directory. Os dispIDs recuperados por meio de IDispatch::GetIDsOfNames para um
determinado objeto são os valores gerados, mas não os valores que estão na IDL do
objeto. Os usuários de IDispatch devem chamar GetIDsOfNames para obter dispIDs
válidos em tempo de execução.

Informações de tipo e bibliotecas de tipos


O SDK do ADSI fornece uma biblioteca de tipos, Activeds.tlb, que documenta todas as
interfaces padrão com suporte do ADSI. Um provedor deve fornecer uma biblioteca de
tipos semelhante para todas as interfaces encontradas no Activeds.tlb, além de
quaisquer dados de tipo adicionais para as interfaces implementadas no componente
do provedor.

Veja a seguir um exemplo de código IDL.

syntax

[ object, uuid(IID_IADsXYZ), oleautomation, dual ]


interface IADsXYZ: IDispatch
{
// Read-only properties.
[propget]
HRESULT AReadOnlyProp ([out, retval]BSTR *pbstrAReadOnlyProp);

// Read/write properties.
[propget]
HRESULT AReadWriteProp ([out, retval]long *plAReadWriteProp);
[propput]
HRESULT AReadWriteProp ([in]long lAReadWriteProp);

// Methods.
HRESULT AMethod ([in]DATE dateInParameter,
[out, retval]BSTR *pbstrReturnValue);
};

Acesso thread-safe
O COM (Component Object Model) descreve os três modelos de threading a seguir.
Aplicativos COM indicam qual modelo está em uso ao inicializar a biblioteca COM
usando as funções CoInitialize e CoInitializeEx :

Threading único. O único modelo threaded pressupõe um único thread de


execução em um processo, supondo ainda que as estruturas de dados COM em
um processo não precisem de serialização de acesso.
Threading de apartamento. Um objeto COM está associado ao thread que o criou.
As chamadas para um objeto em outro thread devem ser executadas pelo thread
que criou esse objeto. Para fazer isso, o thread de origem invoca um proxy cliente
que organiza a chamada de método e a entrega a uma função de stub de servidor
no thread de destino por meio da fila de mensagens Win32 associada ao thread
de destino.
Threading gratuito. Presume-se que os objetos COM sejam thread safe. Vários
threads têm acesso permitido a qualquer objeto no processo sem nenhuma
serialização imposta.

O ADSI não pressupõe nenhum modelo de threading específico. Os gravadores de


componentes de provedor devem assumir o modelo de threading gratuito e garantir a
consistência de suas estruturas de dados internas protegendo-as contra threads não
seguros, ou seja, descoordenados, atualizações por meio do uso de objetos de
sincronização, como seções críticas ou semáforos.

Bloqueio de objeto
O ADSI não impõe nem define um esquema de bloqueio de objetos. Os provedores de
namespaces que dão suporte à serialização de acesso usando bloqueio podem expor o
esquema de bloqueio subjacente por meio de extensões específicas do provedor para
ADSI.

Nomes de propriedade dentro de um esquema


ADSI representa propriedades como objetos de propriedade dentro do contêiner de
esquema ADSI. Isso exige que os nomes de propriedades sejam exclusivos em cada
contêiner de esquema. O provedor deve garantir que não haja colisões de nome.

Interface primária
Quando um provedor não consegue identificar qual interface deve ser retornada como
a interface primária, IID_IADs deve ser retornado. Isso fornece acesso associado ao
nome a todas as propriedades de um objeto por meio do IDispatch e dos métodos
IADs::Get, IADs::GetEx, IADs::P ut e IADs::P utEx .
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Componente de provedor de exemplo
ADSI
Artigo • 12/06/2023

Os gravadores do provedor de Interfaces de Serviço do Active Directory encontrarão


esta seção de interesse específico, pois ela descreve o componente de provedor de
exemplo ADSI em detalhes. Os gravadores de provedor ADSI podem instalar o provedor
de exemplo e usar a estrutura de código como base para criar sua própria
implementação. Os seguintes tópicos são abordados:

Instalar o Componente de Provedor de Exemplo descreve como instalar o provedor de


exemplo ADSI e seu diretório fictício. Esta seção inclui uma lista das configurações do
Registro.

Definição de diretório descreve as entradas de diretório definidas pelo componente de


provedor de exemplo.

O Gerenciamento de Esquemas descreve como cada elemento no serviço de diretório


de componentes do provedor de exemplo pode ser representado por um tipo
específico de objeto do Active Directory.

A associação a um objeto do Active Directory descreve como, dada uma cadeia de


caracteres ADsPath, o componente de provedor de exemplo identifica esse elemento,
cria o tipo apropriado de objeto do Active Directory para ele e recupera o tipo solicitado
de ponteiro de interface nesse objeto para passar de volta para o software cliente do
ADs.

Objetos Enumeradores lista os tipos específicos de enumerações fornecidos pelo


componente de provedor de exemplo e em que código-fonte as implementações
podem ser encontradas.

A Visão geral do código fornece uma descrição no nível da tarefa de cada parte do
componente de provedor de exemplo.

Detalhes do Código lista os módulos de software e seu conteúdo.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Instalando o componente de provedor
de exemplo
Artigo • 03/06/2023

Depois de instalar o SDK do ADSI, do diretório de instalação, altere os diretórios para o


subdiretório Samples\NetDs\ADSI\Samples\Provider\Setup. Execute Install.bat conforme
descrito no arquivo README.TXT.

O provedor ADSI de exemplo adicionará as seguintes subchaves e valores ao registro


quando Install.bat arquivo for executado:

HKEY_LOCAL_MACHINE
SOFTWARE
Microsoft
ADs
Providers
Sample = SampleNamespace

HKEY_CLASSES_ROOT
SampleNamespace
Clsid = {F46430D0-CBfB-11CE-A9F7-00AA00B67689}

HKEY_CLASSES_ROOT
Sample
Clsid = {F46430D1-CBfB-11CE-A9F7-00AA00B67689}

HKEY_CLASSES_ROOT
CLSID
{F46430D0-CBfB-11CE-A9F7-00AA00B67689}
(Default) = Sample Namespace Object
InprocServer32
(Default) = adssmp.dll
ThreadingModel = Both
ProgID
(Default) = SampleNamespace
TypeLib
(Default) = {F46430D2-CBfB-11CE-A9F7-00AA00B67689}
Version
(Default) = 0.0

HKEY_CLASSES_ROOT
CLSID
{F46430D1-CBfB-11CE-A9F7-00AA00B67689}
(Default) = Sample Provider Object
InprocServer32
(Default) = adssmp.dll
ThreadingModel = Both
ProgID
(Default) = Sample
TypeLib
(Default) = {F46430D2-CBfB-11CE-A9F7-00AA00B67689}
Version
(Default) = 0.0

Outras entradas de registro para o componente de provedor de exemplo existem


porque o componente de provedor de exemplo implementou sua hierarquia de
diretório no registro. Isso de forma alguma implica que outros provedores gostariam ou
deveriam fazer o mesmo.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Definição de diretório
Artigo • 13/06/2023

O componente de provedor de exemplo usa um design de diretório relativamente


simples para esclarecer a relação entre componentes e mostrar os requisitos mínimos
necessários para ser um provedor ADSI.

O "diretório" para o componente de provedor de exemplo consiste em dois nós raiz:


"Seattle" e "Toronto". Seattle contém mais dois subnível, "Bellevue" e "Redmond". Cada
uma dessas entradas contém várias contas de usuário. A entrada "Toronto" não tem
mais subnível, mas contém diretamente várias contas de usuário. A figura a seguir
mostra esses dois nós raiz conectados a uma rede.

Em termos hierárquicos, o nó Namespace contém "Seattle" e "Toronto". "Seattle"


contém "Bellevue" e "Redmond". "Bellevue" e "Redmond" contêm um conjunto de
contas de usuário. "Toronto" contém diretamente as contas de usuário sem nós
organizacionais intermediários.

O componente de provedor de exemplo representa essa estrutura com apenas dois


tipos de objeto do Active Directory: um objeto de contêiner e um objeto folha. "Seattle",
"Toronto", "Bellevue" e "Redmond" são objetos de contêiner e cada conta de usuário é
um objeto folha.

O componente de provedor de exemplo cria uma classe de esquema chamada "Unidade


Organizacional" para um tipo de objeto de contêiner e uma classe de esquema
chamada "User" para uma conta de usuário.
As propriedades de cada classe de esquema, seus métodos e as regras que regem as
relações de contenção para esses objetos são definidas no Gerenciamento de
Esquemas.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Gerenciamento do esquema
Artigo • 12/06/2023

O componente de provedor de exemplo ADSI define as classes de esquema "Unidade


Organizacional" e "Usuário" e gerencia essas classes de esquema da seguinte maneira.

A classe de esquema "Unidade Organizacional" é representada por um objeto de


contêiner do ADs e pode conter outras "Unidades Organizacionais" e "Usuários". O
objeto contêiner dá suporte às interfaces IUnknown, IDispatch, IADs e IADsContainer. A
classe de esquema "User" é representada por um objeto genérico do Active Directory e
não contém outros tipos de objetos. No componente de provedor de exemplo, o objeto
User é implementado como um objeto genérico do Active Directory que dá suporte às
interfaces IUnknown, IDispatch e IADs. Lembre-se de que o objeto User, nesse caso,
não dá suporte à interface IADsUser .

O componente de provedor de exemplo também deve implementar o objeto de


namespace do ADs, que dá suporte às interfaces IUnknown, IADs, IADsContainer,
IADsOpenDSObject e IDispatch.

A figura a seguir mostra os detalhes do esquema que representa as duas classes de


esquema de componente de provedor de exemplo.

Lembre-se de que, na figura anterior, a classe de esquema "Unidade Organizacional"


define três propriedades: "Description", "Headcounts" e "ID". A classe de esquema
"User" define quatro propriedades: "ID", "Name", "PhoneNumber" e "Title". A
propriedade "ID" é compartilhada por ambas as classes de esquema. Cada propriedade
é definida pelo objeto de sintaxe "String" ou "Integer".

7 Observação

Os objetos de sintaxe não estão presentes na primeira versão do componente de


provedor de exemplo. No entanto, na maioria das implementações de esquema
adsi da Microsoft, os objetos de sintaxe são incluídos no objeto contêiner de
esquema, assim como a classe de esquema e os objetos de propriedade são. Por
esse motivo, eles são mostrados aqui.

Esse componente de provedor torna os dados de esquema acessíveis para o aplicativo


cliente ADSI na forma de objetos de classe do ADs, objetos de propriedade do ADs e
objetos de sintaxe ADs, tudo dentro de um objeto de contêiner de classe de esquema,
para que os dados de esquema possam ser recuperados em tempo de execução.

Os ADsPaths para os objetos de contêiner da classe de esquema definidos para o


componente de provedor de exemplo são "Sample://Seattle/schema" e
"Sample://Toronto/schema". Neste exemplo, o conteúdo dos esquemas é idêntico.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Associação a um objeto do Active
Directory
Artigo • 13/06/2023

A maneira mais comum de associar a um objeto do Active Directory é usar a função


GetObject entre um cliente ADSI e um provedor ADSI. Essa também é a maneira mais
fácil de mostrar como o componente do provedor recebe e solicitações de serviços. A
função de API ADSI ADsGetObject ou a função GetObject do Visual Basic seguem as
mesmas etapas para associação.

Para este exemplo, suponha que o cliente ADSI seja um aplicativo visualizador ADSI que
recebeu o ADsPath "Sample://Seattle/Redmond/Shelly" de sua interface do usuário (1).
A figura a seguir detalha a sequência de eventos numerando as setas de fluxo.

Na figura anterior, o cliente inicia a solicitação de um ponteiro de interface no objeto do


Active Directory representado pelo ADsPath "Sample://Seattle/Redmond/Shelly" dos
serviços ADSI (2). Durante a inicialização, o software de serviços preencheu uma tabela
de ProgIDs (identificadores programáticos) do provedor instalado do registro
("LDAP:","Sample:", "WinNT:" e assim por diante) e os emparelhou com os
CLSIDcorrespondentes que identificam o módulo de software apropriado.

O servidor ADSI verifica se o ProgID, neste caso , "Sample:", existe no ADsPath. Em


seguida, ele cria um contexto de associação para otimizar outras referências a esse
objeto e chama a função COM padrão MkParseDisplayName para criar um moniker
COM que pode ser usado para localizar e associar ao objeto que representa o usuário
"Shelly".

Na seção a seguir, os nomes de arquivo do código-fonte do componente do provedor


de exemplo são incluídos entre parênteses, quando apropriado.

Como em outras implementações de servidor COM, MkParseDisplayName examina o


ProgID e pesquisa o CLSID adequado no registro (3) para localizar o código de fábrica
de classe fornecido pelo provedor correspondente (Cprovcf.cpp) na implementação do
provedor apropriada (4). Esse código cria um objeto inicial de nível superior que
implementa o método IParseDisplayName::P arseDisplayName (Rcpov.cpp). A
implementação de ParseDisplayName pelo provedor resolve o caminho no próprio
namespace do provedor. Isso eventualmente chama ADsObject e invoca o analisador
fornecido com o componente do provedor (Parse.cpp) para verificar se o ADsPath está
sintaticamente correto para esse namespace.

GetObject, que é definido em Getobj.cpp, determina se o objeto solicitado é um objeto


de namespace, um objeto de esquema ou algum outro tipo de objeto. Se um dos dois
primeiros, esse tipo de objeto de classe de esquema será criado e o ponteiro de
interface apropriado será recuperado. Caso contrário, o caminho do diretório de
exemplo é criado a partir do ADsPath (por exemplo, "\Seattle\Redmond\Shelly", mas em
um serviço de diretório diferente pode ter sido
"\OU=Seattle\OU=Redmond\CN=Shelly") e o controle passa para
SampleDSOpenObject, que abre o objeto no armazenamento de dados de exemplo e
também recupera seu tipo de objeto (nesse caso, "Usuário") (5).

Com os dados coletados, um novo objeto é criado (6) para representar o item descrito
pelo ADsPath e um ponteiro para a interface IUnknown nesse objeto é recuperado.
Nesse caso, é criado um objeto genérico do Active Directory que dá suporte aos
métodos IUnknown e IADs (Cgenobj.cpp, Core.cpp). A rotina
CSampleDSGenObject::AllocateGenObject lê os dados da biblioteca de tipos para criar
as entradas de expedição adequadas para esses novos objetos a fim de dar suporte a
IDispatch.

Encapsular esse ponteiro de interface em um moniker conclui a função


ResolvePathName (Rcpov.cpp) e analisa o nome de exibição.

Todos os objetos COM criados durante esse processo são armazenados em cache por
motivos de desempenho e gerenciados por meio do contexto de associação. Isso
melhora o desempenho de outras operações no mesmo objeto que segue
imediatamente a associação de moniker.
Esse objeto do Active Directory bem formado agora é consultado para o identificador
de interface solicitado para a chamada inicial ADsGetObject e um ponteiro para essa
interface é recuperado (7) e passado de volta pelo servidor ADSI para o cliente (8&9). A
partir daí, o cliente trabalha diretamente com o componente do provedor por meio dos
métodos de interface até que a solicitação inicial seja atendida (10).

Além disso, as solicitações de dados de objeto do cliente geralmente assumem a forma


de solicitações para obter e colocar propriedades, todas otimizadas por meio da
implementação do provedor de um cache de propriedades (Cprops.cpp). Empacotar e
desempacotar dados de forma inteligente, geralmente incluindo copiar e liberar
estruturas e cadeias de caracteres, entre os tipos de dados nativos no sistema
operacional do componente de provedor de exemplo e o tipo VARIANT de Automação
compatível com ADSI ocorre antes que as propriedades sejam carregadas no cache
(Smpoper.cpp).

O componente de provedor de exemplo foi projetado para que as chamadas reais para
o sistema operacional sejam logicamente isoladas do componente do provedor, criando
um software portátil para mais de um sistema operacional (RegDSAPI.cpp).

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Objetos Enumeradores
Artigo • 13/06/2023

O código de componente do provedor de exemplo fornece a implementação da criação


de objetos enumeradores para o objeto de namespace do ADs (cenumns.cpp), objetos
de contêiner ADSI genéricos (cenumobj.cpp), objetos de contêiner de esquema ADSI
(cenumsch.cpp).

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Visão geral do código
Artigo • 13/06/2023

A figura a seguir é uma representação conceitual dos blocos de código necessários para
implementar o componente de provedor de exemplo ADSI. Cada seção é descrita na
figura a seguir. Programadores COM experientes podem achar que essa é uma visão
geral adequada do componente de provedor de exemplo. Para obter mais informações,
consulte Detalhes do código.

Os itens numerados a seguir correspondem aos elementos de bloco na figura.

1. Carregando a DLL (Libmain.cpp, Guid.cpp). O ponto de entrada para a DLL.


Definições de objeto estático de fábrica de classe para os dois objetos de
provedor: Guid.cpp contém as definições CLSID para as implementações dos vários
objetos de componente do provedor de exemplo.
2. Fábrica e código de criação da classe de objeto provider (Cprovcf.cpp, Rcpov.cpp,
Stdfact.cpp). O objeto do provedor é o objeto que dá suporte a
IParseDisplayName durante as operações de associação de moniker, conforme
discutido em Localizando e associando no componente provedor de exemplo.
3. Associação a um objeto (Getobj.cpp). Esse código chama o analisador para marcar
que o ADsPath fornecido está sintaticamente correto e, em seguida, executa
qualquer mapeamento necessário do ADsPath para o caminho do serviço de
diretório nativo para o item que está sendo criado como um objeto do Active
Directory. Ele pesquisa a definição de esquema para esse tipo de objeto e
preenche as propriedades obrigatórias. Depois de criar o objeto do Active
Directory, um ponteiro de interface para IUnknown é recuperado para o
chamador.
4. Analisador do namespace do provedor (Parse.cpp). Esse é o código invocado pelo
item 3. O analisador verifica se a cadeia de caracteres ADsPath passada está
sintaticamente correta para seu próprio namespace.
5. Fábrica de classes, criação e enumeração para o objeto namespace (Cnamcf.cpp,
Cnamesp.cpp, Cenumns.cpp). O objeto namespace é um objeto de contêiner que
pode ser enumerado para localizar todos os objetos de nó raiz para esse
namespace.
6. Código de criação e fábrica de classes para um objeto genérico do Active Directory
e fábrica de classes, código de criação e enumeração para um objeto de contêiner
genérico do ADs (Cgenobj.cpp, Cenumobj.cpp, Common.cpp, Core.cpp). Esse
código é executado quando um objeto do Active Directory é criado.
7. Filtragem e enumeração de VARIANTs (Cenumvar.cpp, Object.cpp). Quando uma
coleção de elementos VARIANT de um único tipo é gerenciada no ADSI, esse
código é usado.
8. Globals (Globals.cpp). Palavras-chave de namespace, estruturas de mapeamento
de sintaxe de formatos de dados nativos para o tipo VARIANT de Automação do
ADs estão definidas aqui.
9. Dados de marshaling/unmarshaling (Pack.cpp, Property.cpp, Smpoper.cpp). A
conversão de formatos de dados nativos para o conjunto com suporte de tipos
VARIANT de Automação ocorre quando as propriedades de um objeto são
carregadas no cache de propriedades. Outros tratamentos especiais para dados
devem ser executados quando estruturas com ponteiros são copiadas, excluídas
ou movidas na memória.
10. Cache de propriedades (Cprops.cpp). As propriedades de cache são um recurso do
ambiente ADSI. Os métodos IADs::GetInfo, IADs::GetInfoEx e IADs::SetInfo atuam
no cache de propriedades.
11. Gerenciamento de memória (Memory.cpp). Usar um conjunto de funções de
memória para alocar e liberar memória permite que o componente de provedor
de exemplo acompanhe o uso de memória e interrompa vazamentos de memória.
12. Gerenciamento e objetos de esquema (Cschobj.cpp, Rcppobj.cpp, Cclsobj.cpp,
Cenumsch.cpp). Isso inclui rotinas para criar, gerenciar e enumerar os objetos de
esquema. Isso inclui objetos de classe de esquema, objetos de propriedade e
objetos de sintaxe, além de poder enumerar o objeto contêiner da classe de
esquema.
13. Chamadas específicas do sistema operacional (RegDSAPI.cpp). Isso inclui todas as
chamadas que fazem referência ao sistema operacional nativo. Entre outras
funções, elas incluem funções abrindo, fechando, lendo e modificando objetos,
bem como aquelas que acessam os dados de esquema e propriedade. O
componente de provedor de exemplo passou a simular uma hierarquia de
diretório usando o Registro. Somente os nomes de função devem ser de grande
interesse para um gravador de provedor.
14. Implementação de IDispatch (Cdispmgr.cpp). Esse código acessa os dados da
biblioteca de tipos para permitir que os métodos de interface sejam invocados de
maneira compatível com a Automação.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Detalhes do código
Artigo • 13/06/2023

Esta seção lista o código-fonte para a implementação do componente do provedor de


exemplo ADSI. Todas as referências de código-fonte neste documento estão sujeitas a
alterações e estão disponíveis no diretório de código de exemplo incluído no SDK adsi.

7 Observação

Os métodos IADsGetEx e PutEx não são implementados no componente de


provedor de exemplo ADSI. Ou seja, o código que implementa objetos do Active
Directory herdados de IADs não tem métodosGetEx e PutEx . Isso inclui o objeto
de classe de esquema que dá suporte a IADsClass, o objeto de propriedade que dá
suporte a IADsProperty, o objeto active directory genérico que dá suporte a IADs e
qualquer objeto de contêiner que dê suporte a IADsContainer. Além disso, os
objetos de sintaxe não estão presentes no componente de provedor de exemplo.
No entanto, a arquitetura ADSI exige que os objetos de sintaxe sejam incluídos no
objeto contêiner de esquema, assim como a classe de esquema e os objetos de
propriedade.

A tabela a seguir lista os arquivos de código-fonte incluídos no diretório de exemplo do


provedor no SDK de Interfaces de Serviço do Active Directory.

Arquivo de Descrição
código-fonte

cclsobj.cpp Rotinas de objeto da classe de esquema.

cdispmgr.cpp Implementação do Gerenciador de Expedição.

cenumns.cpp Rotinas de enumeração de namespace.

cenumsch.cpp Rotinas de enumeração de esquema.

cenumobj.cpp Rotinas de enumeração de objeto genérico.

cenumvar.cpp Implementação base para classes derivadas xxxEnumVariant.

cgenobj.cpp Rotinas de objeto genérico.

cnamcf.cpp Rotinas de fábrica de classes de namespace.


Arquivo de Descrição
código-fonte

cnamesp.cpp Rotinas de objeto de namespace.

common.cpp Código comum a todos os objetos do provedor.

core.cpp Implementações para propriedades 'core' compartilhadas por todos os objetos


do Active Directory.

cprops.cpp Recursos de cache de propriedades.

cprov.cpp Rotinas de objeto de provedor de nível superior.

cprovcf.cpp Rotinas de fábrica de classe de objeto de provedor de nível superior.

cprpobj.cpp Rotinas de objeto de propriedade.

cschobj.cpp Rotinas de objeto de esquema.

getobj.cpp Recurso GetObject.

globals.cpp Exemplo adsi de componentes globais do provedor.

guid.cpp Exemplo de componente do provedor CLSIDs e LIBIDs.

libmain.cpp Libmain para adssmp.dll.

memory.cpp Exemplo de rotinas de gerenciamento de memória de componente do provedor.

pack.cpp Exemplo de pacote de componentes do provedor/desempacotar dados em


VARIANTs.

parse.cpp Análise de caminho, por exemplo, namespace de componente do provedor.

property.cpp Obter e Colocar propriedades por nome.

object.cpp Exemplo de código de lista de tipos de objeto de componente do provedor para


filtragem.

regdsapi.cpp Exemplo de APIs do serviço de diretório do registro de componentes do


provedor.

smpoper.cpp Rotinas de conversão de dados.

stdfact.cpp Implementação padrão do IClassFactory .

adssmp.inf Exemplo de dados de armazenamento de dados do diretório dados do Registro.


Para obter mais informações, consulte Instalando o componente provedor de
exemplo.
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


CCLSOBJ. CPP
Artigo • 13/06/2023

No componente de provedor de exemplo, as funções do objeto de classe de esquema


estão contidas em cclsobj.cpp.

A classe CSampleDSClass é definida neste arquivo. CSampleDSClass é definido com


métodos e propriedades listados na tabela a seguir.

Método Descrição

CSampleDSClass Construtor padrão.

~CSampleDSClass Destruidor padrão.

CreateClass Crie um objeto de classe de esquema do ADs. Pesquise definições de


atributo chamando SampleDSGetClassDefinition.

CreateClass Crie um objeto de classe de esquema, considerando as definições de


atributo, definindo atributos conhecidos, como aqueles listados em
IADsClass::MandatoryAttributes.

AllocateClassObject Crie um objeto de classe de esquema e carregue seus dados de tipo.

QueryInterface Retornar o ponteiro de interface solicitado, se disponível.

Métodos iads padrão. Métodos de interface IADs padrão incluídos neste arquivo.

Métodos IADsClass Métodos de interface IADsClass padrão incluídos neste arquivo.


padrão.

CreatePropertyList Crie uma lista de propriedades associadas a essa classe de esquema


chamando CreatePropertyEntry.

CreatePropertyEntry Crie um objeto de propriedade nesta classe de esquema.

FreePropertyEntry Libere a entrada feita em CreatePropertyEntry.

MakeVariantFromPropList Crie uma matriz de VARIANTS a partir da lista de propriedades criada


por CreatePropertyList. Pode ser usado na implementação de
IADsClass::MandatoryAttributes e assim por diante.
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


CDISPMGR. CPP
Artigo • 03/06/2023

No componente de provedor de exemplo, um exemplo de código que mostra a


implementação do gerenciador de expedição da interface IDispatch está em
cdispmgr.cpp. Para obter mais informações, consulte IDispatch.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


CENUMNS. CPP
Artigo • 03/06/2023

No componente de provedor de exemplo, a enumeração de um objeto namespace usa


os métodos, de cenumns.cpp, listados na tabela a seguir.

Método Descrição

CSampleDSNamespaceEnum::Create Crie um objeto para permitir a


enumeração de um objeto de
namespace ADS.

CSampleDSNamespaceEnum::CSampleDSNamespaceEnum Construtor padrão.

CSampleDSNamespaceEnum::~CSampleDSNamespaceEnum Destruidor padrão.

CSampleDSNamespaceEnum::Next Recupere o número especificado


de elementos do objeto
namespace indicado.

CSampleDSNamespaceEnum::EnumObjects Gerenciar a recuperação dos


ponteiros da interface para os
objetos.

CSampleDSNamespaceEnum::FetchObjects Busque o conjunto de ponteiros


IDispatch .

CSampleDSNamespaceEnum::FetchNextObject Busque o próximo objeto. Se


encontrado, crie um objeto active
directory genérico e recupere seu
ponteiro IDispatch .

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


CENUMSCH. CPP
Artigo • 03/06/2023

No componente de provedor de exemplo, a enumeração de um objeto de esquema usa


os métodos, de cenumsch.cpp, listados na tabela a seguir.

Método Descrição

CSampleDSSchemaEnum::Create Crie um objeto para permitir a


enumeração de um objeto de classe de
esquema ADSI.

CSampleDSSchemaEnum::CSampleDSSchemaEnum Construtor padrão.

CSampleDSSchemaEnum::~CSampleDSSchemaEnum Destruidor padrão.

CSampleDSSchemaEnum::Next Recupere o número especificado de


elementos do objeto de esquema
indicado.

CSampleDSSchemaEnum::EnumObjects Gerencie a recuperação dos ponteiros


das interfaces para os objetos do tipo de
objeto indicado.

CSampleDSSchemaEnum::EnumObjects Gerencie a recuperação dos ponteiros da


interface para os objetos do tipo de
objeto padrão.

CSampleDSSchemaEnum::EnumClasses Gerencie a recuperação dos ponteiros da


interface apenas para os objetos da
classe de esquema contidos neste
objeto.

CSampleDSSchemaEnum::GetClassObject Recuperar a próxima definição de classe


de esquema; se encontrado, crie um
objeto de classe de esquema e retorne o
ponteiro da interface.

CSampleDSSchemaEnum::EnumProperties Gerencie a recuperação dos ponteiros da


interface para os objetos de propriedade
contidos somente neste objeto.

CSampleDSSchemaEnum::GetPropertyObject Recuperar a próxima definição de


propriedade; se encontrado, crie um
objeto de classe de esquema e retorne o
ponteiro da interface.
Método Descrição

CSampleDSSchemaEnum::EnumSyntaxes Gerencie a recuperação dos ponteiros da


interface para os objetos de sintaxe
contidos somente neste objeto.

CSampleDSSchemaEnum::GetSyntaxObject Recuperar a próxima definição de


sintaxe; se encontrado, crie um objeto de
classe de esquema e retorne o ponteiro
da interface.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


CENUMOBJ. CPP
Artigo • 03/06/2023

No componente de provedor de exemplo, a enumeração de um objeto de contêiner usa


as rotinas, de cenumobj.cpp, listadas na tabela a seguir.

Método Descrição

CSampleDSGenObjectEnum::Create Crie um objeto para habilitar a


enumeração de objetos genéricos
do Active Directory.

CSampleDSGenObjectEnum::CSampleDSGenObjectEnum Inicialização.

CSampleDSGenObjectEnum::EnumGenericObjects Gerenciar a recuperação de objetos.

CSampleDSGenObjectEnum::FetchObjects Recupere o conjunto de ponteiros


IDispatch que correspondem ao
filtro.

CSampleDSGenObjectEnum::FetchNextObject Recupere um objeto e corresponda


ao filtro. Se corresponder,
embrulhe-o no objeto genérico e
retorne um ponteiro IDispatch .

CSampleDSGenObjectEnum::EnumGenericObjects Gerenciar a recuperação dos


objetos.

CSampleDSGenObjectEnum::Next Recupere o número especificado de


elementos do objeto de
enumeração indicado.

CSampleDSGenObjectEnum::IsValiddsFilter Verifique se a classe de objeto


corresponde a uma na lista de
filtros.

CSampleDSGenObjectEnum::BuildDSFilterArray Gerencie a matriz de filtro.

CSampleDSGenObjectEnum::CreateAndAppendFilterEntry Adicione uma nova classe de objeto


ao filtro e defina o filtro como
contíguo.

FreeFilterList Libere o filtro.


Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


CENUMVAR. CPP
Artigo • 03/06/2023

No componente de provedor de exemplo, a implementação base para classes derivadas


xxxEnumVariant pode ser encontrada em cenumvar.cpp. Os métodos associados estão
listados na tabela a seguir.

Método Descrição

CSampleDSEnumVariant::CSampleDSEnumVariant Construtor padrão.

CSampleDSEnumVariant::~CSampleDSEnumVariant Destruidor padrão.

CSampleDSEnumVariant::QueryInterface Implementação padrão de


IUnknown::QueryInterface .

CSampleDSEnumVariant::AddRef Implementação padrão de


IUnknown::AddRef .

CSampleDSEnumVariant::Release Implementação padrão de


IUnknown::Release .

CSampleDSEnumVariant::Skip Implementação padrão IEnumXXXX::Skip .

CSampleDSEnumVariant::Reset Implementação padrão IEnumXXXX::Reset


.

CSampleDSEnumVariant::Clone Implementação padrão


IEnumXXXX::Clone .

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


CGENOBJ. CPP
Artigo • 13/06/2023

No componente de provedor de exemplo, os métodos genéricos de objeto do Active


Directory, com suporte em cgenobj.cpp, são listados na tabela a seguir.

Método Descrição

CSampledSGenObject::CSampledSGenObject Construtor padrão.

CSampleDSGenObject::~CSampledSGenObject Destruidor padrão.

CSampleDSGenObject::CreateGenericObject Crie um objeto genérico ADS. Inicialize


conforme apropriado.

CSampleDSGenObject::SampleDSCreateObject Crie esse objeto em seu contêiner pai.

CSampleDSGenObject::SampleDSSetObject Salve as propriedades desse objeto


(desmarque o cache).

CSampleDSGenObject::AllocateGenObject Crie um objeto genérico e carregue seus dados


de tipo.

CSampleDSGenObject::QueryInterface Retornar o ponteiro de interface solicitado, se


disponível.

Métodos iads padrão, incluindo Obter (incluindo o mapeamento do tipo de


implementações para: dados nativo para o tipo VARIANT) Put
(incluindo o mapeamento do tipo VARIANT
para o tipo de dados nativo)
GetInfo (atualizar o cache de propriedades)
SetInfo (salve o cache de propriedades)

Métodos IADsContainer padrão, incluindo Get__NewEnum GetObject


implementações para: get_Filter
Criar
Excluir

ConvertSafeArrayToVariantArray Rotina do utilitário.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


NÚCLEO. CPP
Artigo • 03/06/2023

No componente de provedor de exemplo, o exemplo de código, usado para inicializar


propriedades de núcleo de objeto genérico, está em core.cpp. Os métodos com suporte
são listados na tabela a seguir.

Método Descrição

CCoreADsObject::InitializeCoreObject Inicialize as propriedades básicas de IADs para esse


objeto, uma conveniência para a criação de objeto.

CCoreADsObject::CCoreADsObject Criador padrão.

CCoreADsObject::~CCoreADsObject Destruidor padrão.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


CNAMCF. CPP
Artigo • 13/06/2023

No componente de provedor de exemplo, um exemplo do código de fábrica da classe


de objeto namespace do ADs está em cnamcf.cpp. O método com suporte é listado na
tabela a seguir.

Método Descrição

CSampleDSNamespaceCF::CreateInstance Crie uma instância da fábrica de classes para o


objeto namespace do ADs.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


CNAMESP. CPP
Artigo • 03/06/2023

No componente de provedor de exemplo, o código que gerencia o tempo de vida do


objeto namespace de componente do provedor de exemplo está em cnamesp.cpp. Os
métodos com suporte são listados na tabela a seguir.

Método Descrição

CSampleDSNamespace::CSampleDSNamespace Construtor padrão.

CSampleDSNamespace::~CSampleDSNamespace Destruidor padrão.

Métodos IADs padrão.

Métodos IADsContainer padrão.

CSampleDSNamespace::AllocateNamespaceObject Crie um objeto de namespace e carregue


seus dados de tipo.

CSampleDSNamespace::CreateNamespace Alocar, inicializar e validar um objeto


namespace.

CSampleDSNamespace::QueryInterface Verifique o IID fornecido neste objeto.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


COMUM. CPP
Artigo • 12/06/2023

No componente de provedor de exemplo, um exemplo de código comum a todos os


objetos genéricos é encontrado em common.cpp. Os objetos herdam esses métodos e
propriedades por meio de regras de herança do C++. Esses métodos incluem a criação
de cadeias de caracteres ADsPath, métodos de dados de tipo e outras rotinas de
manutenção.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


CPRPOBJ. CPP
Artigo • 13/06/2023

No componente de provedor de exemplo, os métodos de objeto de propriedade, em


cprpobj.cpp, são listados na tabela a seguir.

Método Descrição

CSampleDSProperty::CSampleDSProperty Construtor padrão.

CSampleDSProperty::~CSampleDSProperty Destruidor padrão.

CSampleDSProperty::CreateProperty Crie um objeto ads property, pesquisando as


definições de atributo chamando
SampleDSGetPropertyDefinition.

CSampleDSProperty::CreateProperty Dada a definição de atributo, crie um objeto de


propriedade, definindo a correspondência entre
sintaxes ADS com suporte e as sintaxes do
provedor.

CSampleDSProperty::AllocatePropertyObject Crie um objeto de propriedade e carregue seus


dados de tipo.

CSampleDSProperty::QueryInterface Retornar o ponteiro de interface solicitado, se


disponível.

Métodos iads padrão.

Métodos IADsProperty padrão.

MapSyntaxIdtoADsSyntax Defina a correspondência entre a ID da sintaxe e


a sintaxe ADS.

MapSyntaxIdtoSampleDSSyntax Defina a correspondência entre a ID da sintaxe e


a sintaxe do provedor.

Comentários
Esta página foi útil? ツ Yes ト No
Obter ajuda no Microsoft Q&A
CPROPS. CPP
Artigo • 12/06/2023

No componente de provedor de exemplo, um exemplo de uma implementação de


cache de propriedade pode ser encontrado em cprops.cpp. Os métodos com suporte
são listados na tabela a seguir.

Método Descrição

CPropertyCache::addproperty Estenda o cache de propriedades


adicionando um novo.

CPropertyCache::updateproperty Pesquise a propriedade, libere seu conteúdo


e use novos valores; em seguida, marque o
cache alterado para essa propriedade.

CPropertyCache::findproperty Pesquise essa propriedade pelo nome; salve


seu índice.

CPropertyCache::getproperty Localize a propriedade no cache, se


disponível, caso contrário, chame GetInfo.
Defina o índice e copie os novos valores.

CPropertyCache::p utproperty Localize a propriedade . Libere o que estava


lá e coloque novos valores.

CPropertyCache::CPropertyCache Construtor padrão.

CPropertyCache::~CPropertyCache Destruidor padrão.

CPropertyCache::createpropertycache Crie o cache.

CPropertyCache::unboundgetproperty Localize a propriedade no cache e defina-a


com esses valores.

CPropertyCache::SampleDSMarshallProperties Realizar marshaling de dados e valores de


propriedade.

CPropertyCache::marshallproperty Realizar marshaling de uma propriedade.

CPropertyCache::SampleDSUnMarshallProperties Unmarshal property data and values.

CPropertyCache::unmarshallproperty Demarsalar uma propriedade.


Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


CPROV. CPP
Artigo • 03/06/2023

No componente de provedor de exemplo, um exemplo de código usado para


implementar o objeto de provedor do ADs é encontrado em cprov.cpp. Os métodos
com suporte são listados na tabela a seguir.

Item Descrição

CSampleDSProvider::CSampleDSProvider Criador padrão.

CSampleDSProvider::~CSampleDSProvider Destruidor padrão.

CSampleDSProvider::Create Criar o objeto.

CSampleDSProvider::QueryInterface Verifique se há interfaces com suporte.

CSampleDSProvider::P arseDisplayName Resolva o caminho.

CSampleDSProvider::ResolvePathName Obtenha o objeto e crie um moniker de ponteiro


para ele.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


CPROVCF. CPP
Artigo • 13/06/2023

No componente de provedor de exemplo, um exemplo de código do código de fábrica


da classe de objeto do provedor do ADs está em cprovcf.cpp. O componente do
provedor nunca cria diretamente uma instância desse objeto em qualquer momento
diferente de quando o objeto é criado automaticamente durante as operações de
associação no ADsGetObject ou a função interna no método GetObject do Visual Basic.
O método com suporte é listado na tabela a seguir.

Método Descrição

CSampleDSProviderCF::CreateInstance Cria uma instância da fábrica de classes para o objeto


do provedor ADS.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


CSCHOBJ. CPP
Artigo • 12/06/2023

No componente de provedor de exemplo, um exemplo de código, que gerencia o


tempo de vida dos objetos de esquema, está em cschobj.cpp. Os métodos com suporte
são listados na tabela a seguir.

Método Descrição

CSampleDSSchema::CreateSchema Construtor padrão.

CSampleDSSchema::~CSampleDSSchema Destruidor padrão.

Métodos iads padrão.

Métodos IADsContainer padrão.

CSampleDSSchema::QueryInterface Verifique a ID da interface especificada neste objeto.

CSampleDSSchema::AllocateSchema Crie um objeto de esquema e carregue seus dados


de tipo.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


GETOBJ. CPP
Artigo • 13/06/2023

No componente de provedor de exemplo, aparece um exemplo de código usado para


localizar e associar objetos em Getobj.cpp. As rotinas com suporte são listadas na tabela
a seguir.

Item Descrição

RelativeGetObject Obtém um objeto relativo a um determinado ADsPath.

Getobject Chama ADsObject (Parse.cpp) para verificar a sintaxe


do caminho, valida se o caminho tem o token de
provedor certo e valida o tipo de objeto. Se não houver
erros, crie uma instância do tipo correto de objeto e
recupere um ponteiro para a interface IUnknown do
objeto.

BuildADsPathFromDSPath Criou uma cadeia de caracteres ADsPath do caminho


do diretório nativo.

BuildDSTreeNameFromADsPath Use o ADsPath para criar um possível caminho de


diretório de árvore para o caminho do diretório nativo.

BuildDSPathFromADsPath Usa ADsPath e DSPathName.

BuildADsParentPath Compile o ADsPath para o pai desse objeto.

GetNamespaceObject Valide e CoCreateInstance um exemplo de objeto de


namespace.

ValidateNamespaceObject Verifique se o objeto de namespace corresponde ao


nome do provedor atual.

ValidateProvider Validar o nome do provedor (diferencia maiúsculas de


minúsculas).

GetSchemaObject Valide e abra o tipo de objeto de esquema apropriado.


Em seguida, crie o correto e recupere o ponteiro da
interface IUnknown nele.

ValidateSchemaObject Verifique se é um tipo de objeto de esquema válido.

ValidateObjectType Verifique se o tipo de objeto existe no esquema.

BuildSampleDSRootRDNFromADsPath Compile o ADsPath no nó raiz do componente de


provedor de exemplo.

BuildDSPathFromADsPath Usa ADsPath, DSRootRDN e DSPathName.


Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


GLOBALS. CPP
Artigo • 03/06/2023

No componente de provedor de exemplo, os globais usados podem ser encontrados


em globals.cpp. Os globais com suporte são listados na tabela a seguir.

Item Descrição

g_szProviderName "Exemplo"

KeywordList "user", "group", "organizational unit"

Mapeamentos de Mapas entre a sintaxe "String" e a VT_BSTR VARIANT e "Inteiro" e VT_I4.


sintaxe de exemplo Isso representa o mapeamento de formato de dados nativo para os
DS para ADS Variant formatos compatíveis com a Automação e vice-versa.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


GUID. CPP
Artigo • 03/06/2023

No componente de provedor de exemplo, os GUIDs necessários para os objetos de


componente de provedor de exemplo estão em Guid.cpp. Os GUIDs são definidos para
os seguintes itens:

CLSID_SampleDSNamespace
CLSID_SampleDSProvider
LIBID_SampleDSOle
CLSID_SampleDSGenObject
CLSID_SampleDSSchema
CLSID_SampleDSClass
CLSID_SampleDSProperty

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


LIBMAIN. CPP
Artigo • 03/06/2023

No componente de provedor de exemplo, um exemplo de código do ponto de entrada


DLL padrão para Adssmp.dll está em Libmain.cpp. As rotinas com suporte são listadas
na tabela a seguir.

Item Descrição

Dllgetclassobject Ponto de entrada DLL padrão para localizar fábricas de classes.

Dllcanunloadnow Ponto de entrada DLL padrão para determinar se a DLL pode ser
descarregada.

Libmain Ponto de entrada de inicialização de DLL padrão.

IsCompatibleOleVersion Verifique a compatibilidade com o tempo de execução OLE.

Dllmain Ponto de entrada para a maioria das versões de Windows 2000 ou


Windows NT.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


MEMÓRIA. CPP
Artigo • 13/06/2023

No componente de provedor de exemplo, um exemplo de código mostrando a


alocação e a liberação de memória está em memory.cpp. As rotinas com suporte são
listadas na tabela a seguir.

Item Descrição

AllocProvMem Alocar memória especificada.

FreeProvMem Memória livre indicada.

ReallocProvMem Alocar memória contígua.

AllocProvStr Alocar uma cadeia de caracteres LPWSTR.

FreeProvStr Cadeia de caracteres livre se ainda não estiver liberada.

ReallocProvStr Alocar memória contígua.

ProvAllocString Verifica a cadeia de caracteres e o primeiro parâmetro. Se OK, executa a


alocação.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


OBJETO. CPP
Artigo • 12/06/2023

No componente de provedor de exemplo, um exemplo de código de listas de objetos,


incluindo o uso de um filtro, está em Object.cpp. Os métodos com suporte são listados
na tabela a seguir.

Objeto Descrição

ObjectTypeList::ObjectTypeList Criador: crie uma lista usando o filtro .

ObjectTypeList::~ObjectTypeList Destruidor padrão.

ObjectTypeList::GetCurrentObject Recupere o objeto atual da lista.

ObjectTypeList::Next Aumente o índice.

ObjectTypeList::Reset Redefina o índice.

IsValidFilter Verifique a integridade do filtro.

BuildDefaultObjectArray Crie uma matriz de objetos usando o filtro .

BuildObjectArray Crie uma matriz de objetos.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


PROPRIEDADE. CPP
Artigo • 12/06/2023

No componente de provedor de exemplo, exemplos de código para armazenar


diferentes tipos de dados em tipos de dados VARIANT para que possam ser salvos
como propriedades de um objeto estão em property.cpp. As rotinas com suporte são
listadas na tabela a seguir.

Rotina Descrição

/ get_BSTR_Property put_BSTR_Property Para propriedades de cadeia de


caracteres.

/ get_LONG_Property put_LONG_Property Para propriedades de inteiro longo.

/ get_DATE_Property put_DATE_Property Para propriedades de formato de data.

/ get_VARIANT_BOOL_Property Para propriedades boolianas.


put_VARIANT_BOOL_Property

/ get_VARIANT_Property put_VARIANT_Property Para propriedades VARIANT .

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


ANALISAR. CPP
Artigo • 13/06/2023

No componente de provedor de exemplo, um exemplo de código do analisador de


caminho do serviço de diretório está em Parse.cpp. O analisador de caminho é um
componente-chave nos componentes do provedor do ADs. Ele verifica a validade
sintactica de um caminho do ADs passado para esse provedor. Se a sintaxe for válida,
uma estrutura OBJECTINFO será construída, que contém uma versão componente do
ADspath para esse objeto.

Lembre-se de que essa é apenas uma verificação de sintaxe. Em vez de casos especiais a
cada nova iteração de caminho, toda a verificação de caminho deve estar em
conformidade com as regras gramaticais estabelecidas pelo analisador.

A tabela a seguir lista as funções e os métodos implementados em Parse.cpp.

Item Descrição

ADsObject Analisa o ADspath passado para ele. Essa função segue as seguintes
regras gramaticais: <ADsObject> -><ProviderName>
<SampleDSObject>

SampleDSObject Analisa as seguintes regras gramaticais: SampleDSObject> –>


identificador> "\\" <"\" <Pathname <>

ProviderName Adiciona o nome do provedor sintaticamente correto se não estiver lá.

PathName Analisa as seguintes regras gramaticais: <Pathname> -<>Component>


"\\" <Pathname> OR
<Pathname> -><Component>

Componente Analisa as seguintes regras gramaticais: <Identificador> OR


<Identificador> "=" <Identificador>

CLexer::CLexer Construtor padrão.

CLexer::~CLexer Destruidor padrão.

CLexer::GetNextToken Tokenizer.

CLexer::NextChar Recupera o próximo caractere único.

CLexer::P Faz backup do início do último token.


ushBackToken

CLexer::P Faz backup de um caractere.


ushbackChar
Item Descrição

CLexer::IsKeyword Verifica palavra-chave lista. Definido em Globals.h).

Addcomponent Adiciona esse componente à matriz de componentes.

AddProviderName Adiciona um nome de provedor sintaticamente correto à estrutura


OBJECTINFO .

AddRootRDN Adiciona o nome RDN (nome diferenciado relativo relativo) raiz


sintaticamente correto à estrutura OBJECTINFO .

SetType Define o tipo do objeto .

Tipo Tipo de análise –> "usuário" | "group" e assim por diante.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


PACK. CPP
Artigo • 03/06/2023

No componente de provedor de exemplo, um exemplo de código de empacotamento e


desempacotar tipos de dados em VARIANTs é encontrado em pack.cpp. As seguintes
funções são usadas quando as propriedades são carregadas e removidas do cache da
propriedade:

PackStringinVariant
UnpackStringinVariant
PackLONGinVariant
UnpackLONGfromVariant
PackDATEinVariant
UnpackDATEinVariant
PackVARIANT_BOOLinVariant
UnpackVARIANT_BOOLfromVariant
PackVARIANTinVariant
UnpackVARIANTfromVariant

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


REGDSAPI. CPP
Artigo • 12/06/2023

No componente de provedor de exemplo, as funções que representam uma API que


acessa diretamente o sistema operacional nativo estão em Regdsapi.cpp. O componente
de provedor de exemplo implementa seu serviço de diretório no registro. Para escrever
um provedor que acessa seu próprio serviço de diretório, crie suas próprias
implementações dessa API. As funções com suporte são listadas na tabela a seguir.

Método Descrição

SampleDSOpenObject Abra esse objeto por nome. Se o parâmetro de tipo de classe


de esquema for NULL, preencha o tipo encontrado. Recupere
um identificador no objeto .

SampleDSCloseObject Use o identificador recuperado por SampleDSOpenObject.

SampleDSRDNEnum Recupere o identificador em um objeto enumerador para


gerenciar a enumeração de RDNs (nomes distintos relativos)
de um objeto de contêiner.

SampleDSNextRDN Usando o identificador recuperado por SampleDSRDNEnum,


obtenha o próximo nome distinto relativo desse objeto de
contêiner.

SampleDSFreeEnum Libere o objeto enumerador alocado em


SampleDSRDNEnum.

SampleDSModifyObject Modifique as propriedades de um objeto no serviço de


diretório considerando o identificador do objeto e uma lista
de atributos e seus valores.

SampleDSReadObject Leia as propriedades do objeto do serviço de diretório.


Mapeie a sintaxe do armazenamento nativo para os valores
de sintaxe ADS apropriados. Manipule propriedades com
vários valores adequadamente.

SampleDSGetPropertyDefinition No esquema, procure todas as definições de propriedade e


seus atributos para esse tipo de objeto de classe de
esquema.

SampleDSGetPropertyDefinition No esquema, procure essa propriedade e seus atributos por


nome.

SampleDSFreePropertyDefinition Memória livre alocada por GetPropertyDefinition.

SampleDSGetTypeText Obter o tipo de classe de esquema de um objeto no formato


de texto.
Método Descrição

SampleDSGetType Obter o tipo de classe de esquema de um objeto .

SampleDSGetPropertyInfo Dado um identificador no objeto de classe de esquema e um


nome de propriedade, recupere as informações da
propriedade, como sintaxe e assim por diante.

Freelist Libere a memória usada por um LPWSTR_LIST.

SampleDSGetClassDefinition Recupere o conjunto de todas as definições de classe de


esquema e seus dados associados do esquema.

SampleDSGetClassDefinition Recupere dados sobre uma classe de esquema específica no


esquema.

SampleDSGetClassInfo Considerando o nome de uma classe de esquema, procure


seus dados associados, como propriedades obrigatórias.

SampleDSAddObject Adicione um objeto no serviço de diretório.

SampleDSRemoveObject Remova um objeto do serviço de diretório.

SampleDSCreateBuffer Crie um buffer de memória para dados de atributo e dados


de operação.

SampleDSFreeBuffer Libere o buffer criado em SampleDSCreateBuffer.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


STDFACT. CPP
Artigo • 03/06/2023

No componente de provedor de exemplo, um exemplo de código mostrando a


implementação padrão do IClassFactory está em Stdfact.cpp. Para obter mais
informações, consulte IClassFactory.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Referência de interfaces de serviço do
Active Directory
Artigo • 12/06/2023

Nesta seção, você pode encontrar os materiais de referência para programação com
ADSI (Interfaces de Serviço do Active Directory). Os tópicos incluem:

Tipos de dados e constantes


Estruturas
Enumerações
Funções
Interfaces
Provedores do sistema
Códigos de Erro
Mensagens de erro estendidas

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Tipos e constantes de dados ADSI
Artigo • 03/06/2023

O ADSI (Active Directory Service Interfaces) fornece tipos de dados e constantes usados
com estruturas e interfaces ADSI. Os tópicos da seção a seguir descrevem brevemente
cada tipo de dados e constante:

Tipos de modificação de atributo ADSI


Constantes ADSI
Constantes de status do trabalho de impressão ADSI
Tipos de dados simples ADSI

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Tipos de modificação de atributo ADSI
Artigo • 13/06/2023

As constantes a seguir são usadas com o membro dwControlCode da estrutura


ADS_ATTR_INFO para especificar o tipo de operação a ser executada quando um
atributo é modificado com o método IDirectoryObject::SetObjectAttributes . Para obter
mais informações sobre como usar esses valores, consulte Modificando atributos com
ADSI.

ADS_ATTR_CLEAR

Faz com que todos os valores de atributo sejam removidos de um objeto .

ADS_ATTR_UPDATE

Faz com que os valores de atributo especificados sejam atualizados.

ADS_ATTR_APPEND

Faz com que os valores de atributo especificados sejam acrescentados aos valores de
atributo existentes.

ADS_ATTR_DELETE

Faz com que os valores de atributo especificados sejam removidos de um objeto .

Comentários
Essas constantes devem ser usadas com a estrutura ADS_ATTR_INFO no método
IDirectoryObject::SetObjectAttributes . Essas constantes não devem ser confundidas
com membros da enumeração ADS_PROPERTY_OPERATION_ENUM , que devem ser
usadas com o método IADs::P utEx .

Requisitos
Requisito Valor

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho Iads.h

Confira também
ADS_ATTR_INFO

IDirectoryObject::SetObjectAttributes

Modificando atributos com ADSI

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Constantes ADSI
Artigo • 13/06/2023

A tabela a seguir lista constantes definidas e usadas em ADSI (Interfaces de Serviço do


Active Directory).

Constante ADSI Valor Descrição

ADS_EXT_INITCREDENTIALS 1 Um código de controle que indica que os


dados personalizados fornecidos ao
método IADsExtension::Operate contêm
credenciais de usuário.

ADS_EXT_INITIALIZE_COMPLETE 2 Um código de controle usado com


IADsExtension::Operate para indicar que as
extensões podem executar qualquer
inicialização necessária, dependendo dos
recursos compatíveis com o objeto pai.

ADS_EXT_MAXEXTDISPID 16777215 O DISPID mais alto que um objeto de


extensão pode usar para seus métodos e
propriedades.

ADS_EXT_MINEXTDISPID 1 O DISPID mais baixo que um objeto de


extensão pode usar para seus métodos e
propriedades.

ADS_VLV_RESPONSE L"fc8cb04d- Usado com o método


311d-406c- IDirectorySearch::GetColumn para
8cb9- recuperar metadados de pesquisa VLV. Para
1ae8b843b419" obter mais informações, consulte Como
pesquisar usando o VLV.

DBPROPFLAGS_ADSISEARCH 0x0000C000 Usado para trabalhar com o provedor OLE


DB.

Comentários
Esta página foi útil? ツ Yes ト No
Obter ajuda no Microsoft Q&A
Constantes de status do trabalho de
impressão ADSI
Artigo • 12/06/2023

As constantes a seguir são usadas com a propriedade IADsPrintJobOperations.Status


para indicar o status de um trabalho de impressão.

ADS_JOB_PAUSED

1 (0x1)

O trabalho de impressão está em pausa.

ADS_JOB_ERROR

2 (0x2)

Ocorreu um erro.

ADS_JOB_DELETING

4 (0x4)

O trabalho de impressão está sendo excluído.

ADS_JOB_SPOOLING

8 (0x8)

O trabalho de impressão está sendo spooled.

ADS_JOB_PRINTING

16 (0x10)

O trabalho de impressão está sendo impresso.

ADS_JOB_OFFLINE

32 (0x20)

A impressora está offline.

ADS_JOB_PAPEROUT

64 (0x40)
A impressora está sem papel.

ADS_JOB_PRINTED

128 (0x80)

O trabalho de impressão foi impresso.

ADS_JOB_DELETED

256 (0x100)

O trabalho de impressão foi excluído.

Requisitos
Requisito Valor

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho Adssts.h

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Tipos de dados simples ADSI
Artigo • 12/06/2023

O ADSI (Active Directory Service Interfaces) define e usa os seguintes tipos de dados
simples.

C++

typedef DWORD ADS_BOOLEAN, *PADS_BOOLEAN;


typedef LPWSTR ADS_CASE_EXACT_STRING, *PADS_CASE_EXACT_STRING;
typedef LPWSTR ADS_CASE_IGNORE_STRING, *PADS_CASE_IGNORE_STRING;
typedef LPWSTR ADS_DN_STRING, *PADS_DN_STRING;
typedef DWORD ADS_INTEGER, *PADS_INTEGER;
typedef LARGE_INTEGER ADS_LARGE_INTEGER, *PADS_LARGE_INTEGER;
typedef LPWSTR ADS_NUMERIC_STRING, *PADS_NUMERIC_STRING;
typedef LPWSTR ADS_OBJECT_CLASS, *PADS_OBJECT_CLASS;
typedef LPWSTR ADS_PRINTABLE_STRING, *PADS_PRINTABLE_STRING;
typedef HANDLE ADS_SEARCH_HANDLE, *PADS_SEARCH_HANDLE;
typedef SYSTEMTIME ADS_UTC_TIME, *PADS_UTC_TIME;

ADS_BOOLEAN

DWORD

ADS_CASE_EXACT_STRING

LPWSTR

ADS_CASE_IGNORE_STRING

LPWSTR

ADS_DN_STRING

LPWSTR

ADS_INTEGER

DWORD

ADS_LARGE_INTEGER

LARGE_INTEGER

ADS_NUMERIC_STRING

LPWSTR
ADS_OBJECT_CLASS

LPWSTR

ADS_PRINTABLE_STRING

LPWSTR

ADS_SEARCH_HANDLE

HANDLE

ADS_UTC_TIME

SYSTEMTIME

Comentários
Quando ADSI lê um atributo que foi definido como um INTEGER no esquema LDAP, ele
sempre manipulará o inteiro como um valor de 32 bits e poderá truncar os dados. Essa
é apenas uma preocupação para servidores LDAP que permitem valores inteiros de
tamanho arbitrário. Se o atributo for um atributo personalizado definido pela extensão
do esquema, esse problema poderá ser evitado definindo o atributo personalizado
como uma cadeia de caracteres.

Requisitos
Requisito Valor

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho Iads.h

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Estruturas ADSI
Artigo • 03/06/2023

As ADSI (Interfaces de Serviço do Active Directory) definem e usam as estruturas listadas


na tabela a seguir.

Estrutura Descrição

ADS_ATTR_DEF Descreve um conjunto de definições de atributo de um


objeto attributeSchema .

ADS_ATTR_INFO Contém o valor de um atributo nomeado e especifica


operações para modificar o atributo.

ADS_BACKLINK Representa uma representação ADSI do atributo Back Link .

ADS_CASEIGNORE_LIST Representa uma representação ADSI do atributo Lista de


Ignorar Maiúsculas e Minúsculas.

ADS_CLASS_DEF Descreve os dados de esquema de um objeto.

ADS_DN_WITH_BINARY Uma estrutura definida por ADSI que mapeia um nome


diferenciado para um GUID de objeto.

ADS_DN_WITH_STRING Uma estrutura definida por ADSI que mapeia um nome


diferenciado de um objeto para um valor de cadeia de
caracteres sem consulta.

ADS_EMAIL Representa uma representação ADSI do atributo EMail .

ADS_FAXNUMBER Representa uma representação ADSI do atributo Número de


Telefone Facsimile .

ADS_HOLD Representa uma representação ADSI do atributo Hold .

ADS_NETADDRESS Representa uma representação ADSI do atributo Endereço


Net .

ADS_NT_SECURITY_DESCRIPTOR Descreve um descritor de segurança.

ADS_OBJECT_INFO Descreve os dados do objeto de serviço de diretório.

ADS_OCTET_LIST Representa uma representação ADSI do atributo Octet List .

ADS_OCTET_STRING Representa uma representação ADSI do atributo Octet String


.

ADS_PATH Representa uma representação ADSI do atributo Path .


Estrutura Descrição

ADS_POSTALADDRESS Representa uma representação ADSI do atributo Endereço


Postal .

ADS_PROV_SPECIFIC Descreve um tipo de dados específico do provedor.

ADS_REPLICAPOINTER Representa uma representação ADSI do atributo Ponteiro de


Réplica.

ADS_SEARCH_COLUMN Representa uma coluna resultante de uma consulta de


diretório.

ADS_SEARCHPREF_INFO Descreve as preferências de consulta.

ADS_SORTKEY Descreve a chave de classificação usada para classificar uma


consulta.

ADS_TIMESTAMP Representa uma representação ADSI do atributo Timestamp .

ADS_TYPEDNAME Representa uma representação ADSI do atributo Typed Name


.

ADSVALUE Descreve o valor de um tipo de dados ADSI.

ADS_VLV Especifica que a exibição de lista virtual deve ser usada ao


retornar os resultados da pesquisa do servidor.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


estrutura ADS_ATTR_DEF (iads.h)
Artigo24/08/2023

A estrutura ADS_ATTR_DEF é usada apenas como parte de IDirectorySchemaMgmt,


que é uma interface obsoleta. As informações a seguir são fornecidas apenas para fins
herdados.

A estrutura ADS_ATTR_DEF descreve os dados de esquema de um atributo. Ele é usado


para gerenciar definições de atributo no esquema.

Sintaxe
C++

typedef struct _ads_attr_def {


LPWSTR pszAttrName;
ADSTYPE dwADsType;
DWORD dwMinRange;
DWORD dwMaxRange;
BOOL fMultiValued;
} ADS_ATTR_DEF, *PADS_ATTR_DEF;

Membros
pszAttrName

A cadeia de caracteres Unicode terminada em nulo que contém o nome do atributo.

dwADsType

Tipo de dados do atributo conforme definido por ADSTYPEENUM.

dwMinRange

Intervalo legal mínimo para esse atributo.

dwMaxRange

Intervalo legal máximo para esse atributo.

fMultiValued

Se esse atributo usa ou não mais de um valor.


Comentários
No ADSI, atributos e propriedades são usados de forma intercambiável.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Estruturas ADSI

ADSTYPEENUM

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


estrutura ADS_ATTR_INFO (iads.h)
Artigo24/08/2023

A estrutura ADS_ATTR_INFO é usada para conter um ou mais valores de atributo para


uso com o método IDirectoryObject::CreateDSObject,
IDirectoryObject::GetObjectAttributes ou IDirectoryObject::SetObjectAttributes .

Sintaxe
C++

typedef struct _ads_attr_info {


LPWSTR pszAttrName;
DWORD dwControlCode;
ADSTYPE dwADsType;
PADSVALUE pADsValues;
DWORD dwNumValues;
} ADS_ATTR_INFO, *PADS_ATTR_INFO;

Membros
pszAttrName

A cadeia de caracteres Unicode terminada em nulo que contém o nome do atributo.

dwControlCode

Contém um dos valores de Tipos de Modificação de Atributo ADSI que determina o tipo
de operação a ser executada no valor do atributo.

dwADsType

Um valor da enumeração ADSTYPEENUM que indica o tipo de dados do atributo.

pADsValues

Ponteiro para uma matriz de estruturas ADSVALUE que contêm valores para o atributo .

dwNumValues

Tamanho da matriz pADsValues .


Comentários
No ADSI, atributos e propriedades são usados de forma intercambiável. Defina
atributos, ao criar um objeto de serviço de diretório, usando o método
IDirectoryObject::CreateDSObject . A interface IDirectoryObject também dá suporte aos
métodos IDirectoryObject::GetObjectAttributes e IDirectoryObject::SetObjectAttributes
para recuperar e modificar os atributos do objeto em um diretório.

A memória da matriz de estruturas ADSVALUE não é alocada com essa estrutura.

O valor do membro dwControlCode é ignorado quando a estrutura é usada como um


parâmetro OUT.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Tipos de modificação de atributo ADSI

Constantes ADSI

Estruturas ADSI

ADSTYPEENUM

IDirectoryObject

IDirectoryObject::CreateDSObject

IDirectoryObject::GetObjectAttributes

IDirectoryObject::SetObjectAttributes

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


estrutura ADS_BACKLINK (iads.h)
Artigo24/08/2023

A estrutura ADS_BACKLINK é uma representação ADSI da sintaxe do atributo Back Link


.

Sintaxe
C++

typedef struct __MIDL___MIDL_itf_ads_0000_0000_0008 {


DWORD RemoteID;
LPWSTR ObjectName;
} ADS_BACKLINK, *PADS_BACKLINK;

Membros
RemoteID

Identificador do servidor remoto que requer uma referência externa ao objeto


especificado por ObjectName. Veja abaixo.

ObjectName

A cadeia de caracteres Unicode terminada em nulo que especifica o nome de um objeto


ao qual o atributo Back Link está anexado.

Comentários
Um atributo Back Link contém um ou mais servidores que contêm uma referência
externa ao objeto anexado.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h
Confira também
Estruturas ADSI

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


estrutura ADS_CASEIGNORE_LIST
(iads.h)
Artigo24/08/2023

A estrutura ADS_CASEIGNORE_LIST é uma representação ADSI da sintaxe do atributo


Case Ignore List .

Sintaxe
C++

typedef struct _ADS_CASEIGNORE_LIST {


struct _ADS_CASEIGNORE_LIST *Next;
LPWSTR String;
} ADS_CASEIGNORE_LIST, *PADS_CASEIGNORE_LIST;

Membros
Next

Ponteiro para o próximo ADS_CASEIGNORE_LIST na lista de cadeias de caracteres que


não diferenciam maiúsculas de minúsculas.

String

O valor da cadeia de caracteres Unicode terminada em nulo da entrada atual da lista.

Comentários
Um atributo Case Ignore List representa uma sequência ordenada de cadeias de
caracteres que não diferenciam maiúsculas de minúsculas.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008


Cabeçalho iads.h

Confira também
Estruturas ADSI

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


estrutura ADS_CLASS_DEF (iads.h)
Artigo24/08/2023

A estrutura ADS_CLASS_DEF é usada apenas como parte de IDirectorySchemaMgmt,


que é uma interface obsoleta. As informações a seguir são fornecidas apenas para fins
herdados.

A estrutura ADS_CLASS_DEF contém as definições de uma classe de objeto.

Sintaxe
C++

typedef struct _ads_class_def {


LPWSTR pszClassName;
DWORD dwMandatoryAttrs;
LPWSTR *ppszMandatoryAttrs;
DWORD optionalAttrs;
LPWSTR **ppszOptionalAttrs;
DWORD dwNamingAttrs;
LPWSTR **ppszNamingAttrs;
DWORD dwSuperClasses;
LPWSTR **ppszSuperClasses;
BOOL fIsContainer;
} ADS_CLASS_DEF, *PADS_CLASS_DEF;

Membros
pszClassName

A cadeia de caracteres Unicode terminada em nulo que especifica o nome da classe.

dwMandatoryAttrs

O número de atributos de classe obrigatórios.

ppszMandatoryAttrs

Ponteiro para uma matriz de cadeias de caracteres Unicode terminadas em nulo que
contêm os nomes dos atributos obrigatórios.

optionalAttrs

Número de atributos opcionais da classe .


ppszOptionalAttrs

Ponteiro para uma matriz de cadeias de caracteres Unicode terminadas em nulo que
contêm os nomes dos atributos opcionais.

dwNamingAttrs

Número de atributos de nomenclatura.

ppszNamingAttrs

Ponteiro para uma matriz de cadeias de caracteres Unicode terminadas em nulo que
contêm os nomes dos atributos de nomenclatura.

dwSuperClasses

Número de super classes de um objeto dessa classe.

ppszSuperClasses

Ponteiro para uma matriz de cadeias de caracteres Unicode terminadas em nulo que
contêm os nomes das super classes.

fIsContainer

Sinalizadores que indicam que o objeto da classe é um contêiner quando é TRUE e não
um contêiner quando FALSE.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Estruturas ADSI

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


estrutura ADS_DN_WITH_BINARY
(iads.h)
Artigo24/08/2023

A estrutura ADS_DN_WITH_BINARY é usada com a estrutura ADSVALUE para conter um


valor de atributo de nome diferenciado que também contém dados binários.

Sintaxe
C++

typedef struct __MIDL___MIDL_itf_ads_0000_0000_0015 {


DWORD dwLength;
LPBYTE lpBinaryValue;
LPWSTR pszDNString;
} ADS_DN_WITH_BINARY, *PADS_DN_WITH_BINARY;

Membros
dwLength

Contém o comprimento, em bytes, dos dados binários em lpBinaryValue.

lpBinaryValue

Ponteiro para uma matriz de bytes que contém os dados binários do atributo. O
membro dwLength contém o número de bytes nessa matriz.

pszDNString

Ponteiro para uma cadeia de caracteres Unicode terminada em nulo que contém o
nome diferenciado.

Comentários
Ao estender o esquema do active directory para adicionar ADS_DN_WITH_BINARY,
você também deve especificar a outra definição de atributoWellKnownGuid. Adicione o
seguinte à definição de atributo de arquivo ldf: omObjectClass:: KoZIhvcUAQEBCw==
Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Estruturas ADSI

ADSVALUE

Object(DN-Binary)

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


estrutura ADS_DN_WITH_STRING
(iads.h)
Artigo14/03/2023

A estrutura ADS_DN_WITH_STRING é usada com a estrutura ADSVALUE para conter um


valor de atributo de nome diferenciado que também contém dados de cadeia de
caracteres.

Sintaxe
C++

typedef struct __MIDL___MIDL_itf_ads_0000_0000_0016 {


LPWSTR pszStringValue;
LPWSTR pszDNString;
} ADS_DN_WITH_STRING, *PADS_DN_WITH_STRING;

Membros
pszStringValue

Ponteiro para uma cadeia de caracteres Unicode terminada em nulo que contém o valor
da cadeia de caracteres do atributo.

pszDNString

Ponteiro para uma cadeia de caracteres Unicode terminada em nulo que contém o
nome diferenciado.

Comentários
Ao estender o esquema do active directory para adicionar ADS_DN_WITH_STRING, você
também deve especificar a outra definição de atributoWellKnownGuid. Adicione o
seguinte à definição de atributo de arquivo ldf: omObjectClass:: KoZIhvcUAQEBDA==

Requisitos
Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Estruturas ADSI

ADSVALUE

Object(DN-String)

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


estrutura ADS_EMAIL (iads.h)
Artigo24/08/2023

A estrutura ADS_EMAIL é uma representação ADSI da sintaxe do atributo EMail Address


.

Sintaxe
C++

typedef struct __MIDL___MIDL_itf_ads_0000_0000_0014 {


LPWSTR Address;
DWORD Type;
} ADS_EMAIL, *PADS_EMAIL;

Membros
Address

A cadeia de caracteres Unicode terminada em nulo que contém o endereço do usuário.

Type

Tipo da mensagem de email.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Estruturas ADSI
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


estrutura ADS_FAXNUMBER (iads.h)
Artigo24/08/2023

A estrutura ADS_FAXNUMBER é uma representação ADSI da sintaxe do atributo


Número de Telefone Facsimile .

Sintaxe
C++

typedef struct __MIDL___MIDL_itf_ads_0000_0000_0013 {


LPWSTR TelephoneNumber;
DWORD NumberOfBits;
LPBYTE Parameters;
} ADS_FAXNUMBER, *PADS_FAXNUMBER;

Membros
TelephoneNumber

O valor da cadeia de caracteres Unicode terminada em nulo que contém o número de


telefone do computador facsimile (fax).

NumberOfBits

O número de bits de dados.

Parameters

Parâmetros opcionais para o computador de fax.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h
Confira também
Estruturas ADSI

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


estrutura ADS_HOLD (iads.h)
Artigo24/08/2023

A estrutura ADS_HOLD é uma representação ADSI da sintaxe do atributo Hold .

Sintaxe
C++

typedef struct __MIDL___MIDL_itf_ads_0000_0000_0010 {


LPWSTR ObjectName;
DWORD Amount;
} ADS_HOLD, *PADS_HOLD;

Membros
ObjectName

A cadeia de caracteres Unicode terminada em nulo que contém o nome de um objeto


colocado em espera.

Amount

Número de encargos que um servidor coloca contra o usuário em espera enquanto ele
verifica o saldo da conta de usuário.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Estruturas ADSI
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


estrutura ADS_NETADDRESS (iads.h)
Artigo24/08/2023

A estrutura ADS_NETADDRESS é uma representação ADSI da sintaxe do atributo


Endereço Líquido .

Sintaxe
C++

typedef struct __MIDL___MIDL_itf_ads_0000_0000_0011 {


DWORD AddressType;
DWORD AddressLength;
BYTE *Address;
} ADS_NETADDRESS, *PADS_NETADDRESS;

Membros
AddressType

Tipos de protocolos de comunicação.

AddressLength

Comprimento do endereço em bytes.

Address

Um endereço de rede.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Estruturas ADSI

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


estrutura
ADS_NT_SECURITY_DESCRIPTOR (iads.h)
Artigo14/03/2023

A estrutura ADS_NT_SECURITY_DESCRIPTOR define o tipo de dados do descritor de


segurança para Windows.

Sintaxe
C++

typedef struct __MIDL___MIDL_itf_ads_0000_0000_0003 {


DWORD dwLength;
LPBYTE lpValue;
} ADS_NT_SECURITY_DESCRIPTOR, *PADS_NT_SECURITY_DESCRIPTOR;

Membros
dwLength

Os dados de comprimento, em bytes.

lpValue

Ponteiro para o descritor de segurança, representado como uma matriz de bytes.

Comentários
A estrutura ADS_NT_SECURITY_DESCRIPTOR normalmente é usada como membro da
definição de estrutura ADSVALUE .

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h
Confira também
Estruturas ADSI

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


estrutura ADS_OBJECT_INFO (iads.h)
Artigo24/08/2023

A estrutura ADS_OBJECT_INFO especifica os dados, incluindo a identidade e o local, de


um objeto de serviço de diretório.

Sintaxe
C++

typedef struct _ads_object_info {


LPWSTR pszRDN;
LPWSTR pszObjectDN;
LPWSTR pszParentDN;
LPWSTR pszSchemaDN;
LPWSTR pszClassName;
} ADS_OBJECT_INFO, *PADS_OBJECT_INFO;

Membros
pszRDN

A cadeia de caracteres Unicode terminada em nulo que contém o nome diferenciado


relativo do objeto de serviço de diretório.

pszObjectDN

A cadeia de caracteres Unicode terminada em nulo que contém o nome diferenciado do


objeto de serviço de diretório.

pszParentDN

A cadeia de caracteres Unicode terminada em nulo que contém o nome diferenciado do


objeto pai.

pszSchemaDN

A cadeia de caracteres Unicode terminada em nulo que contém o nome diferenciado da


classe de esquema do objeto .

pszClassName
A cadeia de caracteres Unicode terminada em nulo que contém o nome da classe da
qual esse objeto é uma instância.

Comentários
Para obter os dados do objeto, os clientes que não são de Automação chamam o
método IDirectoryObject::GetObjectInformation , que usa um parâmetro out, um
ponteiro para uma estrutura ADS_OBJECT_INFO alocada no heap. Os clientes de
automação podem realizar a mesma tarefa chamando IADs::GetInfo.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Estruturas ADSI

IADs::GetInfo

IDirectoryObject::GetObjectInformation

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


estrutura ADS_OCTET_LIST (iads.h)
Artigo24/08/2023

A estrutura ADS_OCTET_LIST é uma representação ADSI de uma sequência ordenada de


cadeias de caracteres de byte único.

Sintaxe
C++

typedef struct _ADS_OCTET_LIST {


struct _ADS_OCTET_LIST *Next;
DWORD Length;
BYTE *Data;
} ADS_OCTET_LIST, *PADS_OCTET_LIST;

Membros
Next

Ponteiro para a próxima entrada ADS_OCTET_LIST na lista.

Length

Contém o comprimento, em bytes, da lista.

Data

Ponteiro para uma matriz de BYTEs que contém a lista. O membro Length dessa
estrutura contém o número de BYTEs nessa matriz.

Comentários
Para obter mais informações, consulte Novell NetWare Directory Services Schema
Specification, versão 1.1.

Requisitos

Cliente mínimo com suporte Windows Vista


Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Estruturas ADSI

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


estrutura ADS_OCTET_STRING (iads.h)
Artigo24/08/2023

A estrutura ADS_OCTET_STRING é uma representação ADSI da sintaxe de atributo Octet


String usada no Active Directory.

Sintaxe
C++

typedef struct __MIDL___MIDL_itf_ads_0000_0000_0002 {


DWORD dwLength;
LPBYTE lpValue;
} ADS_OCTET_STRING, *PADS_OCTET_STRING;

Membros
dwLength

O tamanho, em bytes, da matriz de caracteres.

lpValue

Ponteiro para uma matriz de caracteres de byte único não interpretados pelo diretório
subjacente.

Comentários
A memória da matriz de bytes deve ser alocada separadamente.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h
Confira também
Estruturas ADSI

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


estrutura ADS_PATH (iads.h)
Artigo14/03/2023

A estrutura ADS_PATH é uma representação ADSI da sintaxe do atributo Path .

Sintaxe
C++

typedef struct __MIDL___MIDL_itf_ads_0000_0000_0005 {


DWORD Type;
LPWSTR VolumeName;
LPWSTR Path;
} ADS_PATH, *PADS_PATH;

Membros
Type

Tipo de arquivo no sistema de arquivos.

VolumeName

A cadeia de caracteres Unicode terminada em nulo que contém o nome de um volume


existente no sistema de arquivos.

Path

A cadeia de caracteres Unicode terminada em nulo que contém o caminho de um


diretório no sistema de arquivos.

Comentários
O atributo Path representa um caminho do sistema de arquivos.

Requisitos

Cliente mínimo com suporte Windows Vista


Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Estruturas ADSI

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


estrutura ADS_POSTALADDRESS (iads.h)
Artigo24/08/2023

A estrutura ADS_POSTALADDRESS é uma representação ADSI do atributo Endereço


Postal .

Sintaxe
C++

typedef struct __MIDL___MIDL_itf_ads_0000_0000_0006 {


LPWSTR PostalAddress[6];
} ADS_POSTALADDRESS, *PADS_POSTALADDRESS;

Membros
PostalAddress[6]

Uma matriz de seis cadeias de caracteres Unicode terminadas em nulo que representam
o endereço postal.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Estruturas ADSI

Comentários
Esta página foi útil?
ツ Yes ト No

Obter ajuda no Microsoft Q&A


ADS_PROV_SPECIFIC estrutura (iads.h)
Artigo14/03/2023

A estrutura ADS_PROV_SPECIFIC contém dados específicos do provedor representados


como um BLOB (objeto binário grande).

Sintaxe
C++

typedef struct __MIDL___MIDL_itf_ads_0000_0000_0004 {


DWORD dwLength;
LPBYTE lpValue;
} ADS_PROV_SPECIFIC, *PADS_PROV_SPECIFIC;

Membros
dwLength

O tamanho da matriz de caracteres.

lpValue

Um ponteiro para uma matriz de bytes.

Comentários
A estrutura ADS_PROV_SPECIFIC é um dos tipos de dados usados como membro da
definição de estrutura ADSVALUE . Os dados são representados como um BLOB aqui,
embora os dados reais possam ser empacotados em qualquer formato, como uma
estrutura C. O gravador do provedor deve publicar o formato de dados específico no
BLOB.

ADSI também pode retornar atributos como ADS_PROV_SPECIFIC se não for possível
determinar o tipo de sintaxe de atributo correto, como ocorreria se, por exemplo, o
esquema não estivesse disponível.

Requisitos
Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Estruturas ADSI

ADSVALUE

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


estrutura ADS_REPLICAPOINTER (iads.h)
Artigo24/08/2023

A estrutura ADS_REPLICAPOINTER representa uma representação ADSI da sintaxe do


atributo Ponteiro de Réplica.

Sintaxe
C++

typedef struct __MIDL___MIDL_itf_ads_0000_0000_0012 {


LPWSTR ServerName;
DWORD ReplicaType;
DWORD ReplicaNumber;
DWORD Count;
PADS_NETADDRESS ReplicaAddressHints;
} ADS_REPLICAPOINTER, *PADS_REPLICAPOINTER;

Membros
ServerName

A cadeia de caracteres Unicode terminada em nulo que contém o nome do servidor de


nome que contém o réplica.

ReplicaType

Tipo de réplica: master, secundário ou somente leitura.

ReplicaNumber

Número de identificação da réplica.

Count

O número de réplicas existentes.

ReplicaAddressHints

Um endereço de rede que é uma referência provável a um nó que leva ao servidor de


nomes.
Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Estruturas ADSI

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


estrutura ADS_SEARCH_COLUMN
(iads.h)
Artigo14/03/2023

A estrutura ADS_SEARCH_COLUMN especifica o conteúdo de uma coluna de pesquisa


na consulta retornada do banco de dados do serviço de diretório.

Sintaxe
C++

typedef struct ads_search_column {


LPWSTR pszAttrName;
ADSTYPE dwADsType;
PADSVALUE pADsValues;
DWORD dwNumValues;
HANDLE hReserved;
} ADS_SEARCH_COLUMN, *PADS_SEARCH_COLUMN;

Membros
pszAttrName

Uma cadeia de caracteres Unicode terminada em nulo que contém o nome do atributo
cujos valores estão contidos na coluna de pesquisa atual.

dwADsType

Valor da enumeração ADSTYPEENUM que indica como os valores de atributo são


interpretados.

pADsValues

Matriz de estruturas ADSVALUE que contêm valores do atributo na coluna de pesquisa


atual da linha atual.

dwNumValues

Tamanho da matriz pADsValues .

hReserved
Reservado para uso interno por provedores.

Comentários
A estrutura ADS_SEARCH_COLUMN contém apenas um ponteiro para a matriz de
estruturas ADSVALUE . A memória da estrutura deve ser alocada separadamente.

Para obter mais informações sobre ADS_SEARCH_COLUMN, consulte


IDirectorySearch::GetColumn.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Estruturas ADSI

ADSTYPEENUM

ADSVALUE

IDirectorySearch::GetColumn

Comentários
Esta página foi útil?  Yes  No
estrutura ADS_SEARCHPREF_INFO
(iads.h)
Artigo24/08/2023

A estrutura ADS_SEARCHPREF_INFO especifica as preferências de consulta.

Sintaxe
C++

typedef struct ads_searchpref_info {


ADS_SEARCHPREF dwSearchPref;
ADSVALUE vValue;
ADS_STATUS dwStatus;
} ADS_SEARCHPREF_INFO, *PADS_SEARCHPREF_INFO, *LPADS_SEARCHPREF_INFO;

Membros
dwSearchPref

Contém um dos valores de enumeração ADS_SEARCHPREF_ENUM que especifica a


opção de pesquisa a ser definida.

vValue

Contém uma estrutura ADSVALUE que especifica o tipo de dados e o valor da


preferência de pesquisa.

dwStatus

Recebe um dos valores de enumeração ADS_STATUSENUM que indica o status da


preferência de pesquisa. O método IDirectorySearch::SetSearchPreference preencherá
esse membro quando ele for chamado.

Comentários
Para configurar uma preferência de pesquisa, atribua valores apropriados aos campos
de uma estrutura ADS_SEARCHPREF_INFO passada para o servidor. O membro vValue
da estrutura ADS_SEARCHPREF_INFO é uma estrutura ADSVALUE . A tabela a seguir
lista os valores ADS_SEARCHPREF_ENUM , os valores correspondentes para o membro
dwType da estrutura ADSVALUE e o membro ADSVALUE usado para o tipo
especificado.

ADS_SEARCHPREF_ENUM Valor membro dwType de ADSVALUE Membro


ADSVALUE

ADS_SEARCHPREF_ASYNCHRONOUS ADSTYPE_BOOLEAN Booliano

ADS_SEARCHPREF_DEREF_ALIASES ADSTYPE_INTEGER Inteiro

ADS_SEARCHPREF_SIZE_LIMIT ADSTYPE_INTEGER Inteiro

ADS_SEARCHPREF_TIME_LIMIT ADSTYPE_INTEGER Inteiro

ADS_SEARCHPREF_ATTRIBTYPES_ONLY ADSTYPE_BOOLEAN Booliano

ADS_SEARCHPREF_SEARCH_SCOPE ADSTYPE_INTEGER Inteiro

ADS_SEARCHPREF_TIMEOUT ADSTYPE_INTEGER Inteiro

ADS_SEARCHPREF_PAGESIZE ADSTYPE_INTEGER Inteiro

ADS_SEARCHPREF_PAGED_TIME_LIMIT ADSTYPE_INTEGER Inteiro

ADS_SEARCHPREF_CHASE_REFERRALS ADSTYPE_INTEGER Inteiro

ADS_SEARCHPREF_SORT_ON ADSTYPE_PROV_SPECIFIC ProviderSpecific

ADS_SEARCHPREF_CACHE_RESULTS ADSTYPE_BOOLEAN Booliano

ADS_SEARCHPREF_DIRSYNC ADSTYPE_PROV_SPECIFIC ProviderSpecific

ADS_SEARCHPREF_TOMBSTONE ADSTYPE_BOOLEAN Booliano

ADS_SEARCHPREF_VLV ADSTYPE_PROV_SPECIFIC ProviderSpecific

ADS_SEARCHPREF_ATTRIBUTE_QUERY ADSTYPE_CASE_IGNORE_STRING CaseIgnoreString

ADS_SEARCHPREF_SECURITY_MASK ADSTYPE_INTEGER Inteiro

ADS_SEARCHPREF_DIRSYNC_FLAG ADSTYPE_INTEGER Inteiro

ADS_SEARCHPREF_EXTENDED_DN ADSTYPE_INTEGER Inteiro

Para obter mais informações e exemplos de como usar a estrutura


ADS_SEARCHPREF_INFO , consulte as discussões do método
IDirectorySearch::SetSearchPreference e a enumeração ADS_SEARCHPREF_ENUM .

Requisitos
Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Estruturas ADSI

ADSVALUE

ADS_SEARCHPREF_ENUM

ADS_STATUSENUM

IDirectorySearch::SetSearchPreference

Comentários
Esta página foi útil?  Yes  No
estrutura ADS_SORTKEY (iads.h)
Artigo24/08/2023

A estrutura ADS_SORTKEY especifica como classificar uma consulta.

Sintaxe
C++

typedef struct _ads_sortkey {


LPWSTR pszAttrType;
LPWSTR pszReserved;
BOOLEAN fReverseorder;
} ADS_SORTKEY, *PADS_SORTKEY;

Membros
pszAttrType

A cadeia de caracteres Unicode terminada em nulo que contém o tipo de atributo.

pszReserved

Reservado.

fReverseorder

Inverta a ordem dos resultados classificados.

Comentários
No Active Directory, se TRUE, o membro fReverseorder especifica que os resultados da
classificação serão ordenados do mais baixo para o mais alto.

Ao usar o provedor de sistema LDAP, o membro pszReserved corresponde ao


sk_matchruleoid da estrutura LDAPSortKey e pode ser definido como uma cadeia de
caracteres terminada em NULL que especifica o OID (identificador de objeto) da regra
correspondente para a classificação. Para obter mais informações, consulte
LDAPSortKey.
Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Estruturas ADSI

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


estrutura ADS_TIMESTAMP (iads.h)
Artigo24/08/2023

A estrutura ADS_TIMESTAMP é uma representação ADSI da sintaxe do atributo


Timestamp .

Sintaxe
C++

typedef struct __MIDL___MIDL_itf_ads_0000_0000_0007 {


DWORD WholeSeconds;
DWORD EventID;
} ADS_TIMESTAMP, *PADS_TIMESTAMP;

Membros
WholeSeconds

Número de segundos, com valor zero igual a 12:00 AM, janeiro de 1970, UTC.

EventID

Um identificador de evento, na ordem de ocorrência, dentro do período especificado


por WholeSeconds.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Estruturas ADSI
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


estrutura ADS_TYPEDNAME (iads.h)
Artigo24/08/2023

A estrutura ADS_TYPEDNAME representa uma representação ADSI da sintaxe do


atributo Typed Name .

Sintaxe
C++

typedef struct __MIDL___MIDL_itf_ads_0000_0000_0009 {


LPWSTR ObjectName;
DWORD Level;
DWORD Interval;
} ADS_TYPEDNAME, *PADS_TYPEDNAME;

Membros
ObjectName

A cadeia de caracteres Unicode terminada em nulo que contém um nome de objeto.

Level

A prioridade associada ao objeto .

Interval

A frequência de referência do objeto .

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Estruturas ADSI

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Estrutura ADSVALUE (iads.h)
Artigo24/08/2023

A estrutura ADSVALUE contém um valor especificado como um tipo de dados ADSI.


Esses tipos de dados podem ser tipos de dados simples ADSI ou tipos de dados
personalizados definidos por ADSI que incluem estruturas de estilo C.

A estrutura ADS_ATTR_INFO contém uma matriz de estruturas ADSVALUE . Cada


estrutura ADSVALUE contém um único valor de atributo.

Sintaxe
C++

typedef struct _adsvalue {


ADSTYPE dwType;
union {
ADS_DN_STRING DNString;
ADS_CASE_EXACT_STRING CaseExactString;
ADS_CASE_IGNORE_STRING CaseIgnoreString;
ADS_PRINTABLE_STRING PrintableString;
ADS_NUMERIC_STRING NumericString;
ADS_BOOLEAN Boolean;
ADS_INTEGER Integer;
ADS_OCTET_STRING OctetString;
ADS_UTC_TIME UTCTime;
ADS_LARGE_INTEGER LargeInteger;
ADS_OBJECT_CLASS ClassName;
ADS_PROV_SPECIFIC ProviderSpecific;
PADS_CASEIGNORE_LIST pCaseIgnoreList;
PADS_OCTET_LIST pOctetList;
PADS_PATH pPath;
PADS_POSTALADDRESS pPostalAddress;
ADS_TIMESTAMP Timestamp;
ADS_BACKLINK BackLink;
PADS_TYPEDNAME pTypedName;
ADS_HOLD Hold;
PADS_NETADDRESS pNetAddress;
PADS_REPLICAPOINTER pReplicaPointer;
PADS_FAXNUMBER pFaxNumber;
ADS_EMAIL Email;
ADS_NT_SECURITY_DESCRIPTOR SecurityDescriptor;
PADS_DN_WITH_BINARY pDNWithBinary;
PADS_DN_WITH_STRING pDNWithString;
};
} ADSVALUE, *PADSVALUE, *LPADSVALUE;
Membros
dwType

Tipo de dados usado para interpretar o membro da união da estrutura. Os valores desse
membro são obtidos da enumeração ADSTYPEENUM .

DNString

A cadeia de caracteres Unicode terminada em nulo que identifica o nome diferenciado


(caminho) de um objeto de serviço de diretório, conforme definido por
ADS_DN_STRING, um tipo de dados simples ADSI.

CaseExactString

A cadeia de caracteres Unicode terminada em nulo a ser interpretada com diferenciação


de maiúsculas e minúsculas, conforme definido por ADS_CASE_EXACT_STRING, um tipo
de dados simples ADSI.

CaseIgnoreString

A cadeia de caracteres Unicode terminada em nulo a ser interpretada sem considerar o


caso, conforme definido por ADS_CASE_IGNORE_STRING, um tipo de dados simples
ADSI.

PrintableString

A cadeia de caracteres Unicode terminada em nulo que pode ser exibida ou impressa,
conforme definido por ADS_PRINTABLE_STRING, um tipo de dados simples ADSI.

NumericString

A cadeia de caracteres Unicode terminada em nulo que contém numerais a serem


interpretados como texto, conforme definido por ADS_NUMERIC_STRING, um tipo de
dados simples ADSI.

Boolean

Valor booliano, conforme definido por ADS_BOOLEAN, um tipo de dados adsi simples.

Integer

Valor inteiro, conforme definido por ADS_INTEGER, um tipo de dados simples ADSI.

OctetString
Uma cadeia de caracteres de octeto, conforme definido por ADS_OCTET_STRING, um
tipo de dados definido por ADSI.

UTCTime

Tempo especificado como UTC (Tempo Universal Coordenado), conforme definido por
ADS_UTC_TIME, um tipo de dados simples ADSI.

LargeInteger

Valor inteiro longo, conforme definido por ADS_LARGE_INTEGER, um tipo de dados


simples ADSI.

ClassName

Cadeia de caracteres de nome de classe, conforme definido por ADS_OBJECT_CLASS,


um tipo de dados simples ADSI.

ProviderSpecific

Estrutura específica do provedor, conforme definido por ADS_PROV_SPECIFIC, um tipo


de dados definido por ADSI.

pCaseIgnoreList

Ponteiro para um ADS_CASEIGNORE_LIST, um tipo de dados definido por ADSI.

pOctetList

Ponteiro para uma lista de ADS_OCTET_LIST, um tipo de dados definido por ADSI.

pPath

Ponteiro para o nome ADS_PATH , um tipo de dados definido por ADSI.

pPostalAddress

Ponteiro para os dados ADS_POSTALADDRESS , um tipo de dados definido por ADSI.

Timestamp

Carimbo de data/hora do tipo ADS_TIMESTAMP , um tipo de dados definido por ADSI.

BackLink

Um link do tipo ADS_BACKLINK , um tipo de dados definido por ADSI.


pTypedName

Ponteiro para o nome ADS_TYPEDNAME , um tipo de dados definido por ADSI.

Hold

Uma estrutura de dados do tipo ADS_HOLD , um tipo de dados definido por ADSI.

pNetAddress

Ponteiro para os dados ADS_NETADDRESS , um tipo de dados definido por ADSI.

pReplicaPointer

Ponteiro para um ponteiro réplica de ADS_REPLICAPOINTER, um tipo de dados definido


por ADSI.

pFaxNumber

Ponteiro para um número fac-símile de ADS_FAXNUMBER, um tipo de dados definido


por ADSI.

Email

Email endereço de um usuário de ADS_EMAIL, um tipo de dados definido por ADSI.

SecurityDescriptor

Descritor de segurança do Windows, conforme definido por


ADS_NT_SECURITY_DESCRIPTOR, um tipo de dados definido por ADSI.

pDNWithBinary

Ponteiro para uma estrutura ADS_DN_WITH_BINARY que mapeia um nome diferenciado


de um objeto para seu valor GUID.

pDNWithString

Ponteiro para uma estrutura ADS_DN_WITH_STRING que mapeia um nome diferenciado


de um objeto para um valor de cadeia de caracteres não variável.

Comentários
Os membros da estrutura ADSVALUE especificam o tipo de dados de atributos. Para
obter mais informações e um exemplo de código, consulte ADS_ATTR_INFO.
Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Tipos de dados simples ADSI

Estruturas ADSI

ADSTYPEENUM

ADS_ATTR_INFO

ADS_BACKLINK

ADS_CASEIGNORE_LIST

ADS_DN_WITH_BINARY

ADS_DN_WITH_STRING

ADS_EMAIL

ADS_FAXNUMBER

ADS_HOLD

ADS_NETADDRESS

ADS_NT_SECURITY_DESCRIPTOR

ADS_OCTET_LIST

ADS_OCTET_STRING

ADS_PATH

ADS_POSTALADDRESS

ADS_PROV_SPECIFIC
ADS_REPLICAPOINTER

ADS_TIMESTAMP

ADS_TYPEDNAME

IDirectoryObject::CreateDSObject

IDirectoryObject::GetObjectAttributes

IDirectoryObject::SetObjectAttributes

IDirectorySearch::SetSearchPreference

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


estrutura ADS_VLV (iads.h)
Artigo24/08/2023

A estrutura ADS_VLV contém metadados usados para realizar pesquisas de VLV


(exibição de lista virtual). Essa estrutura atende a duas funções. Primeiro, ele especifica
as preferências de pesquisa enviadas ao servidor. Em segundo lugar, ele retorna os
metadados VLV do servidor.

Sintaxe
C++

typedef struct _ads_vlv {


DWORD dwBeforeCount;
DWORD dwAfterCount;
DWORD dwOffset;
DWORD dwContentCount;
LPWSTR pszTarget;
DWORD dwContextIDLength;
LPBYTE lpContextID;
} ADS_VLV, *PADS_VLV;

Membros
dwBeforeCount

Indica o número de entradas, antes da entrada de destino, que o cliente solicita do


servidor.

dwAfterCount

Indica o número de entradas, após a entrada de destino, que o cliente solicita do


servidor.

dwOffset

Na entrada, indica o deslocamento solicitado da entrada de destino dentro da lista. Se o


cliente especificar um deslocamento que é igual à contagem de conteúdo presumida do
cliente, o destino será a última entrada na lista. Na saída, indica a melhor estimativa do
servidor quanto ao deslocamento real da posição da entrada de destino retornada na
lista.
dwContentCount

O valor de entrada representa o valor estimado do cliente para a contagem de


conteúdo. O valor de saída é a estimativa do servidor da contagem de conteúdo. Se o
cliente enviar uma contagem de conteúdo igual a zero, isso significa que o servidor
deve usar sua estimativa da contagem de conteúdo no lugar da do cliente.

pszTarget

Opcional. Cadeia de caracteres Unicode terminada em nulo que indica a entrada de


destino desejada solicitada pelo cliente. Se esse parâmetro contiver um valor não NULL ,
o servidor ignorará o valor especificado em dwOffset e procurará a primeira entrada de
destino cujo valor para a chave de classificação primária seja maior ou igual à cadeia de
caracteres especificada, com base na ordem de classificação da lista.

dwContextIDLength

Opcional. Parâmetro que indica o comprimento do identificador de contexto. Na


entrada, se passar um identificador de contexto em lpContextID, isso deverá ser
definido como o tamanho do identificador em bytes. Caso contrário, ele deverá ser
definido como zero. Na saída, se lpContextID contiver um valor não NULL , isso indicará
o comprimento, em bytes, da ID de contexto retornada pelo servidor.

lpContextID

Opcional. Indica o identificador de contexto gerado pelo servidor. Esse parâmetro pode
ser enviado aos clientes. Se um cliente receber esse parâmetro, ele deverá retorná-lo
inalterado em uma solicitação subsequente relacionada à mesma lista. Essa interação
pode melhorar o desempenho e a eficácia dos servidores. Se não passar um
identificador de contexto para o servidor, esse membro deverá ser definido como valor
NULL . Na saída, se esse membro contiver um valor não NULL , isso apontará para a ID
de contexto retornada pelo servidor.

Comentários
Para definir o VLV por dwContentCount e dwOffset, você também deve definir o
pszTarget como um valor NULL . Se pszTarget contiver um valor não NULL , ele será
usado como o deslocamento; caso contrário, lOffset será usado como o deslocamento.
É recomendável que você inicialize a estrutura como zero.

Exemplos
O exemplo de código a seguir mostra como recuperar as primeiras 30 entradas em um
conjunto de resultados.

C++

ADS_SEARCHPREF_INFO prefInfo[2];
ADS_VLV vlv;

vlv.dwBeforeCount=0;
vlv.dwAfterCount=30;
vlv.dwOffset=1;
vlv.dwContentCount=0;
vlv.pszTarget = NULL;
vlv.dwContextIDLength = 0;
vlv.lpContextID = NULL;

// VLV set preferences.


prefInfo[0].dwSearchPref = ADS_SEARCHPREF_VLV;
prefInfo[0].vValue.dwType = ADSTYPE_PROV_SPECIFIC;
prefInfo[0].vValue.ProviderSpecific.dwLength = sizeof(ADS_VLV);
prefInfo[0].vValue.ProviderSpecific.lpValue = (LPBYTE) &vlv;

// Sort key set preferences.


prefInfo[1].dwSearchPref = ADS_SEARCHPREF_SORT_ON;
prefInfo[1].vValue.dwType = ADSTYPE_PROV_SPECIFIC;
prefInfo[1].vValue.ProviderSpecific.dwLength = sizeof(ADS_SORTKEY);
prefInfo[1].vValue.ProviderSpecific.lpValue = (LPBYTE) pSortKey;

hr = m_pSearch->SetSearchPreference(prefInfo, 2);

O exemplo de código a seguir mostra como recuperar as primeiras 50 entradas em um


conjunto de resultados que começam com as letras "Ha".

C++

ADS_VLV vlv;

vlv.dwBeforeCount=0;
vlv.dwAfterCount=50;
vlv.pszTarget= L"Ha";
vlv.lpContextID = NULL;
vlv.dwContextIDLength = 0;

// For more information about how to set the preference, see the previous
code example.

O exemplo de código a seguir mostra como recuperar as primeiras 100 entradas no


destino aproximado de 60%, supondo que o servidor tenha retornado dwContentCount
anteriormente como 4294.
Observe que vlvResp representa uma estrutura ADS_VLV retornada anteriormente
pelo servidor.

C++

ADS_VLV vlv;

vlv.dwBeforeCount=50;
vlv.dwAfterCount=50;
vlv.dwOffset=2577;
vlv.dwContentCount=4294;
vlv.pszTarget = NULL;
vlv.dwContextIDLength = vlvResp.dwContextIDLength;
vlv.lpContextID = vlvResp.lpContextID;

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
ADS_SEARCHPREF_ENUM

Como pesquisar usando o VLV

Idirectorysearch

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Enumerações ADSI
Artigo • 03/06/2023

AS ADSI (Interfaces de Serviço do Active Directory) definem e usam as enumerações


listadas na tabela a seguir.

Enumeração Descrição

ADS_ACEFLAG_ENUM Especifica como a segurança se propaga para ACEs


(entradas de controle de acesso) herdadas e tipos de
auditoria para um ACE do sistema.

ADS_ACETYPE_ENUM Especifica o tipo ACE.

ADS_AUTHENTICATION_ENUM Especifica o nível de segurança usado na autenticação de


um cliente.

ADS_CHASE_REFERRALS_ENUM Especifica o comportamento da perseguição de


referência.

ADS_DEREFENUM Especifica o comportamento do alias dereferencing.

ADS_DISPLAY_ENUM Especifica como um caminho é exibido.

ADS_ESCAPE_MODE_ENUM Especifica se os caracteres especiais são escapados, sem


escape ou intocados.

ADS_FLAGTYPE_ENUM Especifica a presença dos campos ObjectType ou


InheritedObjectType em um ACE.

ADS_FORMAT_ENUM Especifica o tipo de valores em um objeto pathname.

ADS_GROUP_TYPE_ENUM Especifica o tipo de grupo do membro.

ADS_NAME_INITTYPE_ENUM Especifica o tipo de inicialização a ser executado em um


objeto de conversão de nome.

ADS_NAME_TYPE_ENUM Especifica o formato usado para representar nomes


diferenciados.

ADS_OPTION_ENUM Especifica as opções disponíveis que a interface


IADsObjectOptions usa para manipular objetos de
diretório.

ADS_PASSWORD_ENCODING_ENUM Usado para identificar o tipo de codificação de senha


usado com a opção ADS_OPTION_PASSWORD_METHOD
nos métodos IADsObjectOptions::GetOption e
IADsObjectOptions::SetOption .
Enumeração Descrição

ADS_PATHTYPE_ENUM Especifica o tipo de objeto no qual o descritor de


segurança é modificado.

ADS_PREFERENCES_ENUM Especifica as preferências de consulta do OLE DB para


ADSI.

ADS_PROPERTY_OPERATION_ENUM Especifica as maneiras de atualizar valores de


propriedade no cache de propriedades.

ADS_RIGHTS_ENUM Especifica os direitos de acesso a um objeto de serviço de


diretório.

ADS_SCOPEENUM Especifica o escopo de uma pesquisa de diretório.

ADS_SD_CONTROL_ENUM Especifica que uma ACL (lista de controle de acesso) deve


ser protegida quando novas permissões são aplicadas
recursivamente a uma árvore de diretório.

ADS_SD_FORMAT_ENUM Especifica o formato para converter o descritor de


segurança.

ADS_SD_REVISION_ENUM Especifica o número de revisão de um ACE ou ACL.

ADS_SEARCHPREF_ENUM Especifica as preferências da pesquisa.

ADS_SECURITY_INFO_ENUM Especifica as opções para examinar dados de segurança.

ADS_SETTYPE_ENUM Especifica o formato de caminho em IADsPathname::Set.

ADS_STATUSENUM Especifica o status das preferências de pesquisa.

ADS_SYSTEMFLAG_ENUM Especifica os tipos de atributos representados por um


objeto attributeSchema .

ADS_USER_FLAG_ENUM Especifica sinalizadores usados para manipular


propriedades do usuário.

ADSI_DIALECT_ENUM Especifica dialetos de consulta ADSI disponíveis.

ADSTYPEENUM Especifica os tipos de dados usados para interpretar uma


cadeia de caracteres de sintaxe estendida ADSI.

Comentários
Como os aplicativos Visual Basic Scripting Edition não podem ler dados de uma
biblioteca de tipos, os aplicativos VBScript não podem reconhecer constantes simbólicas
conforme definido nessas enumerações. Use as constantes numéricas para definir os
sinalizadores apropriados em aplicativos VBScript. Para usar as constantes simbólicas
como uma boa prática de programação, escreva declarações explícitas dessas
constantes, como feito aqui, em aplicativos VBScript.

Tópicos relacionados
IADsObjectOptions

IADsPathname::Set

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


enumeração ADS_ACEFLAG_ENUM
(iads.h)
Artigo24/08/2023

A enumeração ADS_ACEFLAG_ENUM é usada para especificar o comportamento de


uma ACE (entrada de Controle de Acesso) para um objeto do Active Directory.

Para obter mais informações e valores possíveis para arquivos, compartilhamento de


arquivos e objetos do Registro, consulte o membro AceFlags da estrutura ACE_HEADER
.

Syntax
C++

typedef enum __MIDL___MIDL_itf_ads_0001_0048_0003 {


ADS_ACEFLAG_INHERIT_ACE = 0x2,
ADS_ACEFLAG_NO_PROPAGATE_INHERIT_ACE = 0x4,
ADS_ACEFLAG_INHERIT_ONLY_ACE = 0x8,
ADS_ACEFLAG_INHERITED_ACE = 0x10,
ADS_ACEFLAG_VALID_INHERIT_FLAGS = 0x1f,
ADS_ACEFLAG_SUCCESSFUL_ACCESS = 0x40,
ADS_ACEFLAG_FAILED_ACCESS = 0x80
} ADS_ACEFLAG_ENUM;

Constantes

ADS_ACEFLAG_INHERIT_ACE
Valor: 0x2
Objetos filho herdarão essa ACE (entrada de controle de acesso). O ACE herdado é herdável, a
menos que o sinalizador ADS_ACEFLAG_NO_PROPAGATE_INHERIT_ACE esteja definido.

ADS_ACEFLAG_NO_PROPAGATE_INHERIT_ACE
Valor: 0x4
O sistema limpará o sinalizador ADS_ACEFLAG_INHERIT_ACE para os ACEs herdados de objetos
filho. Isso impede que o ACE seja herdado por gerações subsequentes de objetos.

ADS_ACEFLAG_INHERIT_ONLY_ACE
Valor: 0x8
Indica que um ACE somente herdado que não exerce o controle de acesso no objeto ao qual ele
está anexado. Se esse sinalizador não estiver definido, o ACE será um ACE eficaz que exerce o
controle de acesso no objeto ao qual ele está anexado.

ADS_ACEFLAG_INHERITED_ACE
Valor: 0x10
Indica se o ACE foi herdado ou não. O sistema define esse bit.

ADS_ACEFLAG_VALID_INHERIT_FLAGS
Valor: 0x1f
Indica se os sinalizadores herdados são válidos. O sistema define esse bit.

ADS_ACEFLAG_SUCCESSFUL_ACCESS
Valor: 0x40
Gera mensagens de auditoria para tentativas de acesso bem-sucedidas, usadas com ACEs que
auditam o sistema em uma SACL (lista de controle de acesso do sistema).

ADS_ACEFLAG_FAILED_ACCESS
Valor: 0x80
Gera mensagens de auditoria para tentativas de acesso com falha, usadas com ACEs que auditam
o sistema em uma SACL.

Comentários
Como o VBScript não pode ler dados de uma biblioteca de tipos, os aplicativos VBScript
não entendem as constantes simbólicas conforme definido nessas enumerações. Em vez
disso, você deve usar as constantes numéricas para definir os sinalizadores apropriados
em seus aplicativos VBScript. Se você quiser usar as constantes simbólicas como uma
boa prática de programação, escreva declarações explícitas dessas constantes, como
feito aqui, em seus aplicativos VBScript.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Enumerações ADSI
IADsObjectOptions

IADsPathname::Set

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


ADS_ACETYPE_ENUM enumeração
(iads.h)
Artigo24/08/2023

A enumeração ADS_ACETYPE_ENUM é usada para especificar o tipo de uma entrada de


controle de acesso para objetos do Active Directory. A propriedade
IADsAccessControlEntry.AceType contém um desses valores para um objeto do Active
Directory.

Para obter mais informações e valores possíveis para arquivos, compartilhamento de


arquivos e objetos do Registro, consulte o membro AceType da estrutura ACE_HEADER .

Syntax
C++

typedef enum __MIDL___MIDL_itf_ads_0001_0048_0002 {


ADS_ACETYPE_ACCESS_ALLOWED = 0,
ADS_ACETYPE_ACCESS_DENIED = 0x1,
ADS_ACETYPE_SYSTEM_AUDIT = 0x2,
ADS_ACETYPE_ACCESS_ALLOWED_OBJECT = 0x5,
ADS_ACETYPE_ACCESS_DENIED_OBJECT = 0x6,
ADS_ACETYPE_SYSTEM_AUDIT_OBJECT = 0x7,
ADS_ACETYPE_SYSTEM_ALARM_OBJECT = 0x8,
ADS_ACETYPE_ACCESS_ALLOWED_CALLBACK = 0x9,
ADS_ACETYPE_ACCESS_DENIED_CALLBACK = 0xa,
ADS_ACETYPE_ACCESS_ALLOWED_CALLBACK_OBJECT = 0xb,
ADS_ACETYPE_ACCESS_DENIED_CALLBACK_OBJECT = 0xc,
ADS_ACETYPE_SYSTEM_AUDIT_CALLBACK = 0xd,
ADS_ACETYPE_SYSTEM_ALARM_CALLBACK = 0xe,
ADS_ACETYPE_SYSTEM_AUDIT_CALLBACK_OBJECT = 0xf,
ADS_ACETYPE_SYSTEM_ALARM_CALLBACK_OBJECT = 0x10
} ADS_ACETYPE_ENUM;

Constantes

ADS_ACETYPE_ACCESS_ALLOWED
Valor: 0
O ACE é do tipo ACCESS ALLOWED padrão, em que os campos ObjectType e
InheritedObjectType são NULL.
ADS_ACETYPE_ACCESS_DENIED
Valor: 0x1
O ACE é do tipo padrão de auditoria do sistema, em que os campos ObjectType e
InheritedObjectType são NULL.

ADS_ACETYPE_SYSTEM_AUDIT
Valor: 0x2
O ACE é do tipo de sistema padrão, em que os campos ObjectType e InheritedObjectType são
NULL.

ADS_ACETYPE_ACCESS_ALLOWED_OBJECT
Valor: 0x5
A ACE concede acesso a um objeto ou a um subobjeto do objeto, como um conjunto de
propriedades ou uma propriedade. ObjectType ou InheritedObjectType ou ambos contêm um
GUID que identifica um conjunto de propriedades, uma propriedade, um direito estendido ou um
tipo de objeto filho.

ADS_ACETYPE_ACCESS_DENIED_OBJECT
Valor: 0x6
A ACE nega acesso a um objeto ou um subobjeto do objeto, como um conjunto de propriedades
ou uma propriedade. ObjectType ou InheritedObjectType ou ambos contêm um GUID que
identifica um conjunto de propriedades, uma propriedade, um direito estendido ou um tipo de
objeto filho.

ADS_ACETYPE_SYSTEM_AUDIT_OBJECT
Valor: 0x7
A ACE audita o acesso a um objeto ou um subobjeto do objeto, como um conjunto de
propriedades ou uma propriedade. ObjectType ou InheritedObjectType ou ambos contêm um
GUID que identifica um conjunto de propriedades, uma propriedade, um direito estendido ou um
tipo de objeto filho.

ADS_ACETYPE_SYSTEM_ALARM_OBJECT
Valor: 0x8
Não usado.

ADS_ACETYPE_ACCESS_ALLOWED_CALLBACK
Valor: 0x9
Mesma funcionalidade que ADS_ACETYPE_ACCESS_ALLOWED, mas usada com aplicativos que
usam Authz para verificar ACEs.

ADS_ACETYPE_ACCESS_DENIED_CALLBACK
Valor: 0xa
Mesma funcionalidade que ADS_ACETYPE_ACCESS_DENIED, mas usada com aplicativos que usam
Authz para verificar ACEs.

ADS_ACETYPE_ACCESS_ALLOWED_CALLBACK_OBJECT
Valor: 0xb
Mesma funcionalidade que ADS_ACETYPE_ACCESS_ALLOWED_OBJECT, mas usada com
aplicativos que usam Authz para verificar ACEs.

ADS_ACETYPE_ACCESS_DENIED_CALLBACK_OBJECT
Valor: 0xc
Mesma funcionalidade que ADS_ACETYPE_ACCESS_DENIED_OBJECT, mas usada com aplicativos
que usam Authz para marcar ACEs.

ADS_ACETYPE_SYSTEM_AUDIT_CALLBACK
Valor: 0xd
Mesma funcionalidade que ADS_ACETYPE_SYSTEM_AUDIT, mas usada com aplicativos que usam
Authz para marcar ACEs.

ADS_ACETYPE_SYSTEM_ALARM_CALLBACK
Valor: 0xe
Não usado.

ADS_ACETYPE_SYSTEM_AUDIT_CALLBACK_OBJECT
Valor: 0xf
Mesma funcionalidade que ADS_ACETYPE_SYSTEM_AUDIT_OBJECT, mas usada com aplicativos
que usam Authz para verificar ACEs.

ADS_ACETYPE_SYSTEM_ALARM_CALLBACK_OBJECT
Valor: 0x10
Não usado.

Comentários
Uma ACE padrão é definida e usada em um descritor de segurança do Windows. O
Windows permite que a ACE seja aplicada a objetos e propriedades identificados por
GUIDs.

Use o método de propriedade IADsAccessControlEntry para determinar o tipo ACE.

Nota Como o Visual Basic Scripting Edition (VBScript) não pode ler dados de uma
biblioteca de tipos, os aplicativos VBScript não podem reconhecer constantes
simbólicas conforme definido acima. Em vez disso, use as constantes numéricas
para definir os sinalizadores apropriados em aplicativos VBScript. Para usar as
constantes simbólicas como uma boa prática de programação, escreva declarações
explícitas dessas constantes, como feito aqui, em aplicativos VBScript.
Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Enumerações ADSI

IADsAccessControlEntry

IADsAccessControlEntry.AceType

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


ADS_AUTHENTICATION_ENUM
enumeração (iads.h)
Artigo24/08/2023

A enumeração ADS_AUTHENTICATION_ENUM especifica opções de autenticação


usadas no ADSI para associação a objetos de serviço de diretório. Ao chamar
IADsOpenDSObject ou ADsOpenObject para associar a um objeto ADSI, forneça pelo
menos uma das opções. Em geral, provedores diferentes terão implementações
diferentes. As opções documentadas aqui se aplicam aos provedores fornecidos pela
Microsoft incluídos no SDK do ADSI. Para obter mais informações, consulte Provedores
de sistema ADSI.

Syntax
C++

typedef enum __MIDL___MIDL_itf_ads_0000_0000_0018 {


ADS_SECURE_AUTHENTICATION = 0x1,
ADS_USE_ENCRYPTION = 0x2,
ADS_USE_SSL = 0x2,
ADS_READONLY_SERVER = 0x4,
ADS_PROMPT_CREDENTIALS = 0x8,
ADS_NO_AUTHENTICATION = 0x10,
ADS_FAST_BIND = 0x20,
ADS_USE_SIGNING = 0x40,
ADS_USE_SEALING = 0x80,
ADS_USE_DELEGATION = 0x100,
ADS_SERVER_BIND = 0x200,
ADS_NO_REFERRAL_CHASING = 0x400,
ADS_AUTH_RESERVED = 0x80000000
} ADS_AUTHENTICATION_ENUM;

Constantes

ADS_SECURE_AUTHENTICATION
Valor: 0x1
Solicita a autenticação segura. Quando esse sinalizador é definido, o provedor WinNT usa o NTLM
(NT LAN Manager) para
autenticar o cliente. O Active Directory usará Kerberos e, possivelmente, NTLM, para autenticar o
cliente. Quando
o nome de usuário e a senha são NULL, ADSI associa ao objeto usando a segurança
contexto do thread de chamada, que é o contexto de segurança da conta de usuário sob o qual o
O aplicativo está em execução ou da conta de usuário cliente que o thread de chamada
representa.

ADS_USE_ENCRYPTION
Valor: 0x2
Requer que o ADSI use criptografia para troca de dados pela rede.

Nota Essa opção não tem suporte do provedor WinNT.

ADS_USE_SSL
Valor: 0x2
O canal é criptografado usando SSL (Secure Sockets Layer). O Active Directory requer que o
Certificado
O servidor será instalado para dar suporte ao SSL.

Se esse sinalizador não for combinado com o sinalizador ADS_SECURE_AUTHENTICATION e o


as credenciais fornecidas são NULL, a associação será executada anonimamente. Se esse
sinalizador
é combinado com o sinalizador ADS_SECURE_AUTHENTICATION e as credenciais fornecidas são
NULL, as credenciais do thread de chamada são usadas.

Nota Essa opção não tem suporte do provedor WinNT.

ADS_READONLY_SERVER
Valor: 0x4
Um controlador de domínio gravável não é necessário. Se o aplicativo ler ou consultar apenas
dados do Active
Diretório, você deve usar esse sinalizador para abrir as sessões. Isso permite que o aplicativo
aproveite
Read-Only DCs (RODCs).

No Windows Server 2008, o ADSI tenta se conectar a DCs Read-Only (RODCs) ou DCs graváveis.
Esse
permite o uso de um RODC para o acesso e permite que o aplicativo seja executado em um
branch ou rede de perímetro
(também conhecida como DMZ, zona desmilitarizada e sub-rede filtrada), sem a necessidade de
conectividade direta com um
DC gravável.
Para obter mais informações sobre programação para compatibilidade com RODC, consulte o
Guia de compatibilidade de aplicativos somente leitura de controladores de domínio.

ADS_PROMPT_CREDENTIALS
Valor: 0x8
Não há suporte para esse sinalizador.

ADS_NO_AUTHENTICATION
Valor: 0x10
Não solicite nenhuma autenticação. Os provedores podem tentar associar o cliente, como um
usuário anônimo, ao
objeto de destino. O provedor WinNT não dá suporte a esse sinalizador. O Active Directory
estabelece uma conexão entre
o cliente e o objeto de destino, mas não executará a autenticação. Definir esse sinalizador
equivale à solicitação
uma associação anônima, que indica todos os usuários como o contexto de segurança.

ADS_FAST_BIND
Valor: 0x20
Quando esse sinalizador for definido, ADSI não tentará consultar o objectClass
e, portanto, só exporá as interfaces base compatíveis com todos os objetos ADSI em vez do
objeto completo
Apoio. Um usuário pode usar essa opção para aumentar o desempenho em uma série de
manipulações de objeto que envolvem
somente métodos das interfaces base. No entanto, ADSI não verificará se nenhum dos objetos
solicitados realmente
existem no servidor. Para obter mais informações, consulte
Opções de associação rápida para operações de gravação/modificação em lote.

Essa opção também é útil para associação a serviços de diretório que não são do Active Directory,
por exemplo, Exchange 5.5,
em que a consulta objectClass falharia.

ADS_USE_SIGNING
Valor: 0x40
Verifica a integridade dos dados. O sinalizador ADS_SECURE_AUTHENTICATION também deve
ser definido
para usar a assinatura.

Nota Essa opção não tem suporte do provedor WinNT.

ADS_USE_SEALING
Valor: 0x80
Criptografa dados usando o Kerberos. O sinalizador ADS_SECURE_AUTHENTICATION também
deve ser definido
para usar a vedação.

Nota Essa opção não tem suporte do provedor WinNT.

ADS_USE_DELEGATION
Valor: 0x100
Permite que o ADSI delegue o contexto de segurança do usuário, que é necessário para mover
objetos entre domínios.

ADS_SERVER_BIND
Valor: 0x200
Se um nome de servidor DNS do Active Directory for passado no caminho LDAP, isso forçará uma
pesquisa de registro A e
ignora qualquer pesquisa de registro SRV ao resolver o nome do host.

Nota Essa opção não tem suporte do provedor WinNT.

ADS_NO_REFERRAL_CHASING
Valor: 0x400
Especifique esse sinalizador para desativar a busca de referência durante a vida útil da conexão.
No entanto, mesmo quando esse sinalizador
é especificado, ADSI ainda permite a configuração de comportamento de busca de referência
para enumeração de contêiner quando definido
usando ADS_OPTION_REFERRALS no
ADS_OPTION_ENUM (conforme documentado na enumeração de contêiner
com indicação perseguindo em
IADsObjectOptions::SetOption) E
pesquisando separadamente (conforme documentado em
Busca de referência com IDirectorySearch).

Nota Essa opção não tem suporte do provedor WinNT.


ADS_AUTH_RESERVED
Valor: 0x80000000
Reservado.

Comentários
O sinalizador ADS_SECURE_AUTHENTICATION pode ser usado em combinação com
outros sinalizadores, como ADS_READONLY_SERVER, ADS_PROMPT_CREDENTIALS,
ADS_FAST_BIND e assim por diante.

Associação sem servidor refere-se a um processo no qual um cliente tenta associar a um


objeto do Active Directory sem especificar explicitamente um servidor do Active
Directory na cadeia de caracteres de associação. Isso é possível porque o provedor
LDAP depende dos serviços localizadores do Windows para encontrar o melhor
controlador de domínio (DC) para o cliente. No entanto, o cliente deve ter uma conta no
controlador de domínio do Active Directory para aproveitar o recurso de associação
sem servidor e o DC usado por uma associação sem servidor sempre estará localizado
no domínio padrão; ou seja, o domínio associado ao contexto de segurança atual do
thread que executa a associação.

Como o VBScript não pode ler dados de uma biblioteca de tipos, os aplicativos VBScript
não reconhecem as constantes simbólicas, conforme definido acima. Em vez disso, use
as constantes numéricas para definir os sinalizadores apropriados em seus aplicativos
VBScript. Para usar as constantes simbólicas como uma boa prática de programação,
escreva declarações explícitas dessas constantes, conforme feito aqui, no aplicativo
edição scripting do Visual Basic.

Exemplos

O exemplo de código a seguir mostra como usar IADsOpenDSObject para abrir um


objeto na fabrikam com autenticação segura para o provedor WinNT.

VB

Const ADS_SECURE_AUTHENTICATION = 1

Dim dso As IADsOpenDSObject


Dim domain As IADsDomain

Set dso = GetObject("WinNT:")


Set domain = dso.OpenDSObject("WinNT://Fabrikam", vbNullString,
vbNullString, ADS_SECURE_AUTHENTICATION)

O exemplo de código a seguir mostra como o sinalizador


ADS_SECURE_AUTHENTICATION é usado com ADsOpenObject para validar o usuário
associado como "JeffSmith". O nome de usuário pode ser do formato UPN:
"JeffSmith@Fabrikam.com", bem como o formato de nome diferenciado:
"CN=JeffSmith,DC=Fabrikam,DC=COM".

C++

IADs *pObject = NULL;


HRESULT hr;
hr = ADsOpenObject(_bstr_t("LDAP://CN=JeffSmith, DC=fabrikam, DC=com"),
NULL,
NULL,
ADS_SECURE_AUTHENTICATION,
IID_IADs,
(void**) &pObject);
if (hr != S_OK)
{} // Handle open object errors here.
else
{} // Object was retrieved, continue processing here.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Enumerações ADSI

Provedores de sistema ADSI

ADsOpenObject

IADsAccessControlEntry

IADsOpenDSObject
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


ADS_CHASE_REFERRALS_ENUM
enumeração (iads.h)
Artigo24/08/2023

A enumeração ADS_CHASE_REFERRALS_ENUM especifica se e como ocorrerá a busca


de referências. Quando um servidor determina que outros servidores contêm dados
relevantes, em parte ou como um todo, ele pode encaminhar o cliente para outro
servidor para obter o resultado. A busca de referências é a ação executada por um
cliente para entrar em contato com o servidor referenciado para continuar a pesquisa de
diretório.

Syntax
C++

typedef enum __MIDL___MIDL_itf_ads_0000_0000_0024 {


ADS_CHASE_REFERRALS_NEVER = 0,
ADS_CHASE_REFERRALS_SUBORDINATE = 0x20,
ADS_CHASE_REFERRALS_EXTERNAL = 0x40,
ADS_CHASE_REFERRALS_ALWAYS
} ADS_CHASE_REFERRALS_ENUM;

Constantes

ADS_CHASE_REFERRALS_NEVER
Valor: 0
O cliente nunca deve perseguir o servidor referenciado. A configuração dessa opção impede que
um cliente entre em contato com outros servidores em um processo de referência.

ADS_CHASE_REFERRALS_SUBORDINATE
Valor: 0x20
O cliente persegue apenas indicações subordinadas que são um contexto de nomenclatura
subordinado em uma árvore de diretório. Por exemplo, se a pesquisa base for solicitada para
"DC=Fabrikam,DC=Com" e o servidor retornar um conjunto de resultados e uma indicação de
"DC=Sales,DC=Fabrikam,DC=Com" no servidor AdbSales, o cliente poderá entrar em contato com
o servidor AdbSales para continuar a pesquisa. O provedor LDAP ADSI sempre desativa esse
sinalizador para pesquisas paginadas.

ADS_CHASE_REFERRALS_EXTERNAL
Valor: 0x40
O cliente persegue indicações externas. Por exemplo, um cliente solicita que o servidor A execute
uma pesquisa por "DC=Fabrikam,DC=Com". No entanto, o servidor A não contém o objeto , mas
sabe que um servidor independente, B, é o proprietário dele. Em seguida, ele encaminha o cliente
para o servidor B.

ADS_CHASE_REFERRALS_ALWAYS
As indicações são perseguidas para o tipo subordinado ou externo.

Comentários
Use as constantes dessa enumeração para configurar preferências de pesquisa para
busca de referências. A ação equivale a atribuir os campos apropriados da estrutura de
ADS_SEARCHPREF_INFO com elementos das enumerações
ADS_CHASE_REFERRALS_ENUM e ADS_SEARCHPREF_ENUM . Os valores dessa
enumeração também podem ser usados com IADsObjectOptions para especificar se a
perseguição de indicação deve ocorrer ao enumerar os objetos em um objeto de
contêiner.

A interface IADsNameTranslate tem uma implementação parcial de


ADS_CHASE_REFERRALS_ENUM por meio da propriedade ChaseReferral . Se a
propriedade ChaseReferral estiver definida como zero (0), será o mesmo que especificar
ADS_CHASE_REFERRALS_NEVER (0). Se um valor diferente de zero for usado, ele será o
mesmo que especificar ADS_CHASE_REFERRALS_ALWAYS (0x60). IADsNameTranslate
não implementa as opções ADS_CHASE_REFERRALS_SUBORDINATE (0x20) ou
ADS_CHASE_REFERRALS_EXTERNAL (0x40).

O provedor LDAP ADSI dá suporte a indicações externas para pesquisas paginados, mas
não dá suporte a indicações subordinadas durante a paginação.

Nota Como o VBScript não pode ler dados de uma biblioteca de tipos, os
aplicativos VBScript não entendem as constantes simbólicas, conforme definido
acima. Em vez disso, você deve usar as constantes numéricas para definir os
sinalizadores apropriados em seus aplicativos VBScript. Se você quiser usar as
constantes simbólicas como uma boa prática de programação, deverá fazer
declarações explícitas dessas constantes, conforme feito aqui, em seus aplicativos
VBScript.

Requisitos
Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Enumerações ADSI

ADS_SEARCHPREF_ENUM

ADS_SEARCHPREF_INFO

IADsNameTranslate

IADsObjectOptions

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


ADS_DEREFENUM enumeração (iads.h)
Artigo24/08/2023

A enumeração ADS_DEREFENUM especifica o processo por meio do qual os aliases são


desreferenciados.

Syntax
C++

typedef enum __MIDL___MIDL_itf_ads_0000_0000_0020 {


ADS_DEREF_NEVER = 0,
ADS_DEREF_SEARCHING = 1,
ADS_DEREF_FINDING = 2,
ADS_DEREF_ALWAYS = 3
} ADS_DEREFENUM;

Constantes

ADS_DEREF_NEVER
Valor: 0
Não desreferencia aliases ao pesquisar ou localizar o objeto base da pesquisa.

ADS_DEREF_SEARCHING
Valor: 1
Desreferencia os aliases ao pesquisar subordinados do objeto base, mas não ao localizar a base
em si.

ADS_DEREF_FINDING
Valor: 2
Desreferencia os aliases ao localizar os objetos base da pesquisa, mas não ao pesquisar seus
subordinados.

ADS_DEREF_ALWAYS
Valor: 3
Desreferencia os aliases ao pesquisar subordinados e localizar o objeto base da pesquisa.

Comentários
A interface IDirectorySearch usa essas constantes para definir o comportamento de
desreferenciamento de alias. Se nenhuma opção for especificada, o servidor usará como
padrão ADS_DEREF_NEVER.

Nota Como o VBScript não pode ler dados de uma biblioteca de tipos, os
aplicativos VBScript não reconhecem as constantes simbólicas, conforme definido
acima. Em vez disso, use as constantes numéricas para definir os sinalizadores
apropriados em seus aplicativos VBScript. Para usar as constantes simbólicas, como
uma boa prática de programação, declare explicitamente constantes, conforme
feito aqui.

Exemplos
O exemplo de código a seguir mostra como definir a preferência de pesquisa para
desreferenciamento de alias. m_pSearch refere-se a um ponteiro para um objeto que
implementa a interface IDirectorySearch .

C++

ADS_SEARCHPREF_INFO prefInfo[1];
HRESULT hr;

prefInfo[0].dwSearchPref = ADS_SEARCHPREF_DEREF_ALIASES;
prefInfo[0].vValue.dwType = ADSTYPE_INTEGER;
prefInfo[0].vValue.Integer = ADS_DEREF_ALWAYS;
hr = m_pSearch->SetSearchPreference(prefInfo, 1);

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Enumerações ADSI

Idirectorysearch
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


ADS_DISPLAY_ENUM enumeração
(iads.h)
Artigo24/08/2023

A enumeração ADS_DISPLAY_ENUM especifica como um caminho deve ser exibido.

Syntax
C++

typedef enum __MIDL___MIDL_itf_ads_0001_0078_0003 {


ADS_DISPLAY_FULL = 1,
ADS_DISPLAY_VALUE_ONLY = 2
} ADS_DISPLAY_ENUM;

Constantes

ADS_DISPLAY_FULL
Valor: 1
O caminho é exibido com atributos e valores. Por exemplo, CN=Jeff Smith.

ADS_DISPLAY_VALUE_ONLY
Valor: 2
O caminho é exibido apenas com valores. Por exemplo, Jeff Smith.

Comentários
Essa enumeração é usada no método IADsPathname::SetDisplayType para especificar
como um caminho deve ser exibido.

Nota Como o VBScript não pode ler dados de uma biblioteca de tipos, os
aplicativos VBScript não entendem as constantes simbólicas, conforme definido
acima. Em vez disso, você deve usar as constantes numéricas para definir os
sinalizadores apropriados em seus aplicativos VBScript. Se você quiser usar as
constantes simbólicas como uma boa prática de programação, deverá criar
declarações explícitas dessas constantes, conforme feito aqui, em seus aplicativos
VBScript.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Enumerações ADSI

IADsPathname::SetDisplayType

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


ADS_ESCAPE_MODE_ENUM enumeração
(iads.h)
Artigo24/08/2023

A enumeração ADS_ESCAPE_MODE_ENUM especifica como os caracteres de escape


são exibidos em um caminho de diretório.

Syntax
C++

typedef enum __MIDL___MIDL_itf_ads_0001_0078_0004 {


ADS_ESCAPEDMODE_DEFAULT = 1,
ADS_ESCAPEDMODE_ON = 2,
ADS_ESCAPEDMODE_OFF = 3,
ADS_ESCAPEDMODE_OFF_EX = 4
} ADS_ESCAPE_MODE_ENUM;

Constantes

ADS_ESCAPEDMODE_DEFAULT
Valor: 1
O modo de escape padrão fornece uma opção conveniente para especificar o modo de escape.
Ele tem o efeito da operação de escape mínima apropriada para um formato escolhido. Portanto,
o comportamento padrão depende do valor que ADS_FORMAT_ENUM usa para recuperar os
caminhos de diretório.
Formato de caminho recuperado Modo de escape padrão

ADS_FORMAT_X500 ADS_ESCAPEDMODE_ON

ADS_FORMAT_X500_NO_SERVER ADS_ESCAPEDMODE_ON

ADS_FORMAT_WINDOWS ADS_ESCAPEDMODE_ON

ADS_FORMAT_WINDOWS_NO_SERVER ADS_ESCAPEDMODE_ON

ADS_FORMAT_X500_DN ADS_ESCAPEDMODE_OFF

ADS_FORMAT_X500_PARENT ADS_ESCAPEDMODE_OFF

ADS_FORMAT_WINDOWS_DN ADS_ESCAPEDMODE_OFF

ADS_FORMAT_WINDOWS_PARENT ADS_ESCAPEDMODE_OFF

ADS_FORMAT_LEAF ADS_ESCAPEDMODE_ON
ADS_ESCAPEDMODE_ON
Valor: 2
Todos os caracteres especiais são exibidos no formato de escape; por exemplo,
"CN=date=yy/mm/dd,weekday" aparece como está.

ADS_ESCAPEDMODE_OFF
Valor: 3
Caracteres especiais ADSI são exibidos no formato sem escape; por exemplo,
"CN=date=yy/mm/dd,weekday" aparece como "CN=date=yy/mm/dd,weekday".

ADS_ESCAPEDMODE_OFF_EX
Valor: 4
Caracteres especiais ADSI e LDAP são exibidos no formato sem escape; por exemplo,
"CN=date=yy/mm/dd,weekday" aparece como "CN=date=yy/mm/dd,weekday".

Comentários
Caracteres especiais devem ser escapados quando usados para fins não intencionais.
Por exemplo, caracteres especiais LDAP, a vírgula (,) e o sinal de igual (=), são destinados
como separadores de campo em um nome diferenciado,
"CN=user,CN=users,DC=Fabrikam,DC=com". Quando um valor de atributo usa esses
caracteres especiais, por exemplo, "CN=users,last name=Smith", esses caracteres
especiais devem ser escapados conforme mostrado. Isso garante que um diretório
compatível com LDAP, como o Active Directory, analise o caminho corretamente. No
entanto, uma cadeia de caracteres de caminho de escape pode não parecer amigável
em uma exibição. Nesse caso, você pode definir o ADS_ESCAPE_MODE_ENUM de forma
que mostre o caminho como uma cadeia de caracteres sem escape, "CN=users,last
name=Smith".

Da mesma forma, o caractere especial ADSI, a barra (/), separa elementos específicos do
ADSI, "LDAP://server/CN=Jeff Smith,CN=Users,DC=Fabrikam,DC=com". Embora ele
precise ser escapado quando usado para qualquer outra finalidade, por exemplo,
"LDAP://server/CN=Jeff Smith/California,CN=Users,DC=Fabrikam,DC=com". Você pode
escolher uma opção ADS_ESCAPE_MODE_ENUM para exibir essa cadeia de caracteres
de escape em uma forma legível por humanos: "LDAP://server/CN=Jeff
Smith/California,CN=Users,DC=Fabrikam,DC=com".

Atualmente, a barra (/) é o único caractere especial ADSI. O escape e o desenrolamento


adsi se aplicam somente a caracteres especiais ADSI. A operação não afetará nenhum
caractere especial LDAP, ou seja, eles não são escapados nem sem escape. Para obter
mais informações e uma lista de caracteres especiais definidos pelo LDAP, consulte
Caracteres especiais LDAP.

Para mostrar uma cadeia de caracteres de caminho sem escape, use a interface
IADsPathname e seus métodos. Todas as outras APIs ADSI retornam a cadeia de
caracteres de caminho de escape.

Para obter o comportamento correto, os caracteres especiais LDAP devem ser


escapados antes que os caracteres especiais ADSI sejam escapados. A interface
IADsPathname escapará dos caracteres na sequência correta.

Nota Como o VBScript não pode ler dados de uma biblioteca de tipos, os
aplicativos VBScript (Visual Basic Scripting Edition) não reconhecem simbólicos,
como constantes definidas acima. Em vez disso, use as constantes numéricas para
definir os sinalizadores apropriados em seus aplicativos VBScript. Para usar as
constantes simbólicas, escreva declarações explícitas dessas constantes, conforme
feito aqui.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Enumerações ADSI

ADS_FORMAT_ENUM

IADsPathname

LDAP ADsPath

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


ADS_FLAGTYPE_ENUM enumeração
(iads.h)
Artigo24/08/2023

A enumeração ADS_FLAGTYPE_ENUM especifica valores que podem ser usados para


indicar a presença dos campos ObjectType ou InheritedObjectType na ACE (entrada de
controle de acesso).

Syntax
C++

typedef enum __MIDL___MIDL_itf_ads_0001_0048_0004 {


ADS_FLAG_OBJECT_TYPE_PRESENT = 0x1,
ADS_FLAG_INHERITED_OBJECT_TYPE_PRESENT = 0x2
} ADS_FLAGTYPE_ENUM;

Constantes

ADS_FLAG_OBJECT_TYPE_PRESENT
Valor: 0x1
O campo ObjectType está presente no ACE.

ADS_FLAG_INHERITED_OBJECT_TYPE_PRESENT
Valor: 0x2
O campo InheritedObjectType está presente no ACE.

Comentários
ObjectType indica a qual tipo de objeto, conjunto de propriedades ou propriedade uma
ACE se refere. Ele usa um GUID como seu valor. O GUID referenciado por ObjectType
não está fisicamente presente no ACE, a menos que ADS_FLAGS_OBJECT_TYPE_PRESENT
esteja definido.

InheritedObjectType especifica o GUID de um objeto que herdará o ACE. O GUID não


está fisicamente presente no ACE, a menos que o
ADS_FLAG_INHERITED_OBJECT_TYPE_PRESENT bit esteja definido.
Nota Como o VBScript não pode ler informações de uma biblioteca de tipos, os
aplicativos VBScript não entendem as constantes simbólicas, conforme definido
acima. Em vez disso, você deve usar as constantes numéricas para definir os
sinalizadores apropriados em seus aplicativos VBScript. Se você quiser usar as
constantes simbólicas como uma boa prática de programação, deverá fazer
declarações explícitas dessas constantes, conforme feito aqui, em seus aplicativos
VBScript.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Enumerações ADSI

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


enumeração ADS_FORMAT_ENUM
(iads.h)
Artigo24/08/2023

A enumeração ADS_FORMAT_ENUM especifica os tipos de valor de caminho


disponíveis usados pelo método IADsPathname::Retrieve .

Syntax
C++

typedef enum __MIDL___MIDL_itf_ads_0001_0078_0002 {


ADS_FORMAT_WINDOWS = 1,
ADS_FORMAT_WINDOWS_NO_SERVER = 2,
ADS_FORMAT_WINDOWS_DN = 3,
ADS_FORMAT_WINDOWS_PARENT = 4,
ADS_FORMAT_X500 = 5,
ADS_FORMAT_X500_NO_SERVER = 6,
ADS_FORMAT_X500_DN = 7,
ADS_FORMAT_X500_PARENT = 8,
ADS_FORMAT_SERVER = 9,
ADS_FORMAT_PROVIDER = 10,
ADS_FORMAT_LEAF = 11
} ADS_FORMAT_ENUM;

Constantes

ADS_FORMAT_WINDOWS
Valor: 1
Retorna o caminho completo no formato windows, por exemplo,
"LDAP://servername/o=internet/.../cn=bar".

ADS_FORMAT_WINDOWS_NO_SERVER
Valor: 2
Retorna o formato do Windows sem servidor, por exemplo, "LDAP://o=internet/.../cn=bar".

ADS_FORMAT_WINDOWS_DN
Valor: 3
Retorna o formato windows apenas do nome diferenciado, por exemplo, "o=internet/.../cn=bar".

ADS_FORMAT_WINDOWS_PARENT
Valor: 4
Retorna o formato do Windows somente pai, por exemplo, "o=Internet/...".

ADS_FORMAT_X500
Valor: 5
Retorna o caminho completo no formato X.500, por exemplo,
"LDAP://servername/cn=bar,...,o=internet".

ADS_FORMAT_X500_NO_SERVER
Valor: 6
Retorna o caminho sem servidor no formato X.500, por exemplo, "LDAP://cn=bar,...,o=internet".

ADS_FORMAT_X500_DN
Valor: 7
Retorna apenas o nome diferenciado no formato X.500. Por exemplo, "cn=bar,...,o=internet".

ADS_FORMAT_X500_PARENT
Valor: 8
Retorna apenas o pai no formato X.500, por exemplo, "...,o=Internet".

ADS_FORMAT_SERVER
Valor: 9
Retorna o nome do servidor, por exemplo, "servername".

ADS_FORMAT_PROVIDER
Valor: 10
Retorna o nome do provedor, por exemplo, "LDAP".

ADS_FORMAT_LEAF
Valor: 11
Retorna o nome da folha, por exemplo, "cn=bar".

Comentários
O provedor WinNT não dá suporte a nenhum dos especificadores de formato X.500.

Como o Visual Basic Scripting Edition não pode ler dados de uma biblioteca de tipos, os
aplicativos VBScript não podem reconhecer as constantes simbólicas conforme definido
acima. Em vez disso, você deve usar as constantes numéricas para definir os
sinalizadores apropriados em seus aplicativos VBScript. Para usar as constantes
simbólicas como uma boa prática de programação, escreva declarações explícitas
dessas constantes, como feito aqui.

Requisitos
Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Enumerações ADSI

IADsPathname::Retrieve

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


ADS_GROUP_TYPE_ENUM enumeração
(iads.h)
Artigo24/08/2023

A enumeração ADS_GROUP_TYPE_ENUM especifica o tipo de objetos de grupo no


ADSI.

Syntax
C++

typedef enum __MIDL___MIDL_itf_ads_0001_0023_0001 {


ADS_GROUP_TYPE_GLOBAL_GROUP = 0x2,
ADS_GROUP_TYPE_DOMAIN_LOCAL_GROUP = 0x4,
ADS_GROUP_TYPE_LOCAL_GROUP = 0x4,
ADS_GROUP_TYPE_UNIVERSAL_GROUP = 0x8,
ADS_GROUP_TYPE_SECURITY_ENABLED = 0x80000000
} ADS_GROUP_TYPE_ENUM;

Constantes

ADS_GROUP_TYPE_GLOBAL_GROUP
Valor: 0x2
Especifica um grupo que pode conter contas do mesmo domínio e outros grupos globais do
mesmo domínio. Esse tipo de grupo pode ser exportado para um domínio diferente.

ADS_GROUP_TYPE_DOMAIN_LOCAL_GROUP
Valor: 0x4
Especifica um grupo que pode conter contas de qualquer domínio, outros grupos locais de
domínio do mesmo domínio, grupos globais de qualquer domínio e grupos universais. Esse tipo
de grupo não deve ser incluído em listas de controle de acesso de recursos em outros domínios.

Esse tipo de grupo destina-se ao uso com o provedor LDAP.

ADS_GROUP_TYPE_LOCAL_GROUP
Valor: 0x4
Especifica um grupo idêntico ao grupo ADS_GROUP_TYPE_DOMAIN_LOCAL_GROUP , mas
destina-se ao uso com o provedor WinNT.

ADS_GROUP_TYPE_UNIVERSAL_GROUP
Valor: 0x8
Especifica um grupo que pode conter contas de qualquer domínio, grupos globais de qualquer
domínio e outros grupos universais. Esse tipo de grupo não pode conter grupos locais de
domínio.

ADS_GROUP_TYPE_SECURITY_ENABLED
Valor: 0x80000000
Especifica um grupo habilitado para segurança. Esse grupo pode ser usado para aplicar uma lista
de controle de acesso em um objeto ADSI ou em um sistema de arquivos.

Comentários
Como o VBScript não pode ler dados de uma biblioteca de tipos, os aplicativos VBScript
não entendem as constantes de reconhecimento, conforme definido acima. Em vez
disso, use as constantes numéricas para definir os sinalizadores apropriados em seu
aplicativo VBScript. Para usar as constantes simbólicas como uma boa prática de
programação, escreva declarações explícitas dessas constantes, conforme feito aqui, em
seu aplicativo VBScript.

Exemplos

O exemplo de código a seguir mostra como você pode usar elementos dessa
enumeração.

VB

Dim rootDSE // IADs


Dim dom // IADsContainer
Dim grp // IADs
Public Const ADS_GROUP_TYPE_GLOBAL_GROUP = &H2
Public Const ADS_GROUP_TYPE_DOMAIN_LOCAL_GROUP = &H4
Public Const ADS_GROUP_TYPE_UNIVERSAL_GROUP = &H8
Public Const ADS_GROUP_TYPE_SECURITY_ENABLED = &H80000000

On Error Resume Next

Set rootDSE = GetObject("LDAP://RootDSE")


If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
Exit Sub
End If

Set dom = GetObject("LDAP://" & rootDSE.Get("defaultNamingContext"))


If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
Set rootDSE = Nothing
Exit Sub
End If
Set rootDSE = Nothing

' Creating Secured Global Group.


Set grp = dom.Create("group", "CN=group1")
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
Set dom = Nothing
Exit Sub
End If

grp.Put "samAccountName", "group1"


grp.Put "groupType", ADS_GROUP_TYPE_GLOBAL_GROUP Or
ADS_GROUP_TYPE_SECURITY_ENABLED
grp.SetInfo
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
Set dom = Nothing
Set grp = Nothing
Exit Sub
End If

Set grp = Nothing

' Creating Distribution List Local Group.


Set grp = dom.Create("group", "CN=group2")
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
Set dom = Nothing
Exit Sub
End If

grp.Put "samAccountName", "group2"


grp.Put "groupType", ADS_GROUP_TYPE_DOMAIN_LOCAL_GROUP
grp.SetInfo
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
Set dom = Nothing
Set grp = Nothing
Exit Sub
End If

Set grp = Nothing

' Create Secured Universal Group (ONLY IN NATIVE MODE).


Set grp = dom.Create("group", "CN=group3")
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
Set dom = Nothing
Exit Sub
End If

Set grp = Nothing

grp.Put "samAccountName", "group3"


grp.Put "groupType", ADS_GROUP_TYPE_UNIVERSAL_GROUP Or
ADS_GROUP_TYPE_SECURITY_ENABLED
grp.SetInfo
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If

Set dom = Nothing


Set grp = Nothing

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Enumerações ADSI

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


ADS_NAME_INITTYPE_ENUM
enumeração (iads.h)
Artigo24/08/2023

A enumeração ADS_NAME_INITTYPE_ENUM especifica os tipos de inicialização a serem


executados em um objeto NameTranslate . Ele é usado na interface IADsNameTranslate
.

Syntax
C++

typedef enum __MIDL___MIDL_itf_ads_0001_0050_0002 {


ADS_NAME_INITTYPE_DOMAIN = 1,
ADS_NAME_INITTYPE_SERVER = 2,
ADS_NAME_INITTYPE_GC = 3
} ADS_NAME_INITTYPE_ENUM;

Constantes

ADS_NAME_INITTYPE_DOMAIN
Valor: 1
Inicializa um objeto NameTranslate definindo o domínio ao qual o objeto se associa.

ADS_NAME_INITTYPE_SERVER
Valor: 2
Inicializa um objeto NameTranslate definindo o servidor ao qual o objeto se associa.

ADS_NAME_INITTYPE_GC
Valor: 3
Inicializa um objeto NameTranslate localizando o catálogo global ao qual o objeto se associa.

Comentários
O método IADsNameTranslate::Init ou o método IADsNameTranslate::InitEx usa essas
opções para inicializar o objeto NameTranslate . Quando
ADS_NAME_INITTYPE_SERVER for usado, especifique o nome do computador de um
servidor de diretório. Quando ADS_NAME_INITTYPE_DOMAIN estiver definido, forneça
o nome de domínio em uma floresta de diretório. Quando ADS_NAME_INITTYPE_GC é
emitido, o segundo parâmetro em IADsNameTranslate::Init ou
IADsNameTranslate::InitEx é ignorado. O servidor de Catálogo Global do domínio do
computador atual é usado para executar as operações de conversão de nome. A
inicialização falhará se o computador host não fizer parte de um domínio porque
nenhum catálogo global será encontrado.

Nota Como o VBScript não pode ler dados de uma biblioteca de tipos, os
aplicativos VBScript não reconhecem as constantes simbólicas, conforme definido
acima. Em vez disso, use as constantes numéricas para definir os sinalizadores
apropriados em seus aplicativos VBScript. Para usar constantes simbólicas como
uma boa prática de programação, escreva declarações explícitas dessas constantes,
conforme feito aqui, em seus aplicativos VBScript.

Exemplos
O exemplo de código C/C++ a seguir usa o método IADsNameTranslate::Init para
inicializar um objeto NameTranslate por meio do catálogo global, supondo que o
cliente que executa o aplicativo esteja dentro da floresta de diretórios. Em seguida, ele
renderiza o nome diferenciado de um objeto de usuário no formato windows.

C++

IADsNameTranslate *pNto = NULL;


HRESULT hr = S_OK;
CComBSTR sbstr;

hr = CoCreateInstance(CLSID_NameTranslate,
NULL,
CLSCTX_INPROC_SERVER,
IID_IADsNameTranslate,
(void**)&pNto);
if(FAILED(hr)) { exit 1;}

hr = pNto->Init(ADS_NAME_INITTYPE_GC, CComBSTR(""));
if (FAILED(hr))
{
goto cleanup;
}

hr =pNto->Set(ADS_NAME_TYPE_1779,
CComBSTR(L"cn=jeffsmith,cn=users,dc=Fabrikam,dc=com"));
if(FAILED(hr))
{
goto cleanup;
}

hr = pNto->Get(ADS_NAME_TYPE_NT4, &sbstr);
printf("Name in the translated format: %S\n", sbstr);

cleanup:
if(pNto)
{
pNto->Release();
}

O exemplo de código do Visual Basic a seguir usa o método IADsNameTranslate::Init


para inicializar um objeto NameTranslate por meio do catálogo global, supondo que o
cliente que executa o aplicativo esteja dentro da floresta de diretórios. Em seguida, ele
renderiza o nome diferenciado de um objeto de usuário no formato windows.

VB

Dim nto as New NameTranslate


dso="CN=jeffsmith, CN=users, DC=Fabrikam dc=COM"

nto.Init ADS_NAME_INITTYPE_GC, ""


nto.Set ADS_NAME_TYPE_1779, dso
trans = nto.Get(ADS_NAME_TYPE_NT4)
MsgBox "Translated name = " & trans

O exemplo de código VBScript/ASP a seguir usa o método IADsNameTranslate::Init para


inicializar um objeto NameTranslate por meio do catálogo global, supondo que o
cliente que executa o aplicativo esteja dentro da floresta de diretórios. Em seguida, ele
renderiza o nome diferenciado de um objeto de usuário no formato windows.

VB

<%@ Language=VBScript %>


<html>
<body>
<%
Dim nto
const ADS_NAME_INITTYPE_GC = 3 ' VBScript cannot read.
const ADS_NAME_TYPE_1779 = 1 ' Enumeration definition.
const ADS_NAME_TYPE_NT4 = 3

dn = "CN=jeff smith,CN=Users,DC=Fabrikam,DC=COM"

Set nto = Server.CreateObject("NameTranslate")


nto.Init ADS_NAME_INITTYPE_GC, ""
nto.Set ADS_NAME_TYPE_1779, dn
result = nto.Get(ADS_NAME_TYPE_NT4)

Response.Write "<p>Name in the translated format: " & result


%>
</body>
</html>

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Enumerações ADSI

IADsNameTranslate

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


ADS_NAME_TYPE_ENUM enumeração
(iads.h)
Artigo24/08/2023

A enumeração ADS_NAME_TYPE_ENUM especifica os formatos usados para


representar nomes diferenciados. Ele é usado pela interface IADsNameTranslate para
converter o formato de um nome diferenciado.

Syntax
C++

typedef enum __MIDL___MIDL_itf_ads_0001_0050_0001 {


ADS_NAME_TYPE_1779 = 1,
ADS_NAME_TYPE_CANONICAL = 2,
ADS_NAME_TYPE_NT4 = 3,
ADS_NAME_TYPE_DISPLAY = 4,
ADS_NAME_TYPE_DOMAIN_SIMPLE = 5,
ADS_NAME_TYPE_ENTERPRISE_SIMPLE = 6,
ADS_NAME_TYPE_GUID = 7,
ADS_NAME_TYPE_UNKNOWN = 8,
ADS_NAME_TYPE_USER_PRINCIPAL_NAME = 9,
ADS_NAME_TYPE_CANONICAL_EX = 10,
ADS_NAME_TYPE_SERVICE_PRINCIPAL_NAME = 11,
ADS_NAME_TYPE_SID_OR_SID_HISTORY_NAME = 12
} ADS_NAME_TYPE_ENUM;

Constantes

ADS_NAME_TYPE_1779
Valor: 1
Formato de nome conforme especificado no RFC 1779. Por exemplo, "CN=Jeff
Smith,CN=users,DC=Fabrikam,DC=com".

ADS_NAME_TYPE_CANONICAL
Valor: 2
Formato de nome canônico. Por exemplo, "Fabrikam.com/Users/Jeff Smith".

ADS_NAME_TYPE_NT4
Valor: 3
Formato de nome da conta usado no Windows. Por exemplo, "Fabrikam\JeffSmith".
ADS_NAME_TYPE_DISPLAY
Valor: 4
Formato de nome de exibição. Por exemplo, "Jeff Smith".

ADS_NAME_TYPE_DOMAIN_SIMPLE
Valor: 5
Formato de nome de domínio simples. Por exemplo, "JeffSmith@Fabrikam.com".

ADS_NAME_TYPE_ENTERPRISE_SIMPLE
Valor: 6
Formato de nome empresarial simples. Por exemplo, "JeffSmith@Fabrikam.com".

ADS_NAME_TYPE_GUID
Valor: 7
Formato de Identificador Exclusivo Global. Por exemplo, "{95ee9fff-3436-11d1-b2b0-
d15ae3ac8436}".

ADS_NAME_TYPE_UNKNOWN
Valor: 8
Tipo de nome desconhecido. O sistema estimará o formato. Esse elemento é uma opção
significativa apenas com o método IADsNameTranslate.Set ou IADsNameTranslate.SetEx , mas não
com o método IADsNameTranslate.Get ou IADsNameTranslate.GetEx .

ADS_NAME_TYPE_USER_PRINCIPAL_NAME
Valor: 9
Formato de nome principal do usuário. Por exemplo, "JeffSmith@Fabrikam.com".

ADS_NAME_TYPE_CANONICAL_EX
Valor: 10
Formato de nome canônico estendido. Por exemplo, "Fabrikam.com/Users Jeff Smith".

ADS_NAME_TYPE_SERVICE_PRINCIPAL_NAME
Valor: 11
Formato de nome da entidade de serviço. Por exemplo,
"www/www.fabrikam.com@fabrikam.com".

ADS_NAME_TYPE_SID_OR_SID_HISTORY_NAME
Valor: 12
Uma cadeia de caracteres SID, conforme definido na SDDL (Linguagem de Definição do Descritor
de Segurança), para o SID do objeto atual ou um do histórico de SID do objeto. Por exemplo,
"O:AOG:DAD:(A;; RPWPCCDCLCSWRCWDWOGA;;; S-1-0-0)" Para obter mais informações, consulte
Formato de cadeia de caracteres do descritor de segurança.

Comentários
Exemplos de código escritos em C++, Visual Basic e VBS/ASP podem ser encontrados
nas discussões da interface IADsNameTranslate .

Como o VBScript não pode ler dados de uma biblioteca de tipos, um aplicativo deve
usar as constantes numéricas apropriadas, em vez das constantes simbólicas, para
definir os sinalizadores apropriados. Para usar as constantes simbólicas como uma boa
prática de programação, escreva declarações explícitas dessas constantes, como feito
aqui, em aplicativos VBScript.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Enumerações ADSI

IADsNameTranslate

IADsNameTranslate.Get

IADsNameTranslate.GetEx

IADsNameTranslate.Set

IADsNameTranslate.SetEx

Formato de cadeia de caracteres do descritor de segurança

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


ADS_OPTION_ENUM enumeração
(iads.h)
Artigo24/08/2023

O tipo de enumeração ADS_OPTION_ENUM contém valores que indicam as opções que


podem ser recuperadas ou definidas com os métodos IADsObjectOptions.GetOption e
IADsObjectOptions.SetOption .

Syntax
C++

typedef enum __MIDL___MIDL_itf_ads_0001_0077_0001 {


ADS_OPTION_SERVERNAME = 0,
ADS_OPTION_REFERRALS,
ADS_OPTION_PAGE_SIZE,
ADS_OPTION_SECURITY_MASK,
ADS_OPTION_MUTUAL_AUTH_STATUS,
ADS_OPTION_QUOTA,
ADS_OPTION_PASSWORD_PORTNUMBER,
ADS_OPTION_PASSWORD_METHOD,
ADS_OPTION_ACCUMULATIVE_MODIFICATION,
ADS_OPTION_SKIP_SID_LOOKUP
} ADS_OPTION_ENUM;

Constantes

ADS_OPTION_SERVERNAME
Valor: 0
Obtém um VT_BSTR que contém o nome do host do servidor para a associação atual
para este objeto . Não há suporte para essa opção no
Método IADsObjectOptions.SetOption .

ADS_OPTION_REFERRALS
Obtém ou define um valor VT_I4 que indica como a busca de referência é executada em um
do Banco de Dados Elástico. Essa opção pode conter um dos
valores definidos pelo ADS_CHASE_REFERRALS_ENUM
Enumeração.

ADS_OPTION_PAGE_SIZE
Obtém ou define um valor VT_I4 que indica o tamanho da página em uma pesquisa paginada.
ADS_OPTION_SECURITY_MASK
Obtém ou define um valor VT_I4 que controla os dados do descritor de segurança que podem ser
leia sobre o objeto . Essa opção pode conter qualquer combinação dos valores definidos no
ADS_SECURITY_INFO_ENUM enumeração.

ADS_OPTION_MUTUAL_AUTH_STATUS
Obtém um valor VT_I4 que determina se a autenticação mútua é executada pelo
Camada SSPI. Se o valor da opção retornada contiver o sinalizador ISC_RET_MUTUAL_AUTH ,
definido em Sspi.h e, em seguida, a autenticação mútua foi executada. Se o valor da opção
retornado não contiver
o sinalizador ISC_RET_MUTUAL_AUTH e, em seguida, a autenticação mútua não foi executada.
For (para)
para obter mais informações sobre autenticação mútua, consulte SSPI. Esse
não há suporte para a opção
Método IADsObjectOptions.SetOption .

ADS_OPTION_QUOTA
Permite que a cota efetiva e a cota usada de uma entidade de segurança sejam lidas. Essa opção
usa um
VT_BSTR valor que contém a entidade de segurança para a qual as cotas podem ser lidas.
Se a cadeia de caracteres da entidade de segurança tiver comprimento zero ou o valor for um
valor VT_EMPTY ,
a entidade de segurança é o usuário conectado no momento. Essa opção só tem suporte do
Método IADsObjectOptions.SetOption .

ADS_OPTION_PASSWORD_PORTNUMBER
Recupera ou define um valor VT_I4 que contém o número da porta que ADSI usa para
estabelecer uma conexão quando a senha for definida ou alterada. Por padrão, o ADSI usa a porta
636 para estabelecer um
para definir ou alterar a senha.

ADS_OPTION_PASSWORD_METHOD
Recupera ou define um valor VT_I4 que especifica o método de codificação de senha.
Essa opção pode conter um dos valores definidos no
ADS_PASSWORD_ENCODING_ENUM
Enumeração.

ADS_OPTION_ACCUMULATIVE_MODIFICATION
Contém um valor VT_BOOL que especifica se operações de alteração de valor de atributo
deve ser acumulado. Por padrão, quando um valor de atributo é modificado mais de uma vez, o
valor anterior
A operação de alteração é substituída pela operação mais recente. Se essa opção estiver definida
como
VARIANT_TRUE, cada operação de alteração de valor de atributo é acumulada no cache.
Quando as atualizações de valor de atributo são confirmadas no servidor com o
Método IADs.SetInfo , cada indivíduo acumulado
A operação é enviada para o servidor.
Quando essa opção tiver sido definida como VARIANT_TRUE, ela não poderá ser redefinida para
VARIANT_FALSE durante o tempo de vida do objeto ADSI. Para redefinir essa opção, todos
as referências ao objeto ADSI devem ser liberadas e o objeto deve ser associado novamente.
Quando o objeto está associado
para novamente, essa opção será definida como VARIANT_FALSE por padrão.

Essa opção afeta apenas os valores de atributo modificados com o


IADs.PutEx e
IADsPropertyList.PutPropertyItem
Métodos. Essa opção é ignorada pelo método IADs.Put .

ADS_OPTION_SKIP_SID_LOOKUP
Se essa opção estiver definida no objeto , nenhuma pesquisa será executada (durante a
recuperação ou durante
modificação). Essa opção afeta as IADs e
Interfaces IADsPropertyList . Também é aplicável
ao recuperar o uso efetivo da cota de um usuário específico.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Enumerações ADSI

ADS_PASSWORD_ENCODING_ENUM

ADS_SECURITY_INFO_ENUM

IADs.Put

IADs.PutEx

IADs.SetInfo

IADsObjectOptions

IADsObjectOptions.GetOption
IADsObjectOptions.SetOption

IADsPropertyList.PutPropertyItem

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


ADS_PASSWORD_ENCODING_ENUM
enumeração (iads.h)
Artigo24/08/2023

A enumeração ADS_PASSWORD_ENCODING_ENUM identifica o tipo de codificação de


senha usada com a opção ADS_OPTION_PASSWORD_METHOD nos métodos
IADsObjectOptions::GetOption e IADsObjectOptions::SetOption .

Syntax
C++

typedef enum __MIDL___MIDL_itf_ads_0000_0000_0026 {


ADS_PASSWORD_ENCODE_REQUIRE_SSL = 0,
ADS_PASSWORD_ENCODE_CLEAR = 1
} ADS_PASSWORD_ENCODING_ENUM;

Constantes

ADS_PASSWORD_ENCODE_REQUIRE_SSL
Valor: 0
As senhas são codificadas usando SSL.

ADS_PASSWORD_ENCODE_CLEAR
Valor: 1
As senhas não são codificadas e são transmitidas em texto não criptografado.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
ADS_OPTION_ENUM

IADsObjectOptions::GetOption

IADsObjectOptions::SetOption

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


ADS_PATHTYPE_ENUM enumeração
(iads.h)
Artigo24/08/2023

A enumeração ADS_PATHTYPE_ENUM especifica o tipo de objeto no qual a interface


IADsSecurityUtility adicionará ou modificará um descritor de segurança.

Syntax
C++

typedef enum __MIDL___MIDL_itf_ads_0001_0088_0001 {


ADS_PATH_FILE = 1,
ADS_PATH_FILESHARE = 2,
ADS_PATH_REGISTRY = 3
} ADS_PATHTYPE_ENUM;

Constantes

ADS_PATH_FILE
Valor: 1
Indica que o descritor de segurança será recuperado ou definido em um objeto de arquivo.

ADS_PATH_FILESHARE
Valor: 2
Indica que o descritor de segurança será recuperado ou definido em um objeto de
compartilhamento de arquivos.

ADS_PATH_REGISTRY
Valor: 3
Indica que o descritor de segurança será recuperado ou definido em um objeto de chave do
Registro.

Requisitos

Cliente mínimo com suporte Windows Vista


Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Enumerações ADSI

ADS_SD_FORMAT_ENUM

IADsSecurityUtility

Descritores de segurança em arquivos e chaves do Registro

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


ADS_PREFERENCES_ENUM enumeração
(iads.h)
Artigo24/08/2023

A enumeração ADS_PREFERENCES_ENUM especifica as preferências de consulta do


provedor OLE DB para ADSI.

Syntax
C++

typedef enum __MIDL___MIDL_itf_ads_0000_0000_0022 {


ADSIPROP_ASYNCHRONOUS = 0,
ADSIPROP_DEREF_ALIASES = 0x1,
ADSIPROP_SIZE_LIMIT = 0x2,
ADSIPROP_TIME_LIMIT = 0x3,
ADSIPROP_ATTRIBTYPES_ONLY = 0x4,
ADSIPROP_SEARCH_SCOPE = 0x5,
ADSIPROP_TIMEOUT = 0x6,
ADSIPROP_PAGESIZE = 0x7,
ADSIPROP_PAGED_TIME_LIMIT = 0x8,
ADSIPROP_CHASE_REFERRALS = 0x9,
ADSIPROP_SORT_ON = 0xa,
ADSIPROP_CACHE_RESULTS = 0xb,
ADSIPROP_ADSIFLAG = 0xc
} ADS_PREFERENCES_ENUM;

Constantes

ADSIPROP_ASYNCHRONOUS
Valor: 0
Solicita uma pesquisa assíncrona.

ADSIPROP_DEREF_ALIASES
Valor: 0x1
Especifica que os aliases de objetos encontrados devem ser resolvidos. Use ADS_DEREFENUM
para especificar como executar essa operação.

ADSIPROP_SIZE_LIMIT
Valor: 0x2
Especifica o limite de tamanho que o servidor deve observar em uma pesquisa. O limite de
tamanho é o número máximo de objetos retornados. Um valor zero indica que nenhum limite de
tamanho é imposto. O servidor para de pesquisar quando o limite de tamanho é atingido e
retorna os resultados acumulados até esse ponto.

ADSIPROP_TIME_LIMIT
Valor: 0x3
Especifica o limite de tempo, em segundos, que o servidor deve observar em uma pesquisa. Um
valor zero indica que nenhuma restrição de limite de tempo é imposta. Quando o limite de tempo
é atingido, o servidor para de pesquisar e retorna os resultados acumulados para esse ponto.

ADSIPROP_ATTRIBTYPES_ONLY
Valor: 0x4
Indica que a pesquisa deve obter apenas o nome dos atributos aos quais os valores foram
atribuídos.

ADSIPROP_SEARCH_SCOPE
Valor: 0x5
Especifica o escopo de pesquisa que deve ser observado pelo servidor. Para obter mais
informações sobre as configurações apropriadas, consulte a enumeração ADS_SCOPEENUM .

ADSIPROP_TIMEOUT
Valor: 0x6
Especifica o limite de tempo, em segundos, que um cliente aguardará o servidor retornar o
resultado.

ADSIPROP_PAGESIZE
Valor: 0x7
Especifica o tamanho da página em uma pesquisa paginada. Para cada solicitação do cliente, o
servidor retorna, no máximo, o número de objetos conforme definido pelo tamanho da página.

ADSIPROP_PAGED_TIME_LIMIT
Valor: 0x8
Especifica o limite de tempo, em segundos, que o servidor deve observar para pesquisar uma
página de resultados; isso se opõe ao limite de tempo para toda a pesquisa.

ADSIPROP_CHASE_REFERRALS
Valor: 0x9
Especifica que as indicações podem ser perseguidas. Se a pesquisa raiz não for especificada no
contexto de nomenclatura do servidor ou quando os resultados da pesquisa cruzarem um
contexto de nomenclatura (por exemplo, quando você tiver domínios filho e pesquisar no
domínio pai), o servidor enviará uma mensagem de indicação para o cliente que o cliente pode
optar por ignorar ou perseguir. Por padrão, essa opção é definida como
ADS_CHASE_REFERRALS_EXTERNAL. Para obter mais informações sobre a busca de indicações,
consulte ADS_CHASE_REFERRALS_ENUM.

ADSIPROP_SORT_ON
Valor: 0xa
Especifica que o servidor classifica o conjunto de resultados. Use a estrutura ADS_SORTKEY para
especificar as chaves de classificação.
ADSIPROP_CACHE_RESULTS
Valor: 0xb
Especifica se o resultado deve ser armazenado em cache no lado do cliente. Por padrão, ADSI
armazena em cache o conjunto de resultados. Desativar essa opção pode ser mais desejável para
conjuntos de resultados grandes.

ADSIPROP_ADSIFLAG
Valor: 0xc
Permite que o cliente OLEDB especifique sinalizadores de associação a serem usados ao associar
ao servidor. Os valores válidos são aqueles permitidos pelo ADsOpenObject. Ele é acessado a
partir de scripts do ADO usando o nome da propriedade "Sinalizador ADSI".

Comentários
Como o VBScript não pode ler dados de uma biblioteca de tipos, os aplicativos VBScript
não reconhecem as constantes simbólicas conforme definido acima. Em vez disso, use
as constantes numéricas para definir os sinalizadores apropriados em seu aplicativo
VBScript. Para usar as constantes simbólicas, como uma boa prática de programação,
escreva declarações explícitas dessas constantes, conforme feito aqui, em seu aplicativo
VBScript.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Enumerações ADSI

ADS_CHASE_REFERRALS_ENUM

ADS_DEREFENUM

ADS_SCOPEENUM

ADS_SORTKEY
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


ADS_PROPERTY_OPERATION_ENUM
enumeração (iads.h)
Artigo24/08/2023

A enumeração ADS_PROPERTY_OPERATION_ENUM especifica maneiras de atualizar


uma propriedade nomeada no cache.

Syntax
C++

typedef enum __MIDL___MIDL_itf_ads_0000_0000_0027 {


ADS_PROPERTY_CLEAR = 1,
ADS_PROPERTY_UPDATE = 2,
ADS_PROPERTY_APPEND = 3,
ADS_PROPERTY_DELETE = 4
} ADS_PROPERTY_OPERATION_ENUM;

Constantes

ADS_PROPERTY_CLEAR
Valor: 1
Instrui o serviço de diretório a remover todos os valores de propriedade do objeto .

ADS_PROPERTY_UPDATE
Valor: 2
Instrui o serviço de diretório a substituir os valores atuais pelos valores especificados.

ADS_PROPERTY_APPEND
Valor: 3
Instrui o serviço de diretório a acrescentar os valores especificados aos valores existentes.

Quando a operação ADS_PROPERTY_APPEND é especificada, os novos valores de atributo são


confirmados automaticamente no serviço de diretório e removidos do cache local. Isso força o
cache local a ser atualizado do serviço de diretório na próxima vez que os valores de atributo
forem recuperados.

ADS_PROPERTY_DELETE
Valor: 4
Instrui o serviço de diretório a excluir os valores especificados do objeto .
Comentários
Os elementos dessa enumeração são usados com o método IADs.PutEx , cujo
documento fornece um exemplo de como usar essas constantes enumeradas.

Como o Visual Basic Scripting Edition (VBScript) não pode ler dados de uma biblioteca
de tipos, os aplicativos VBScript não reconhecem as constantes simbólicas conforme
definido. Em vez disso, use as constantes numéricas para definir os sinalizadores
apropriados em seus aplicativos VBScript. Para usar as constantes simbólicas como uma
boa prática de programação, escreva declarações explícitas dessas constantes, conforme
feito aqui.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Enumerações ADSI

IADs.PutEx

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


ADS_RIGHTS_ENUM enumeração
(iads.h)
Artigo24/08/2023

A enumeração ADS_RIGHTS_ENUM especifica os direitos de acesso atribuídos a um


objeto do Active Directory. A propriedade IADsAccessControlEntry.AccessMask contém
uma combinação desses valores para um objeto do Active Directory.

Para obter mais informações e uma lista de possíveis valores corretos de acesso para
objetos de compartilhamento de arquivo ou arquivo, consulte Segurança de Arquivos e
Direitos de Acesso.

Para obter mais informações e uma lista de possíveis valores corretos de acesso para
objetos do Registro, consulte Segurança de Chave do Registro e Direitos de Acesso.

Syntax
C++

typedef enum __MIDL___MIDL_itf_ads_0001_0048_0001 {


ADS_RIGHT_DELETE = 0x10000,
ADS_RIGHT_READ_CONTROL = 0x20000,
ADS_RIGHT_WRITE_DAC = 0x40000,
ADS_RIGHT_WRITE_OWNER = 0x80000,
ADS_RIGHT_SYNCHRONIZE = 0x100000,
ADS_RIGHT_ACCESS_SYSTEM_SECURITY = 0x1000000,
ADS_RIGHT_GENERIC_READ = 0x80000000,
ADS_RIGHT_GENERIC_WRITE = 0x40000000,
ADS_RIGHT_GENERIC_EXECUTE = 0x20000000,
ADS_RIGHT_GENERIC_ALL = 0x10000000,
ADS_RIGHT_DS_CREATE_CHILD = 0x1,
ADS_RIGHT_DS_DELETE_CHILD = 0x2,
ADS_RIGHT_ACTRL_DS_LIST = 0x4,
ADS_RIGHT_DS_SELF = 0x8,
ADS_RIGHT_DS_READ_PROP = 0x10,
ADS_RIGHT_DS_WRITE_PROP = 0x20,
ADS_RIGHT_DS_DELETE_TREE = 0x40,
ADS_RIGHT_DS_LIST_OBJECT = 0x80,
ADS_RIGHT_DS_CONTROL_ACCESS = 0x100
} ADS_RIGHTS_ENUM;

Constantes
ADS_RIGHT_DELETE
Valor: 0x10000
O direito de excluir o objeto.

ADS_RIGHT_READ_CONTROL
Valor: 0x20000
O direito de ler dados do descritor de segurança do objeto, sem incluir os dados na SACL.

ADS_RIGHT_WRITE_DAC
Valor: 0x40000
O direito de modificar a DACL (lista de controle de acesso discricionário) no descritor de
segurança do objeto.

ADS_RIGHT_WRITE_OWNER
Valor: 0x80000
O direito de assumir a propriedade do objeto. O usuário deve ser um objeto de confiança do
objeto. O usuário não pode transferir a propriedade para outros usuários.

ADS_RIGHT_SYNCHRONIZE
Valor: 0x100000
O direito de usar o objeto para sincronização. Isso permite que um thread aguarde até que o
objeto esteja no estado sinalizado.

ADS_RIGHT_ACCESS_SYSTEM_SECURITY
Valor: 0x1000000
O direito de modificar e definir a SACL no descritor de segurança do objeto.

ADS_RIGHT_GENERIC_READ
Valor: 0x80000000
O direito de ler permissões nesse objeto, ler todas as propriedades nesse objeto, lista este nome
de objeto quando o contêiner pai é listado e o conteúdo deste objeto se ele é um contêiner.

ADS_RIGHT_GENERIC_WRITE
Valor: 0x40000000
O direito de ler permissões nesse objeto, gravar todas as propriedades nesse objeto e executar
todas as gravações validadas para esse objeto.

ADS_RIGHT_GENERIC_EXECUTE
Valor: 0x20000000
O direito de permissões de leitura e listar o conteúdo de um objeto de contêiner.

ADS_RIGHT_GENERIC_ALL
Valor: 0x10000000
O direito de criar ou excluir objetos filho, excluir uma subárvore, ler e gravar propriedades,
examinar objetos filho e o próprio objeto, adicionar e remover o objeto do diretório e ler ou
gravar com um direito estendido.

ADS_RIGHT_DS_CREATE_CHILD
Valor: 0x1
O direito de criar objetos filho do objeto . O membro ObjectType de uma ACE pode conter um
GUID que identifica o tipo de objeto filho cuja criação é controlada. Se ObjectType não contiver
um GUID, a ACE controlará a criação de todos os tipos de objeto filho.

ADS_RIGHT_DS_DELETE_CHILD
Valor: 0x2
O direito de excluir objetos filho do objeto . O membro ObjectType de uma ACE pode conter um
GUID que identifica um tipo de objeto filho cuja exclusão é controlada. Se ObjectType não
contiver um GUID, a ACE controlará a exclusão de todos os tipos de objeto filho.

ADS_RIGHT_ACTRL_DS_LIST
Valor: 0x4
O direito de listar objetos filho desse objeto. Para obter mais informações sobre esse direito,
consulte Controlando a visibilidade do objeto.

ADS_RIGHT_DS_SELF
Valor: 0x8
O direito de executar uma operação controlada por um direito de acesso de gravação validado. O
membro ObjectType de uma ACE pode conter um GUID que identifica a gravação validada. Se
ObjectType não contiver um GUID, o ACE controlará os direitos para executar todas as operações
de gravação válidas associadas ao objeto.

ADS_RIGHT_DS_READ_PROP
Valor: 0x10
O direito de ler as propriedades do objeto. O membro ObjectType de uma ACE pode conter um
GUID que identifica um conjunto de propriedades ou uma propriedade. Se ObjectType não
contiver um GUID, o ACE controlará o direito de ler todas as propriedades do objeto.

ADS_RIGHT_DS_WRITE_PROP
Valor: 0x20
O direito de gravar as propriedades do objeto. O membro ObjectType de uma ACE pode conter
um GUID que identifica um conjunto de propriedades ou uma propriedade. Se ObjectType não
contiver um GUID, a ACE controlará o direito de gravar todas as propriedades do objeto.

ADS_RIGHT_DS_DELETE_TREE
Valor: 0x40
O direito de excluir todos os objetos filho desse objeto, independentemente das permissões dos
objetos filho.

ADS_RIGHT_DS_LIST_OBJECT
Valor: 0x80
O direito de listar um determinado objeto. Se o usuário não receber esse direito e o usuário não
tiver ADS_RIGHT_ACTRL_DS_LIST definido no pai do objeto, o objeto ficará oculto do usuário.
Esse direito será ignorado se o terceiro caractere da propriedade dSHeuristics for '0' ou não
definido. Para obter mais informações, consulte Controlando a visibilidade do objeto.

ADS_RIGHT_DS_CONTROL_ACCESS
Valor: 0x100
O direito de executar uma operação controlada por um direito de acesso estendido. O membro
ObjectType de uma ACE pode conter um GUID que identifica o direito estendido. Se ObjectType
não contiver um GUID, o ACE controlará o direito de executar todas as operações corretas
estendidas associadas ao objeto.

Comentários
Para atribuir direitos de acesso a um objeto, defina o campo AccessMask de uma ACE
(entrada de controle de acesso) como uma combinação das constantes definidas nesta
enumeração. Além do campo AccessMask , uma ACE pode ter outros campos, incluindo
ACEType, ACEFlags, ObjectType, InheritedObjectType, Flags e Trustee. A interface
IADsAccessControlEntry fornece métodos de propriedade para obter e modificar esses
campos.

O campo ObjectType especifica um GUID que identifica o conjunto de propriedades, a


propriedade, a direita estendida ou o tipo de objeto filho ao qual a ACE se aplica. O
campo InheritedObjectType especifica um GUID que identifica o tipo de objeto filho
que pode herdar o ACE. O campo Administrador identifica a entidade de segurança à
qual a ACE permite ou nega os direitos de acesso especificados.

Para obter mais informações sobre ACEType, ACEFlags e Flags, consulte


ADS_ACETYPE_ENUM, ADS_ACEFLAG_ENUM.

Nota Como o VBScript não pode ler dados de uma biblioteca de tipos, os
aplicativos VBScript não reconhecem as constantes simbólicas, conforme definido
acima. Em vez disso, use as constantes numéricas para definir os sinalizadores
apropriados em seu aplicativo VBScript. Para usar as constantes simbólicas como
uma boa prática de programação, escreva declarações explícitas dessas constantes,
conforme feito aqui, em seus aplicativos VBScript.

Os direitos de acesso específicos concedidos pelas quatro enumerações de direitos


genéricos (ADS_RIGHT_GENERIC_xxx) dependem do provedor de serviços ADSI
específico que está sendo acessado. Para o Active Directory, esses direitos genéricos são
definidos no arquivo de cabeçalho Ntdsapi.h como DS_GENERIC_READ,
DS_GENERIC_WRITE, DS_GENERIC_EXECUTE e DS_GENERIC_ALL. Para obter mais
informações sobre como usar o Direito de Acesso e as Máscaras de Acesso, consulte
Controle de Acesso.

Requisitos
Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Enumerações ADSI

ADS_ACETYPE_ENUM

Controle de acesso

Direitos de acesso e máscaras de acesso

Direitos de Acesso dos Serviços de Diretório

IADsAccessControlEntry

IADsAccessControlEntry.AccessMask

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


ADS_SCOPEENUM enumeração (iads.h)
Artigo24/08/2023

A enumeração ADS_SCOPEENUM especifica o escopo de uma pesquisa de diretório.

Syntax
C++

typedef enum __MIDL___MIDL_itf_ads_0000_0000_0021 {


ADS_SCOPE_BASE = 0,
ADS_SCOPE_ONELEVEL = 1,
ADS_SCOPE_SUBTREE = 2
} ADS_SCOPEENUM;

Constantes

ADS_SCOPE_BASE
Valor: 0
Limita a pesquisa ao objeto base. O resultado contém, no máximo, um objeto .

ADS_SCOPE_ONELEVEL
Valor: 1
Pesquisa um nível dos filhos imediatos, excluindo o objeto base.

ADS_SCOPE_SUBTREE
Valor: 2
Pesquisa toda a subárvore, incluindo todos os filhos e o próprio objeto base.

Comentários
Se você não definir explicitamente o escopo de pesquisa, o padrão será
ADS_SCOPE_SUBTREE.

Como o VBScript não pode ler dados de uma biblioteca de tipos, os aplicativos VBScript
não reconhecem as constantes simbólicas, conforme definido acima. Em vez disso, use
as constantes numéricas para definir os sinalizadores apropriados em seus aplicativos
VBScript. Para usar as constantes simbólicas como uma boa prática de programação,
crie declarações explícitas dessas constantes, conforme feito aqui, em seus aplicativos
VBScript.
Exemplos
O escopo de pesquisa é uma das preferências de pesquisa que os clientes podem
especificar. O exemplo de código a seguir mostra como fazer isso usando a estrutura
ADS_SEARCHPREF_INFO , juntamente com os elementos definidos no
ADS_SEARCHPREF_ENUM e essa enumeração.

C++

ADS_SEARCHPREF_INFO prefInfo;
prefInfo.dwSearchPref = ADS_SEARCHPREF_SEARCH_SCOPE;
prefInfo.vValue.dwType = ADSTYPE_INTEGER;
prefInfo.vValue.Integer = ADS_SCOPE_SUBTREE;

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Enumerações ADSI

ADS_SEARCHPREF_ENUM

ADS_SEARCHPREF_INFO

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


ADS_SD_CONTROL_ENUM enumeração
(iads.h)
Artigo24/08/2023

A enumeração ADS_SD_CONTROL_ENUM especifica sinalizadores de controle para um


descritor de segurança.

Syntax
C++

typedef enum __MIDL___MIDL_itf_ads_0001_0048_0005 {


ADS_SD_CONTROL_SE_OWNER_DEFAULTED = 0x1,
ADS_SD_CONTROL_SE_GROUP_DEFAULTED = 0x2,
ADS_SD_CONTROL_SE_DACL_PRESENT = 0x4,
ADS_SD_CONTROL_SE_DACL_DEFAULTED = 0x8,
ADS_SD_CONTROL_SE_SACL_PRESENT = 0x10,
ADS_SD_CONTROL_SE_SACL_DEFAULTED = 0x20,
ADS_SD_CONTROL_SE_DACL_AUTO_INHERIT_REQ = 0x100,
ADS_SD_CONTROL_SE_SACL_AUTO_INHERIT_REQ = 0x200,
ADS_SD_CONTROL_SE_DACL_AUTO_INHERITED = 0x400,
ADS_SD_CONTROL_SE_SACL_AUTO_INHERITED = 0x800,
ADS_SD_CONTROL_SE_DACL_PROTECTED = 0x1000,
ADS_SD_CONTROL_SE_SACL_PROTECTED = 0x2000,
ADS_SD_CONTROL_SE_SELF_RELATIVE = 0x8000
} ADS_SD_CONTROL_ENUM;

Constantes

ADS_SD_CONTROL_SE_OWNER_DEFAULTED
Valor: 0x1
Um mecanismo padrão fornece o SID (identificador de segurança) do proprietário do descritor de
segurança em vez do provedor original do descritor de segurança.

ADS_SD_CONTROL_SE_GROUP_DEFAULTED
Valor: 0x2
Um mecanismo padrão fornece o SID do grupo do descritor de segurança em vez do provedor
original do descritor de segurança.

ADS_SD_CONTROL_SE_DACL_PRESENT
Valor: 0x4
A DACL (lista de controle de acesso discricionário) está presente no descritor de segurança. Se
esse sinalizador não estiver definido ou se esse sinalizador estiver definido e a DACL for NULL, o
descritor de segurança permitirá acesso completo a todos.

ADS_SD_CONTROL_SE_DACL_DEFAULTED
Valor: 0x8
O descritor de segurança usa uma DACL padrão criada com base no token de acesso do criador.

ADS_SD_CONTROL_SE_SACL_PRESENT
Valor: 0x10
A SACL (lista de controle de acesso do sistema) está presente no descritor de segurança.

ADS_SD_CONTROL_SE_SACL_DEFAULTED
Valor: 0x20
O descritor de segurança usa uma SACL padrão criada com base no token de acesso do criador.

ADS_SD_CONTROL_SE_DACL_AUTO_INHERIT_REQ
Valor: 0x100
A DACL do descritor de segurança deve ser herdada.

ADS_SD_CONTROL_SE_SACL_AUTO_INHERIT_REQ
Valor: 0x200
A SACL do descritor de segurança deve ser herdada.

ADS_SD_CONTROL_SE_DACL_AUTO_INHERITED
Valor: 0x400
A DACL do descritor de segurança dá suporte à propagação automática de ACEs (entradas de
controle de acesso) herdáveis para objetos filho existentes.

ADS_SD_CONTROL_SE_SACL_AUTO_INHERITED
Valor: 0x800
A SACL do descritor de segurança dá suporte à propagação automática de ACEs herdáveis para
objetos filho existentes.

ADS_SD_CONTROL_SE_DACL_PROTECTED
Valor: 0x1000
O descritor de segurança não permitirá que ACEs herdáveis modifiquem a DACL.

ADS_SD_CONTROL_SE_SACL_PROTECTED
Valor: 0x2000
O descritor de segurança não permitirá que ACEs herdáveis modifiquem a SACL.

ADS_SD_CONTROL_SE_SELF_RELATIVE
Valor: 0x8000
O descritor de segurança é de formato auto-relativo com todas as informações de segurança em
um bloco contínuo de memória.

Comentários
Para obter mais informações, consulte Controle de Acesso em Segurança no SDK
(Platform Software Development Kit).

Como o VBScript não pode ler informações de uma biblioteca de tipos, os aplicativos
VBScript não entendem as constantes simbólicas, conforme definido acima. Em vez
disso, você deve usar as constantes numéricas para definir os sinalizadores apropriados
em seus aplicativos VBScript. Se você quiser usar as constantes simbólicas como uma
boa prática de programação, deverá fazer declarações explícitas dessas constantes,
conforme feito aqui, em seus aplicativos VBScript.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Enumerações ADSI

Controle de acesso

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


enumeração ADS_SD_FORMAT_ENUM
(iads.h)
Artigo24/08/2023

A enumeração ADS_SD_FORMAT_ENUM especifica o formato em que o descritor de


segurança de um objeto será convertido pela interface IADsSecurityUtility .

Syntax
C++

typedef enum __MIDL___MIDL_itf_ads_0001_0088_0002 {


ADS_SD_FORMAT_IID = 1,
ADS_SD_FORMAT_RAW = 2,
ADS_SD_FORMAT_HEXSTRING = 3
} ADS_SD_FORMAT_ENUM;

Constantes

ADS_SD_FORMAT_IID
Valor: 1
Indica que o descritor de segurança deve ser convertido no formato de interface
IADsSecurityDescriptor . Se ADS_SD_FORMAT_IID for usado como o formato de entrada ao
definir o descritor de segurança, espera-se que a variante passada seja uma VT_DISPATCH, em
que o ponteiro de expedição dá suporte à interface IADsSecurityDescriptor .

ADS_SD_FORMAT_RAW
Valor: 2
Indica que o descritor de segurança deve ser convertido no formato binário.

ADS_SD_FORMAT_HEXSTRING
Valor: 3
Indica que o descritor de segurança deve ser convertido no formato de cadeia de caracteres
codificada em hex.

Requisitos
Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Enumerações ADSI

ADS_PATHTYPE_ENUM

IADsSecurityDescriptor

IADsSecurityUtility

Descritores de segurança em arquivos e chaves do Registro

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


enumeração ADS_SD_REVISION_ENUM
(iads.h)
Artigo24/08/2023

A enumeração ADS_SD_REVISION_ENUM especifica o número de revisão da ACE


(entrada de controle de acesso) ou a ACL (lista de controle de acesso) para o Active
Directory.

Syntax
C++

typedef enum __MIDL___MIDL_itf_ads_0001_0048_0006 {


ADS_SD_REVISION_DS = 4
} ADS_SD_REVISION_ENUM;

Constantes

ADS_SD_REVISION_DS
Valor: 4
O número de revisão do ACE, ou da ACL, para o Active Directory.

Comentários
O sinalizador ADS_SD_REVISION_DS significa que a ACL relacionada contém ACEs
específicas do objeto.

Como o VBScript não pode ler dados de uma biblioteca de tipos, os aplicativos VBScript
não podem reconhecer as constantes simbólicas conforme definido acima. Em vez disso,
use as constantes numéricas para definir os sinalizadores apropriados em seus
aplicativos VBScript. Para usar as constantes simbólicas como uma boa prática de
programação, escreva declarações explícitas dessas constantes, como feito aqui, em
seus aplicativos VBScript.

Requisitos
Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Enumerações ADSI

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


ADS_SEARCHPREF_ENUM enumeração (iads.h)
Artigo24/08/2023

A enumeração ADS_SEARCHPREF_ENUM especifica preferências para um objeto IDirectorySearch . Essa enumeração é


usada no membro dwSearchPref da estrutura ADS_SEARCHPREF_INFO no método IDirectorySearch::SetSearchPreference .

Syntax
C++

typedef enum __MIDL___MIDL_itf_ads_0000_0000_0025 {


ADS_SEARCHPREF_ASYNCHRONOUS = 0,
ADS_SEARCHPREF_DEREF_ALIASES,
ADS_SEARCHPREF_SIZE_LIMIT,
ADS_SEARCHPREF_TIME_LIMIT,
ADS_SEARCHPREF_ATTRIBTYPES_ONLY,
ADS_SEARCHPREF_SEARCH_SCOPE,
ADS_SEARCHPREF_TIMEOUT,
ADS_SEARCHPREF_PAGESIZE,
ADS_SEARCHPREF_PAGED_TIME_LIMIT,
ADS_SEARCHPREF_CHASE_REFERRALS,
ADS_SEARCHPREF_SORT_ON,
ADS_SEARCHPREF_CACHE_RESULTS,
ADS_SEARCHPREF_DIRSYNC,
ADS_SEARCHPREF_TOMBSTONE,
ADS_SEARCHPREF_VLV,
ADS_SEARCHPREF_ATTRIBUTE_QUERY,
ADS_SEARCHPREF_SECURITY_MASK,
ADS_SEARCHPREF_DIRSYNC_FLAG,
ADS_SEARCHPREF_EXTENDED_DN
} ADS_SEARCHPREF_ENUM;

Constantes

ADS_SEARCHPREF_ASYNCHRONOUS
Valor: 0
Especifica que as pesquisas devem ser executadas de forma assíncrona. Por
padrão, as pesquisas são síncronas.

Em uma pesquisa síncrona, os métodos IDirectorySearch::GetFirstRow e


IDirectorySearch::GetNextRow não retornam até que o servidor retorne todo o
resultado ou para uma pesquisa paginada, a página inteira.

Uma pesquisa assíncrona bloqueia até que uma linha dos resultados da pesquisa
esteja disponível ou até que o intervalo de tempo limite especificado pelo
ADS_SEARCHPREF_TIMEOUT preferência de pesquisa se especifique.

ADS_SEARCHPREF_DEREF_ALIASES
Especifica que os aliases dos objetos encontrados devem ser resolvidos. Use a
enumeração ADS_DEREFENUM para especificar como isso é executado.

ADS_SEARCHPREF_SIZE_LIMIT
Especifica o limite de tamanho que o servidor deve observar durante uma
pesquisa. O servidor para de pesquisar quando o limite de tamanho é atingido e
retorna os resultados acumulados para esse ponto. Se esse valor for zero, o
limite de tamanho será determinado pelo serviço de diretório. O padrão para
esse valor é zero. Se esse valor for maior que o limite de tamanho determinado
pelo serviço de diretório, o limite de serviço de diretório terá precedência.

Para o Active Directory, o limite de tamanho especifica o número máximo de


objetos a serem retornados pela pesquisa. Também para o Active Directory, o
número máximo de objetos retornados por uma pesquisa é de 1000 objetos.

ADS_SEARCHPREF_TIME_LIMIT
Especifica o número de segundos que o servidor aguarda a conclusão de uma
pesquisa. Quando o limite de tempo é atingido, o servidor para de pesquisar e
retorna os resultados acumulados para esse ponto. Se esse valor for zero, o
período de tempo limite será infinito. O padrão para esse valor é 120 segundos.

ADS_SEARCHPREF_ATTRIBTYPES_ONLY
Indica que a pesquisa deve obter apenas o nome dos atributos aos quais os
valores são atribuídos.

ADS_SEARCHPREF_SEARCH_SCOPE
Especifica o escopo de pesquisa que deve ser observado pelo servidor. Para
obter mais informações sobre as configurações apropriadas, consulte a
enumeração ADS_SCOPEENUM .

ADS_SEARCHPREF_TIMEOUT
Especifica o limite de tempo, em segundos, que um cliente aguardará o servidor
retornar o resultado. Essa opção é definida em uma estrutura
ADS_SEARCHPREF_INFO .

ADS_SEARCHPREF_PAGESIZE
Especifica o tamanho da página em uma pesquisa paginada. Para cada
solicitação do cliente, o servidor retorna, no máximo, o número de objetos
conforme definido pelo tamanho da página. Quando o tamanho da página é
definido, é desnecessário definir o limite de tamanho. Se um limite de tamanho
for definido, o valor do tamanho da página deverá ser menor que o valor do
limite de tamanho. Se o valor do tamanho da página exceder o limite de
tamanho, o erro ERROR_DS_SIZELIMIT_EXCEEDED será retornado com o número
de linhas especificado pelo limite de tamanho.

ADS_SEARCHPREF_PAGED_TIME_LIMIT
Especifica o número de segundos que o servidor deve aguardar por uma página
de resultados da pesquisa, em vez do limite de tempo para toda a pesquisa.
Quando o limite de tempo é atingido, o servidor para de pesquisar e retorna os
resultados obtidos até esse ponto, juntamente com um cookie que contém os
dados sobre onde retomar a pesquisa. Se esse valor for zero, o período de
tempo limite da página será infinito. O valor padrão para esse limite é de 120
segundos.

ADS_SEARCHPREF_CHASE_REFERRALS
Especifica que as indicações podem ser perseguidas. Se a pesquisa raiz não for
especificada no contexto de nomenclatura do servidor ou quando os resultados
da pesquisa cruzarem um contexto de nomenclatura, por exemplo, quando você
tiver domínios filho e pesquisar no domínio pai, o servidor enviará uma
mensagem de indicação para o cliente que o cliente pode optar por ignorar ou
perseguir. Para obter mais informações sobre a busca de referências, consulte
ADS_CHASE_REFERRALS_ENUM.

ADS_SEARCHPREF_SORT_ON
Especifica que o servidor classifica o conjunto de resultados. Use a estrutura
ADS_SORTKEY para especificar as chaves de classificação. Essa preferência de
pesquisa funciona apenas para servidores de diretório que dão suporte ao
controle LDAP para classificação do lado do servidor. O Active Directory dá
suporte ao controle de classificação, mas pode afetar o desempenho do servidor,
especialmente se o conjunto de resultados for grande. O Active Directory dá
suporte apenas a uma única chave de classificação.

ADS_SEARCHPREF_CACHE_RESULTS
Especifica se o resultado deve ser armazenado em cache no lado do cliente. Por
padrão, o ADSI armazena em cache o conjunto de resultados. Desabilitar essa
opção pode ser desejável para conjuntos de resultados grandes.
ADS_SEARCHPREF_DIRSYNC
Especifica uma pesquisa de dirsync (sincronização de diretório), que retorna
todas as alterações desde um estado especificado. Na estrutura ADSVALUE ,
defina o membro dwType como ADS_PROV_SPECIFIC. O membro
ProviderSpecific é uma estrutura ADS_PROV_SPECIFIC cujo membro lpValue
especifica um cookie que indica o estado do qual as alterações são recuperadas.
Na primeira vez que você usar o controle DirSync, defina os membros dwLength
e lpValue da estrutura ADS_PROV_SPECIFIC como zero e NULL ,
respectivamente. Depois de ler o conjunto de resultados retornado pela pesquisa
até que IDirectorySearch::GetNextRow retorne S_ADS_NOMORE_ROWS, chame
IDirectorySearch::GetColumn para recuperar o atributo ADS_DIRSYNC_COOKIE
que contém um cookie a ser usado na próxima pesquisa do DirSync. Para obter
mais informações, consulte Sondagem de alterações usando o controle DirSync e
LDAP_SERVER_DIRSYNC_OID.

Esse sinalizador não pode ser combinado com ADS_SEARCHPREF_PAGESIZE.

O chamador deve ter o privilégio SE_SYNC_AGENT_NAME .

ADS_SEARCHPREF_TOMBSTONE
Especifica se a pesquisa também deve retornar objetos excluídos que
correspondam ao filtro de pesquisa. Quando os objetos são excluídos, o Active
Directory os move para um contêiner "Objetos Excluídos". Por padrão, os objetos
excluídos não são incluídos nos resultados da pesquisa. Na estrutura ADSVALUE ,
defina o membro dwType como ADSTYPE_BOOLEAN. Para incluir objetos
excluídos, defina o membro booliano da estrutura ADSVALUE como TRUE.

Nem todos os atributos são preservados quando o objeto é excluído. Você pode
recuperar os atributos objectGUID e RDN . O atributo distinguishedName é o
DN do objeto no contêiner "Objetos Excluídos", não o DN anterior. O atributo
isDeleted é TRUE para um objeto excluído. Para obter mais informações,
consulte Recuperando objetos excluídos.

ADS_SEARCHPREF_VLV
Especifica que a pesquisa deve usar o controle VLV (exibição de lista virtual)
LDAP. ADS_SEARCHPREF_VLV pode ser usado para acessar pesquisas VLV de
tipo de cadeia de caracteres e de tipo de deslocamento, definindo os campos
apropriados. Essas duas opções não podem ser usadas simultaneamente porque
não é possível definir o controle VLV para solicitar um conjunto de resultados
localizado em um deslocamento específico e segue um valor específico na
sequência de classificação.

Para executar uma pesquisa de cadeia de caracteres, defina o campo lpszTarget


em ADS_VLV para a cadeia de caracteres a ser pesquisada. Para executar uma
pesquisa de tipo de deslocamento, defina o campo dwOffset em ADS_VLV. Se
você usar uma pesquisa de deslocamento, deverá definir lpszTarget como NULL.

ADS_SEARCHPREF_SORT_ON deve ser definido como TRUE ao usar


ADS_SEARCHPREF_VLV. A ordem de classificação dos resultados da pesquisa
determina a ordem usada para a pesquisa VLV. Se estiver executando uma
pesquisa de tipo de deslocamento, o deslocamento será usado como um índice
na lista classificada. Se estiver executando uma pesquisa de tipo de cadeia de
caracteres, o servidor tentará retornar a primeira entrada que é maior que ou
igual à cadeia de caracteres, com base na ordem de classificação.

O cache dos resultados da pesquisa é desabilitado quando


ADS_SEARCHPREF_VLV é especificado.

Se você atribuir ADS_SEARCHPREF_CACHE_RESULTS um TRUE, o valor ao usar


ADS_SEARCHPREF_VLV, SetSearchPreference falhará e retornará o erro
E_ADS_BAD_PARAMETER.

ADS_SEARCHPREF_ATTRIBUTE_QUERY
Especifica que uma pesquisa de consulta com escopo de atributo deve ser
executada. A pesquisa é executada em relação aos objetos nomeados em um
atributo especificado do objeto base. O membro vValue da estrutura
ADS_SEARCHPREF_INFO contém um valor ADSTYPE_CASE_IGNORE_STRING que
contém o lDAPDisplayName do atributo a ser pesquisado. Esse atributo deve ser
um atributo ADS_DN_STRING . Somente um atributo pode ser especificado. O
escopo de pesquisa é definido automaticamente como ADS_SCOPE_BASE ao
usar essa preferência e tentar definir o escopo, caso contrário, falhará com o erro
E_ADS_BAD_PARAMETER. Com exceção da preferência de
ADS_SEARCHPREF_VLV , todas as outras preferências que usam controles LDAP,
como ADS_SEARCHPREF_DIRSYNC, ADS_SEARCHPREF_TOMBSTONE e assim
por diante, não são permitidas quando essa preferência é especificada.

ADS_SEARCHPREF_SECURITY_MASK ADS_SECURITY_INFO_GROUP ADS_SECURITY_INFO_DACL.


Especifica que a pesquisa deve retornar dados de acesso de segurança para os
atributos especificados. O membro vValue da estrutura ADS_SEARCHPREF_INFO
contém um valor ADS_INTEGER que é uma combinação de um ou mais dos
valores a seguir.

Valor Descrição

ADS_SECURITY_INFO_OWNER Lê os dados do proprietário.

ADS_SECURITY_INFO_GROUP Lê os dados do grupo.

ADS_SECURITY_INFO_DACL Lê a DACL (lista de controle de acesso


discricionário).

ADS_SECURITY_INFO_SACL Lê a SACL (lista de controle de acesso) do


sistema.

Se você ler um descritor de segurança sem especificar explicitamente uma


máscara de segurança usando ADS_SEARCHPREF_SECURITY_MASK, ele usará
como padrão o equivalente a ADS_SECURITY_INFO_OWNER

ADS_SEARCHPREF_DIRSYNC_FLAG
Contém sinalizadores opcionais para uso com a preferência de pesquisa
ADS_SEARCHPREF_DIRSYNC . O membro vValue da estrutura
ADS_SEARCHPREF_INFO contém um valor ADSTYPE_INTEGER que é zero ou
uma combinação de um ou mais dos valores a seguir. Para obter mais
informações sobre o controle DirSync, consulte Sondagem de alterações usando
o controle DirSync e LDAP_SERVER_DIRSYNC_OID.
Identificador Valor Descrição

LDAP_DIRSYNC_OBJECT_SECURITY 1 Se esse
sinalizador não
estiver
presente, o
chamador
deverá ter as
alterações de
replicação
corretas. Se
esse
sinalizador
estiver
presente,
O chamador
não requer
direitos, mas
só tem
permissão para
ver objetos e
atributos
acessíveis ao
chamador.

LDAP_DIRSYNC_ANCESTORS_FIRST_ORDER 2048 Retorne


(0x00000800) objetos pai
antes dos
objetos filho,
quando os
objetos pai
apareceriam
posteriormente
no fluxo de
replicação.
LDAP_DIRSYNC_PUBLIC_DATA_ONLY 8192 Não retorne
(0x00002000) dados privados
nos resultados
da pesquisa.

LDAP_DIRSYNC_INCREMENTAL_VALUES 2147483648 Se este


(0x80000000) sinalizador não
estiver
presente,
todos os
valores, até o
limite
especificado
de servidor,
em um
atributo com
vários valores
serão
retornados
quando
qualquer valor
for alterado. Se
esse
sinalizador
estiver
presente,
somente os
valores
alterados serão
retornados.

ADS_SEARCHPREF_EXTENDED_DN
A pesquisa deve retornar nomes diferenciados no formato estendido do Active
Directory. O membro vValue da estrutura ADS_SEARCHPREF_INFO contém um
valor ADSTYPE_INTEGER que contém zero se as partes GUID e SID da cadeia de
caracteres DN devem estar no formato hex ou um se as partes GUID e SID da
cadeia de caracteres DN devem estar no formato padrão. Para obter mais
informações sobre nomes diferenciados estendidos, consulte
LDAP_SERVER_EXTENDED_DN_OID.

Comentários
Para configurar uma preferência de pesquisa, atribua valores apropriados aos campos de uma estrutura
ADS_SEARCHPREF_INFO passada para o servidor. O membro vValue da estrutura ADS_SEARCHPREF_INFO é uma estrutura
ADSVALUE . A lista a seguir lista os valores ADS_SEARCHPREF_ENUM , os valores correspondentes para o membro
dwType da estrutura ADSVALUE e o membro ADSVALUE usado para o tipo especificado.

ADS_SEARCHPREF_ENUM valor membro dwType de ADSVALUE Membro ADSVALUE

ADS_SEARCHPREF_ASYNCHRONOUS ADSTYPE_BOOLEAN Booliano

ADS_SEARCHPREF_DEREF_ALIASES ADSTYPE_INTEGER Inteiro

ADS_SEARCHPREF_SIZE_LIMIT ADSTYPE_INTEGER Inteiro

ADS_SEARCHPREF_TIME_LIMIT ADSTYPE_INTEGER Inteiro

ADS_SEARCHPREF_ATTRIBTYPES_ONLY ADSTYPE_BOOLEAN Booliano

ADS_SEARCHPREF_SEARCH_SCOPE ADSTYPE_INTEGER Inteiro

ADS_SEARCHPREF_TIMEOUT ADSTYPE_INTEGER Inteiro


ADS_SEARCHPREF_PAGESIZE ADSTYPE_INTEGER Inteiro

ADS_SEARCHPREF_PAGED_TIME_LIMIT ADSTYPE_INTEGER Inteiro

ADS_SEARCHPREF_CHASE_REFERRALS ADSTYPE_INTEGER Inteiro

ADS_SEARCHPREF_SORT_ON ADSTYPE_PROV_SPECIFIC ProviderSpecific

ADS_SEARCHPREF_CACHE_RESULTS ADSTYPE_BOOLEAN Booliano

ADS_SEARCHPREF_DIRSYNC ADSTYPE_PROV_SPECIFIC ProviderSpecific

ADS_SEARCHPREF_TOMBSTONE ADSTYPE_BOOLEAN Booliano

ADS_SEARCHPREF_VLV ADSTYPE_PROV_SPECIFIC ProviderSpecific

ADS_SEARCHPREF_ATTRIBUTE_QUERY ADSTYPE_CASE_IGNORE_STRING CaseIgnoreString

ADS_SEARCHPREF_SECURITY_MASK ADSTYPE_INTEGER Inteiro

ADS_SEARCHPREF_DIRSYNC_FLAG ADSTYPE_INTEGER Inteiro

ADS_SEARCHPREF_EXTENDED_DN ADSTYPE_INTEGER Inteiro

Para configurar várias preferências, use uma matriz de estruturas de ADS_SEARCHPREF_INFO . Os valores de membro
dessa enumeração são atribuídos ao membro dwSearchPref da estrutura ADS_SEARCHPREF_INFO .

Todas as opções são compatíveis com o provedor de sistema LDAP.

Como o VBScript não pode ler dados de uma biblioteca de tipos, os aplicativos VBScript não reconhecem as constantes
simbólicas conforme definido acima. Em vez disso, você deve usar as constantes numéricas para definir os sinalizadores
apropriados em seus aplicativos VBScript. Para usar as constantes simbólicas, como uma boa prática de programação,
declare explicitamente essas constantes, como feito aqui, em seus aplicativos VBScript.

Exemplos

O exemplo de código a seguir mostra como configurar preferências de pesquisa usando a enumeração
ADS_SEARCHPREF_INFO .

C++

HRESULT SetSearchPreferences2(
DWORD dwScope,// -1 indicates default: subtree.
DWORD dwOverallTimeOut,// <=0 indicates default: no time out set.
DWORD dwOverallSizeLimit,// <=0 indicates default: no size limit set.
DWORD dwOverallTimeLimit,// <=0 indicates default: no time limit set.
BOOL bCacheResult,// TRUE indicates default.
BOOL bIsAsynchronous,// FALSE indicates default.
DWORD dwPageSize,// <=0 indicates default.
DWORD dwPageTimeLimit,// <=0 indicates default.
DWORD dwChaseReferral,// <=0 indicates default.
LPOLESTR szSortKey,// NULL indicates do not sort.
BOOL bIsDescending,
BOOL bReturnAttributeNamesOnly,// FALSE indicates default.
ADS_SEARCHPREF_INFO **ppSearchPref, // Return an array of search preferences.
DWORD *pdwSearchPrefCount
)
{
HRESULT hr = S_OK;
DWORD dwCountPref = 0L;

// Determine size of preferences array.


DWORD dwTotal = 11L;

if(dwScope==-1)
dwTotal--;
if(dwOverallTimeOut<=0)
dwTotal--;
if(dwOverallSizeLimit<=0)
dwTotal--;
if(dwOverallTimeLimit<=0)
dwTotal--;
if(bCacheResult)
dwTotal--;
if(!bIsAsynchronous)
dwTotal--;
if(dwPageSize<=0)
dwTotal--;
if(dwPageTimeLimit<=0)
dwTotal--;
if(dwChaseReferral<=0)
dwTotal--;
if(!bReturnAttributeNamesOnly)
dwTotal--;
if (!szSortKey)
dwTotal--;

ADS_SEARCHPREF_INFO *prefInfo = new ADS_SEARCHPREF_INFO[ dwTotal ];


ADS_SORTKEY SortKey;

if(!prefInfo)
{
return E_OUTOFMEMORY;
}

//////////////////
// Search Scope
//////////////////
if(dwScope>=0)
{
prefInfo[dwCountPref].dwSearchPref =
ADS_SEARCHPREF_SEARCH_SCOPE;
prefInfo[dwCountPref].vValue.dwType = ADSTYPE_INTEGER;
prefInfo[dwCountPref].vValue.Integer = dwScope;
dwCountPref++;
}

//////////////////
// Time Out
//////////////////
if(dwOverallTimeOut>0)
{
prefInfo[dwCountPref].dwSearchPref = ADS_SEARCHPREF_TIMEOUT;
prefInfo[dwCountPref].vValue.dwType = ADSTYPE_INTEGER;
prefInfo[dwCountPref].vValue.Integer = dwOverallTimeOut;
dwCountPref++;
}

///////////////
// Size Limit
///////////////
if(dwOverallSizeLimit>0)
{
prefInfo[dwCountPref].dwSearchPref = ADS_SEARCHPREF_SIZE_LIMIT;
prefInfo[dwCountPref].vValue.dwType = ADSTYPE_INTEGER;
prefInfo[dwCountPref].vValue.Integer = dwOverallSizeLimit;
dwCountPref++;
}

///////////////
// Time Limit
///////////////
if(dwOverallTimeLimit>0)
{
prefInfo[dwCountPref].dwSearchPref = ADS_SEARCHPREF_TIME_LIMIT;
prefInfo[dwCountPref].vValue.dwType = ADSTYPE_INTEGER;
prefInfo[dwCountPref].vValue.Integer = dwOverallTimeLimit;
dwCountPref++;
}
/////////////////
// Cache Result
/////////////////

if (!bCacheResult)
{
prefInfo[dwCountPref].dwSearchPref =
ADS_SEARCHPREF_CACHE_RESULTS;
prefInfo[dwCountPref].vValue.dwType = ADSTYPE_BOOLEAN;
prefInfo[dwCountPref].vValue.Boolean = bCacheResult;
dwCountPref++;
}

//////////////
// Page Size
//////////////
if(dwPageSize>0)
{
prefInfo[dwCountPref].dwSearchPref = ADS_SEARCHPREF_PAGESIZE;
prefInfo[dwCountPref].vValue.dwType = ADSTYPE_INTEGER;;
prefInfo[dwCountPref].vValue.Integer = dwPageSize;
dwCountPref++;
}

//////////////////
// Page Time Limit
//////////////////
if(dwPageTimeLimit>0)
{
prefInfo[dwCountPref].dwSearchPref =
ADS_SEARCHPREF_PAGED_TIME_LIMIT;
prefInfo[dwCountPref].vValue.dwType = ADSTYPE_INTEGER;;
prefInfo[dwCountPref].vValue.Integer = dwPageTimeLimit;
dwCountPref++;
}

///////////////////
// Chase Referrals
///////////////////
if(dwChaseReferral>0)
{
prefInfo[dwCountPref].dwSearchPref =
ADS_SEARCHPREF_CHASE_REFERRALS;
prefInfo[dwCountPref].vValue.dwType = ADSTYPE_INTEGER;
prefInfo[dwCountPref].vValue.Integer = dwChaseReferral;
dwCountPref++;
}

/////////////
// Sort
/////////////
if (szSortKey)
{
prefInfo[dwCountPref].dwSearchPref = ADS_SEARCHPREF_SORT_ON;
prefInfo[dwCountPref].vValue.dwType = ADSTYPE_PROV_SPECIFIC;
SortKey.pszAttrType = (LPWSTR)LocalAlloc(
LPTR,
wcslen(szSortKey)*sizeof(WCHAR) +sizeof(WCHAR)
);
wcscpy_s(SortKey.pszAttrType,szSortKey);
SortKey.pszReserved = NULL;
SortKey.fReverseorder = 0;
prefInfo[dwCountPref].vValue.ProviderSpecific.dwLength =
sizeof(ADS_SORTKEY);
prefInfo[dwCountPref].vValue.ProviderSpecific.lpValue =
(LPBYTE) &SortKey;
dwCountPref++;
}

/////////////////
// Asynchronous
/////////////////
if(bIsAsynchronous)
{
prefInfo[dwCountPref].dwSearchPref =
ADS_SEARCHPREF_ASYNCHRONOUS;
prefInfo[dwCountPref].vValue.dwType = ADSTYPE_BOOLEAN;
prefInfo[dwCountPref].vValue.Integer = bIsAsynchronous;
dwCountPref++;
}

////////////////////////
// Attribute Type Only
////////////////////////
if(bReturnAttributeNamesOnly)
{
prefInfo[dwCountPref].dwSearchPref =
ADS_SEARCHPREF_ATTRIBTYPES_ONLY;
prefInfo[dwCountPref].vValue.dwType = ADSTYPE_BOOLEAN;
prefInfo[dwCountPref].vValue.Integer =
bReturnAttributeNamesOnly;
dwCountPref++;
}

if (SUCCEEDED(hr))
{
*pdwSearchPrefCount = dwCountPref;
*ppSearchPref = prefInfo;
}
else
{
*pdwSearchPrefCount = 0L;
*ppSearchPref = NULL;
}

return hr;
}

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Enumerações ADSI

ADSVALUE

ADS_CHASE_REFERRALS_ENUM

ADS_DEREFENUM

ADS_PROV_SPECIFIC

ADS_SCOPEENUM

ADS_SEARCHPREF_INFO

ADS_SORTKEY

ADS_VLV
IDirectorySearch::GetColumn

IDirectorySearch::GetNextRow

IDirectorySearch::SetSearchPreference

Sondagem de alterações usando o controle DirSync

Recuperando objetos excluídos

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


ADS_SECURITY_INFO_ENUM
enumeração (iads.h)
Artigo24/08/2023

A enumeração ADS_SECURITY_INFO_ENUM especifica as opções disponíveis para


examinar os dados de segurança de um objeto.

Syntax
C++

typedef enum __MIDL___MIDL_itf_ads_0001_0077_0002 {


ADS_SECURITY_INFO_OWNER = 0x1,
ADS_SECURITY_INFO_GROUP = 0x2,
ADS_SECURITY_INFO_DACL = 0x4,
ADS_SECURITY_INFO_SACL = 0x8
} ADS_SECURITY_INFO_ENUM;

Constantes

ADS_SECURITY_INFO_OWNER
Valor: 0x1
Lê ou define os dados do proprietário.

ADS_SECURITY_INFO_GROUP
Valor: 0x2
Lê ou define os dados do grupo.

ADS_SECURITY_INFO_DACL
Valor: 0x4
Lê ou define os dados da lista de controle de acesso discricionário.

ADS_SECURITY_INFO_SACL
Valor: 0x8
Lê ou define os dados da lista de controle de acesso do sistema.

Comentários
As opções definidas nessa enumeração são máscaras de bits. Mais de uma opção pode
ser definida usando operações bit a bit apropriadas.
Para ler os dados de segurança de um objeto, use a interface IADsObjectOptions ,
fornecendo as opções de dados de segurança listadas nesta enumeração.

A lista a seguir lista combinações comuns de sinalizadores e seu uso.

Combinação de sinalizadores Descrição

ADS_SECURITY_INFO_OWNER, Permitir que os usuários leiam os dados de


ADS_SECURITY_INFO_GROUP e segurança do proprietário, grupo ou DACL de
ADS_SECURITY_INFO_DACL um objeto. Essa é a configuração padrão quando
um objeto é criado.

ADS_SECURITY_INFO_OWNER, Permitir que os usuários leiam o SACL. O


ADS_SECURITY_INFO_GROUP, sinalizador ADS_SECURITY_INFO_SACL não
ADS_SECURITY_INFO_DACL e pode ser usado por si só.
ADS_SECURITY_INFO_SACL

Atualmente, essas opções estão disponíveis apenas para o Active Directory.

Como o Visual Basic Scripting Edition (VBScript) não pode ler dados de uma biblioteca
de tipos, um aplicativo deve usar as constantes numéricas apropriadas, em vez das
constantes simbólicas, para definir os sinalizadores apropriados. Para usar as constantes
simbólicas como uma boa prática de programação, escreva declarações explícitas
dessas constantes, como feito aqui.

Exemplos
O exemplo de código a seguir exibe o número de entradas de controle de acesso em
um SACL.

VB

Const ADS_SECURITY_INFO_OWNER = &H1


Const ADS_SECURITY_INFO_GROUP = &H2
Const ADS_SECURITY_INFO_DACL = &H4
Const ADS_SECURITY_INFO_SACL = &H8

Const ADS_OPTION_SECURITY_MASK = 3

Dim x As IADs
Dim dso As IADsOpenDSObject
Dim adsPath As String
Dim sd As IADsSecurityDescriptor
Dim sacl As IADsAccessControlList
Dim objOps As IADsObjectOptions
Dim opt As Variant
Dim canReadSacl As Variant
Set dso = GetObject("LDAP:")
adsPath = "LDAP://ArcSrv1/dc=Sales,dc=Fabrikam,dc=com"
Set x = dso.OpenDSObject(adsPath, vbNullString, vbNullString, 1)
Set objOps = x

canReadSacl = ADS_SECURITY_INFO_OWNER _
Or ADS_SECURITY_INFO_GROUP _
Or ADS_SECURITY_INFO_DACL _
Or ADS_SECURITY_INFO_SACL

opt = objOps.GetOption(ADS_OPTION_SECURITY_MASK)
If opt <> canReadSacl Then
objOps.SetOption ADS_OPTION_SECURITY_MASK, canReadSacl
End If
Set sd = x.Get("ntSecurityDescriptor")
Set sacl = sd.SystemAcl
Debug.Print "sacl(aceCount)= " & sacl.AceCount

O exemplo de código a seguir exibe o número de entradas de controle de acesso em


uma ACL do sistema. Para resumir, a verificação de erros é omitida.

C++

void TestObjectOptions()
{
long lCanReadSACL = ADS_SECURITY_INFO_OWNER |
ADS_SECURITY_INFO_GROUP |
ADS_SECURITY_INFO_DACL |
ADS_SECURITY_INFO_SACL;

HRESULT hr = S_OK;
CComPtr<IADs> spObj;
hr = ADsOpenObject(L"LDAP://arcSrv1/dc=Sales,dc=Fabrikam,dc=com",
NULL,
NULL,
ADS_SECURE_AUTHENTICATION,
IID_IADs,
(void**)&spObj);
if(S_OK != hr)
{
return;
}

CComPtr<IADsObjectOptions> spObjOps;
hr = spObj->QueryInterface(IID_IADsObjectOptions, (void**)&spObjOps);
if(S_OK != hr)
{
return;
}

CComVariant svar;
hr = spObjOps->GetOption(ADS_OPTION_SECURITY_MASK, &svar);
if(S_OK != hr)
{
return;
}

if(V_I4(&svar) != lCanReadSACL)
{
svar = lCanReadSACL;
hr = spObjOps->SetOption(ADS_OPTION_SECURITY_MASK, svar);
}

hr = spObj->Get(CComBSTR("ntSecurityDescriptor"), &svar);
if(S_OK != hr)
{
return;
}

CComPtr<IADsSecurityDescriptor> spSd;
hr = V_DISPATCH(&svar)->QueryInterface(IID_IADsSecurityDescriptor,
(void**)&spSd);
if(S_OK != hr)
{
return;
}

CComPtr<IDispatch> spDisp;
hr = spSd->get_SystemAcl(&spDisp);
if(S_OK != hr)
{
return;
}

CComPtr<IADsAccessControlList> spSacl;
hr = spDisp->QueryInterface(IID_IADsAccessControlList,
(void**)&spSacl);
if(S_OK != hr)
{
return;
}

LONG lOptions;
hr = spSacl->get_AceCount(&lOptions);
if(S_OK != hr)
{
return;
}

_tprintf(TEXT("Number of ACE's in the SACL is %d\n"), lOptions);


}

Requisitos
Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Enumerações ADSI

IADsObjectOptions

IADsObjectOptions::GetOption

IADsObjectOptions::SetOption

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


ADS_SETTYPE_ENUM enumeração
(iads.h)
Artigo24/08/2023

A enumeração ADS_SETTYPE_ENUM especifica o formato de nome de caminho


disponível usado pelo método IADsPathname::Set .

Syntax
C++

typedef enum __MIDL___MIDL_itf_ads_0001_0078_0001 {


ADS_SETTYPE_FULL = 1,
ADS_SETTYPE_PROVIDER = 2,
ADS_SETTYPE_SERVER = 3,
ADS_SETTYPE_DN = 4
} ADS_SETTYPE_ENUM;

Constantes

ADS_SETTYPE_FULL
Valor: 1
Define o caminho completo, por exemplo, "LDAP://servername/o=internet/.../cn=bar".

ADS_SETTYPE_PROVIDER
Valor: 2
Atualizações somente o provedor, por exemplo, "LDAP".

ADS_SETTYPE_SERVER
Valor: 3
Atualizações apenas o nome do servidor, por exemplo, "servername".

ADS_SETTYPE_DN
Valor: 4
Atualizações apenas o nome diferenciado, por exemplo, "o=internet/.../cn=bar".

Comentários
Como o VBScript não pode ler informações de uma biblioteca de tipos, os aplicativos
VBScript não entendem as constantes simbólicas conforme definido acima. Em vez
disso, você deve usar as constantes numéricas para definir os sinalizadores apropriados
em seus aplicativos VBScript. Se você quiser usar as constantes simbólicas como uma
boa prática de programação, deverá fazer declarações explícitas dessas constantes,
como feito aqui, em seus aplicativos VBScript.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Enumerações ADSI

IADsPathname::Set

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


ADS_STATUSENUM enumeração (iads.h)
Artigo24/08/2023

A enumeração ADS_STATUSENUM especifica o status de um conjunto de preferências


de pesquisa com o método IDirectorySearch::SetSearchPreference.

Syntax
C++

typedef enum __MIDL___MIDL_itf_ads_0000_0000_0019 {


ADS_STATUS_S_OK = 0,
ADS_STATUS_INVALID_SEARCHPREF,
ADS_STATUS_INVALID_SEARCHPREFVALUE
} ADS_STATUSENUM;

Constantes

ADS_STATUS_S_OK
Valor: 0
A preferência de pesquisa foi definida com êxito.

ADS_STATUS_INVALID_SEARCHPREF
A preferência de pesquisa especificada no membro dwSearchPref da estrutura
ADS_SEARCHPREF_INFO é inválida. As preferências de pesquisa devem ser obtidas da
enumeração ADS_SEARCHPREF_ENUM .

ADS_STATUS_INVALID_SEARCHPREFVALUE
O valor especificado no membro vValue da estrutura ADS_SEARCHPREF_INFO é inválido para a
preferência de pesquisa correspondente.

Comentários
O método IDirectorySearch::SetSearchPreference define o membro
dwStatusADS_SEARCHPREF_INFO estrutura como um dos valores ADS_STATUSENUM
para indicar o status da preferência de pesquisa correspondente. Os chamadores
podem usar esse valor status para decidir se devem executar uma pesquisa.

O ADS_STATUS_INVALID_SEARCHPREF valor status pode ser definido se você definir


uma preferência de pesquisa válida, mas essa preferência não tem suporte. Por exemplo,
se você definir ADS_SEARCHPREF_SORT_ON, mas o servidor com o qual você se
comunica não oferecer suporte ao controle de classificação do lado do servidor LDAP, o
membro dwStatus da estrutura ADS_SEARCHPREF_INFO será definido como
ADS_STATUS_INVALID_SEARCHPREF pela chamada
IDirectorySearch::SetSearchPreference .

Nota Como o VBScript não pode ler dados de uma biblioteca de tipos, os
aplicativos VBScript não reconhecem as constantes simbólicas conforme definido
acima. Em vez disso, você deve usar as constantes numéricas para definir os
sinalizadores apropriados em seus aplicativos VBScript. Para usar as constantes
simbólicas como uma boa prática de programação, escreva declarações explícitas
dessas constantes, conforme feito no exemplo de código a seguir.

Exemplos

O exemplo de código a seguir mostra como usar a enumeração ADS_STATUSENUM


com o método IDirectorySearch::SetSearchPreference para determinar o status de uma
preferência de pesquisa.

C++

/***************************************************************************

SetAndCheckSearchTimeout()

***************************************************************************/

HRESULT SetAndCheckSearchTimeout(IDirectorySearch *pSearch,


DWORD dwTimeout,
ADS_STATUSENUM *pStatus)
{
if(!pSearch || !pStatus)
{
return E_INVALIDARG;
}

HRESULT hr;
ADS_SEARCHPREF_INFO SearchPref;

SearchPref.dwSearchPref = ADS_SEARCHPREF_TIMEOUT;
SearchPref.vValue.dwType = ADSTYPE_INTEGER;
SearchPref.vValue.Integer = dwTimeout;
SearchPref.dwStatus = ADS_STATUS_S_OK;

hr = pSearch->SetSearchPreference(&SearchPref, 1);
if(S_OK != hr)
{
return hr;
}

*pStatus = SearchPref.dwStatus;
return S_OK;
}

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Enumerações ADSI

ADS_SEARCHPREF_ENUM

ADS_SEARCHPREF_INFO

IDirectorySearch::SetSearchPreference

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


ADS_SYSTEMFLAG_ENUM enumeração
(iads.h)
Artigo24/08/2023

A enumeração ADS_SYSTEMFLAG_ENUM define alguns dos valores que podem ser


atribuídos ao atributo systemFlags . Alguns dos valores na enumeração são específicos
para objetos attributeSchema ; outros valores podem ser definidos em objetos de
qualquer classe.

Syntax
C++

typedef enum __MIDL___MIDL_itf_ads_0001_0017_0001 {


ADS_SYSTEMFLAG_DISALLOW_DELETE = 0x80000000,
ADS_SYSTEMFLAG_CONFIG_ALLOW_RENAME = 0x40000000,
ADS_SYSTEMFLAG_CONFIG_ALLOW_MOVE = 0x20000000,
ADS_SYSTEMFLAG_CONFIG_ALLOW_LIMITED_MOVE = 0x10000000,
ADS_SYSTEMFLAG_DOMAIN_DISALLOW_RENAME = 0x8000000,
ADS_SYSTEMFLAG_DOMAIN_DISALLOW_MOVE = 0x4000000,
ADS_SYSTEMFLAG_CR_NTDS_NC = 0x1,
ADS_SYSTEMFLAG_CR_NTDS_DOMAIN = 0x2,
ADS_SYSTEMFLAG_ATTR_NOT_REPLICATED = 0x1,
ADS_SYSTEMFLAG_ATTR_IS_CONSTRUCTED = 0x4
} ADS_SYSTEMFLAG_ENUM;

Constantes

ADS_SYSTEMFLAG_DISALLOW_DELETE
Valor: 0x80000000
Identifica um objeto que não pode ser excluído.

ADS_SYSTEMFLAG_CONFIG_ALLOW_RENAME
Valor: 0x40000000
Para objetos na partição de configuração, se esse sinalizador estiver definido, o objeto poderá ser
renomeado; caso contrário, o objeto não pode ser renomeado. Por padrão, esse sinalizador não é
definido em novos objetos criados na partição de configuração e você pode definir esse
sinalizador somente durante a criação do objeto.

ADS_SYSTEMFLAG_CONFIG_ALLOW_MOVE
Valor: 0x20000000
Para objetos na partição de configuração, se esse sinalizador estiver definido, o objeto poderá ser
movido; caso contrário, o objeto não pode ser movido. Por padrão, esse sinalizador não é
definido em novos objetos criados na partição de configuração e você pode definir esse
sinalizador somente durante a criação do objeto.

ADS_SYSTEMFLAG_CONFIG_ALLOW_LIMITED_MOVE
Valor: 0x10000000
Para objetos na partição de configuração, se esse sinalizador estiver definido, o objeto poderá ser
movido com restrições; caso contrário, o objeto não pode ser movido. Por padrão, esse
sinalizador não é definido em novos objetos criados na partição de configuração e você pode
definir esse sinalizador somente durante a criação do objeto.

ADS_SYSTEMFLAG_DOMAIN_DISALLOW_RENAME
Valor: 0x8000000
Identifica um objeto de domínio que não pode ser renomeado.

ADS_SYSTEMFLAG_DOMAIN_DISALLOW_MOVE
Valor: 0x4000000
Identifica um objeto de domínio que não pode ser movido.

ADS_SYSTEMFLAG_CR_NTDS_NC
Valor: 0x1
O contexto de nomenclatura está no NTDS.

ADS_SYSTEMFLAG_CR_NTDS_DOMAIN
Valor: 0x2
O contexto de nomenclatura é um domínio.

ADS_SYSTEMFLAG_ATTR_NOT_REPLICATED
Valor: 0x1
Se esse sinalizador for definido no atributo systemFlags de um objeto attributeSchema , o
atributo não será replicado.

ADS_SYSTEMFLAG_ATTR_IS_CONSTRUCTED
Valor: 0x4
Se esse sinalizador for definido no atributo systemFlags de um objeto attributeSchema , o
atributo será uma propriedade construída.

Comentários
Para objetos classSchema e attributeSchema , o bit 0x10 do atributo systemFlags indica
um objeto que faz parte do esquema base incluído no Active Directory. Esse bit não
pode ser definido em novos objetos classSchema e attributeSchema . A enumeração
ADS_SYSTEMFLAG_ENUM não inclui uma constante para esse bit.
Nota Como o VBScript não pode ler dados de uma biblioteca de tipos, os
aplicativos VBScript não reconhecem as constantes simbólicas, conforme definido
acima. Em vez disso, use as constantes numéricas para definir os sinalizadores
apropriados em seus aplicativos VBScript. Para usar as constantes simbólicas como
uma boa prática de programação, você deve fazer declarações explícitas dessas
constantes, conforme feito aqui, em seus aplicativos VBScript.

Exemplos

O exemplo de código a seguir mostra como os elementos da enumeração


ADS_SYSTEMFLAG_ENUM , juntamente com a interface IDirectorySearch , são usados
para pesquisar propriedades não replicadas.

C++

#include <wchar.h>
#include <activeds.h>
#include <atlbase.h>

HRESULT hr = E_FAIL;
LPWSTR szPrefix = L"LDAP://%s";
LPWSTR szPath = NULL;
IDirectorySearch *pSchemaNC = NULL;
IADs *pObject = NULL;
size_t nLength = 0;
LPWSTR pszSearchFilterTemplate = L"(&(objectCategory=attributeSchema)
(systemFlags:1.2.840.113556.1.4.804:=%d))";
LPWSTR pszSearchFilter = NULL;

CoInitialize(NULL); // Initialize COM

// Get rootDSE and the schema container distinguished name.


// Bind to current user's domain using current user's security context.
hr = ADsOpenObject(L"LDAP://rootDSE",
NULL,
NULL,
ADS_SECURE_AUTHENTICATION, // Use Secure Authentication.
IID_IADs,
(void**)&pObject);
if (SUCCEEDED(hr))
{
CComVarinat svar;
hr = pObject->Get(CComBSTR("schemaNamingContext"), &svar);
if (SUCCEEDED(hr))
{
nLength = wcslen(szPrefix) + wcslen(svar.bstrVal) + 1;
szPath = new WCHAR[nLength];
swprintf_s(szPath, szPrefix, svar.bstrVal);

hr = ADsOpenObject(szPath,
NULL,
NULL,
ADS_SECURE_AUTHENTICATION,
IID_IDirectorySearch,
(void**)&pSchemaNC);

delete [] szPath;

if (SUCCEEDED(hr))
{
wprintf(L"Find non-replicated attributes\n");

// Create search filter to find attributes with systemFlags that


// match ADS_SYSTEMFLAG_ATTR_NOT_REPLICATED
nLength = wcslen(pszSearchFilterTemplate) + 25 + 1;
pszSearchFilter = new WCHAR[nLength];
swprintf_s(pszSearchFilter, pszSearchFilterTemplate,
ADS_SYSTEMFLAG_ATTR_NOT_REPLICATED);

// Attributes are one-level deep in the schema container


// so only need to search one level.
ADS_SEARCHPREF_INFO SearchPrefs;
SearchPrefs.dwSearchPref = ADS_SEARCHPREF_SEARCH_SCOPE;
SearchPrefs.vValue.dwType = ADSTYPE_INTEGER;
SearchPrefs.vValue.Integer = ADS_SCOPE_ONELEVEL;
DWORD dwNumPrefs = 1;

// COL for iterations.


ADS_SEARCH_COLUMN col;

// Handle used for searching.


ADS_SEARCH_HANDLE hSearch;

IADs *pObj = NULL;


IADs * pIADs = NULL;

// Set the search preference.


hr = pSchemaNC->SetSearchPreference( &SearchPrefs, dwNumPrefs);
if (FAILED(hr))
{
return hr;
}

CONST DWORD dwAttrNameSize = 1;


LPOLESTR pszAttribute[dwAttrNameSize];
pszAttribute[0] = L"cn";

// Execute the search.


hr = pSchemaNC->ExecuteSearch(pszSearchFilter,
pszAttribute,
dwAttrNameSize,
&hSearch );
delete [] pszSearchFilter;
if ( SUCCEEDED(hr) )
{
// Call IDirectorySearch::GetNextRow() to retrieve
// the next row of data.
while( pSchemaNC->GetNextRow( hSearch) != S_ADS_NOMORE_ROWS)
{
// Loop through the array of passed column names,
// print the data for each column.
for (DWORD x = 0; x < dwAttrNameSize; x++)
{
// Get the data for this column.
hr = pSchemaNC->GetColumn( hSearch,
pszAttribute[x],
&col );
if ( SUCCEEDED(hr) )
{
// Print the data for the column and
// free the column.
if (col.dwADsType == ADSTYPE_CASE_IGNORE_STRING)
{
wprintf(L"%s: %s\r\n",
pszAttribute[x],
col.pADsValues->CaseIgnoreString);
}
else
{
wprintf(L"<%s property is not a string>",
pszAttribute[x]);
}

pSchemaNC->FreeColumn( &col );
}
}
}

// Close the search handle to clean up.


pSchemaNC->CloseSearchHandle(hSearch);
}
}
}

pObject->Release();
}

CoUninitialize(); // uninitialize COM.

Requisitos
Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Enumerações ADSI

Idirectorysearch

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


ADS_USER_FLAG_ENUM enumeração
(iads.h)
Artigo24/08/2023

A enumeração ADS_USER_FLAG_ENUM define os sinalizadores usados para definir as


propriedades do usuário no diretório . Esses sinalizadores correspondem aos valores do
atributo userAccountControl no Active Directory ao usar o provedor LDAP e o atributo
userFlags ao usar o provedor do sistema WinNT.

Syntax
C++

typedef enum ADS_USER_FLAG {


ADS_UF_SCRIPT = 0x1,
ADS_UF_ACCOUNTDISABLE = 0x2,
ADS_UF_HOMEDIR_REQUIRED = 0x8,
ADS_UF_LOCKOUT = 0x10,
ADS_UF_PASSWD_NOTREQD = 0x20,
ADS_UF_PASSWD_CANT_CHANGE = 0x40,
ADS_UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED = 0x80,
ADS_UF_TEMP_DUPLICATE_ACCOUNT = 0x100,
ADS_UF_NORMAL_ACCOUNT = 0x200,
ADS_UF_INTERDOMAIN_TRUST_ACCOUNT = 0x800,
ADS_UF_WORKSTATION_TRUST_ACCOUNT = 0x1000,
ADS_UF_SERVER_TRUST_ACCOUNT = 0x2000,
ADS_UF_DONT_EXPIRE_PASSWD = 0x10000,
ADS_UF_MNS_LOGON_ACCOUNT = 0x20000,
ADS_UF_SMARTCARD_REQUIRED = 0x40000,
ADS_UF_TRUSTED_FOR_DELEGATION = 0x80000,
ADS_UF_NOT_DELEGATED = 0x100000,
ADS_UF_USE_DES_KEY_ONLY = 0x200000,
ADS_UF_DONT_REQUIRE_PREAUTH = 0x400000,
ADS_UF_PASSWORD_EXPIRED = 0x800000,
ADS_UF_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION = 0x1000000
} ADS_USER_FLAG_ENUM;

Constantes

ADS_UF_SCRIPT
Valor: 0x1
O script de logon é executado. Esse sinalizador não funciona para o provedor LDAP ADSI em
leitura ou gravação
. Para o provedor ADSI WinNT, esse sinalizador são dados somente leitura e não podem ser
definidos para o usuário
banco de dados.

ADS_UF_ACCOUNTDISABLE
Valor: 0x2
A conta de usuário está desabilitada.

ADS_UF_HOMEDIR_REQUIRED
Valor: 0x8
O diretório base é necessário.

ADS_UF_LOCKOUT
Valor: 0x10
No momento, a conta está bloqueada.

ADS_UF_PASSWD_NOTREQD
Valor: 0x20
Nenhuma senha é necessária.

ADS_UF_PASSWD_CANT_CHANGE
Valor: 0x40
O usuário não pode alterar a senha. Esse sinalizador pode ser lido, mas não definido diretamente.
Para obter mais informações e
um exemplo de código que mostra como impedir que um usuário altere a senha, consulte
O usuário não pode alterar a senha.

ADS_UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED
Valor: 0x80
O usuário pode enviar uma senha criptografada.

ADS_UF_TEMP_DUPLICATE_ACCOUNT
Valor: 0x100
Essa é uma conta para usuários cuja conta primária está em outro domínio. Essa conta fornece
acesso do usuário
para esse domínio, mas não para qualquer domínio que confie nesse domínio. Também
conhecido como uma conta de usuário local.

ADS_UF_NORMAL_ACCOUNT
Valor: 0x200
Esse é um tipo de conta padrão que representa um usuário típico.

ADS_UF_INTERDOMAIN_TRUST_ACCOUNT
Valor: 0x800
Essa é uma permissão para confiar em uma conta de um domínio do sistema que confia em
outros domínios.
ADS_UF_WORKSTATION_TRUST_ACCOUNT
Valor: 0x1000
Esta é uma conta de computador para um Windows ou Windows Server que é membro desse
domínio.

ADS_UF_SERVER_TRUST_ACCOUNT
Valor: 0x2000
Essa é uma conta de computador para um controlador de domínio de backup do sistema que é
membro desse domínio.

ADS_UF_DONT_EXPIRE_PASSWD
Valor: 0x10000
Quando definida, a senha não expirará nessa conta.

ADS_UF_MNS_LOGON_ACCOUNT
Valor: 0x20000
Esta é uma conta de logon do MNS (Conjunto de Nós Majoritários). Com o MNS, você pode
configurar um cluster do Windows de vários nós
sem usar um disco compartilhado comum.

ADS_UF_SMARTCARD_REQUIRED
Valor: 0x40000
Quando definido, esse sinalizador forçará o usuário a fazer logon usando uma cartão inteligente.

ADS_UF_TRUSTED_FOR_DELEGATION
Valor: 0x80000
Quando definido, a conta de serviço (conta de usuário ou computador), na qual um serviço é
executado, é confiável para
Delegação kerberos. Qualquer serviço desse tipo pode representar um cliente solicitando o
serviço. Para habilitar um serviço para
Delegação kerberos, defina esse sinalizador na propriedade userAccountControl do
conta de serviço.

ADS_UF_NOT_DELEGATED
Valor: 0x100000
Quando definido, o contexto de segurança do usuário não será delegado a um serviço, mesmo
que a conta de serviço
é definido como confiável para delegação Kerberos.

ADS_UF_USE_DES_KEY_ONLY
Valor: 0x200000
Restrinja essa entidade de segurança a usar apenas tipos de criptografia DES (Data Encryption
Standard) para chaves.

ADS_UF_DONT_REQUIRE_PREAUTH
Valor: 0x400000
Essa conta não requer pré-autenticação Kerberos para logon.
ADS_UF_PASSWORD_EXPIRED
Valor: 0x800000
A senha do usuário expirou. Esse sinalizador é criado pelo sistema usando dados do último
conjunto de senhas
atributo e a política de domínio. Ele é somente leitura e não pode ser definido. Para definir
manualmente uma senha de usuário como expirada,
usar a função NetUserSetInfo com o
USER_INFO_3
(usri3_password_expired membro) ou
USER_INFO_4
Estrutura (usri4_password_expired membro).

ADS_UF_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION
Valor: 0x1000000
A conta está habilitada para delegação. Essa é uma configuração sensível à segurança; contas com
essa opção
habilitado deve ser estritamente controlado. Essa configuração permite que um serviço em
execução na conta assuma um
identidade do cliente e autenticar como esse usuário para outros servidores remotos na rede.

Comentários
Para obter mais informações, consulte Gerenciando usuários.

Para obter mais informações e um exemplo de código que mostra como definir o valor
ADS_UF_DONT_EXPIRE_PASSWD em um atributo userAccountControl de usuário,
consulte Password Never Expires.

Nota Como o VBScript não pode ler dados de uma biblioteca de tipos, os
aplicativos VBScript não entendem as constantes simbólicas, conforme definido
acima. Em vez disso, use as constantes numéricas para definir os sinalizadores
apropriados em seus aplicativos VBScript. Para usar as constantes simbólicas como
uma boa prática de programação, crie declarações explícitas dessas constantes,
conforme feito aqui, em seus aplicativos VBScript.

Requisitos

Cliente mínimo com suporte Windows Vista


Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Enumerações ADSI

Gerenciando usuários

NetUserGetInfo

Comentários
Esta página foi útil?  Yes  No
ADSI_DIALECT_ENUM enumeração
(iads.h)
Artigo24/08/2023

A enumeração ADSI_DIALECT_ENUM especifica dialetos de consulta usados no


provedor OLE DB para ADSI.

Syntax
C++

typedef enum __MIDL___MIDL_itf_ads_0000_0000_0023 {


ADSI_DIALECT_LDAP = 0,
ADSI_DIALECT_SQL = 0x1
} ADSI_DIALECT_ENUM;

Constantes

ADSI_DIALECT_LDAP
Valor: 0
As consultas ADSI são baseadas no dialeto LDAP.

ADSI_DIALECT_SQL
Valor: 0x1
As consultas ADSI são baseadas no dialeto SQL.

Comentários
Um cliente do ADO (ActiveX Data Object) pode usar um dos dois dialetos de consulta
ADSI para consultar um diretório. Para obter mais informações sobre os dialetos de
consulta ADSI, consulte Pesquisando com objetos de dados ActiveX.

Nota Como o Visual Basic Script (VBScript) não pode ler dados de uma biblioteca
de tipos, os aplicativos VBScript não reconhecem as constantes simbólicas
conforme definido acima. Use as constantes numéricas para definir os sinalizadores
apropriados em seus aplicativos VBScript. Para usar as constantes simbólicas como
uma boa prática de programação, escreva declarações explícitas dessas constantes,
conforme feito aqui.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Enumerações ADSI

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Enumeração ADSTYPEENUM (iads.h)
Artigo24/08/2023

A enumeração ADSTYPEENUM é usada para identificar o tipo de dados de um valor de


propriedade ADSI.

Syntax
C++

typedef enum __MIDL___MIDL_itf_ads_0000_0000_0001 {


ADSTYPE_INVALID = 0,
ADSTYPE_DN_STRING,
ADSTYPE_CASE_EXACT_STRING,
ADSTYPE_CASE_IGNORE_STRING,
ADSTYPE_PRINTABLE_STRING,
ADSTYPE_NUMERIC_STRING,
ADSTYPE_BOOLEAN,
ADSTYPE_INTEGER,
ADSTYPE_OCTET_STRING,
ADSTYPE_UTC_TIME,
ADSTYPE_LARGE_INTEGER,
ADSTYPE_PROV_SPECIFIC,
ADSTYPE_OBJECT_CLASS,
ADSTYPE_CASEIGNORE_LIST,
ADSTYPE_OCTET_LIST,
ADSTYPE_PATH,
ADSTYPE_POSTALADDRESS,
ADSTYPE_TIMESTAMP,
ADSTYPE_BACKLINK,
ADSTYPE_TYPEDNAME,
ADSTYPE_HOLD,
ADSTYPE_NETADDRESS,
ADSTYPE_REPLICAPOINTER,
ADSTYPE_FAXNUMBER,
ADSTYPE_EMAIL,
ADSTYPE_NT_SECURITY_DESCRIPTOR,
ADSTYPE_UNKNOWN,
ADSTYPE_DN_WITH_BINARY,
ADSTYPE_DN_WITH_STRING
} ADSTYPEENUM;

Constantes
ADSTYPE_INVALID
Valor: 0
O tipo de dados não é válido

ADSTYPE_DN_STRING
A cadeia de caracteres é de Nome Diferenciado (caminho) de um objeto de serviço de diretório.

ADSTYPE_CASE_EXACT_STRING
A cadeia de caracteres é do tipo que diferencia maiúsculas de minúsculas.

ADSTYPE_CASE_IGNORE_STRING
A cadeia de caracteres não diferencia maiúsculas de minúsculas.

ADSTYPE_PRINTABLE_STRING
A cadeia de caracteres é exibida na tela ou na impressão.

ADSTYPE_NUMERIC_STRING
A cadeia de caracteres é de um numeral a ser interpretado como texto.

ADSTYPE_BOOLEAN
Os dados são de um valor booliano.

ADSTYPE_INTEGER
Os dados são de um valor inteiro.

ADSTYPE_OCTET_STRING
A cadeia de caracteres é de uma matriz de bytes.

ADSTYPE_UTC_TIME
Os dados são do tempo universal, conforme expresso na Coordenada de Tempo Universal (UTC).

ADSTYPE_LARGE_INTEGER
Os dados são de um valor inteiro longo.

ADSTYPE_PROV_SPECIFIC
A cadeia de caracteres é de uma cadeia de caracteres específica do provedor.

ADSTYPE_OBJECT_CLASS
Não usado.

ADSTYPE_CASEIGNORE_LIST
Os dados são de uma lista de cadeias de caracteres que não diferenciam maiúsculas de
minúsculas.

ADSTYPE_OCTET_LIST
Os dados são de uma lista de cadeias de caracteres de octeto.

ADSTYPE_PATH
A cadeia de caracteres é de um caminho de diretório.
ADSTYPE_POSTALADDRESS
A cadeia de caracteres é do tipo de endereço postal.

ADSTYPE_TIMESTAMP
Os dados são de um carimbo de data/hora em segundos.

ADSTYPE_BACKLINK
A cadeia de caracteres é de um link de fundo.

ADSTYPE_TYPEDNAME
A cadeia de caracteres é de um nome tipado.

ADSTYPE_HOLD
Os dados são da estrutura de dados Hold.

ADSTYPE_NETADDRESS
A cadeia de caracteres é de um endereço líquido.

ADSTYPE_REPLICAPOINTER
Os dados são de um ponteiro réplica.

ADSTYPE_FAXNUMBER
A cadeia de caracteres é de um número de fax.

ADSTYPE_EMAIL
Os dados são de uma mensagem de email.

ADSTYPE_NT_SECURITY_DESCRIPTOR
Os dados são um descritor de segurança do Windows representado por uma matriz de bytes.

ADSTYPE_UNKNOWN
Os dados são de um tipo indefinido.

ADSTYPE_DN_WITH_BINARY
Os dados são de ADS_DN_WITH_BINARY usados para mapear um nome diferenciado para um
GUID sem consulta. Para obter mais informações, consulte Comentários.

ADSTYPE_DN_WITH_STRING
Os dados são de ADS_DN_WITH_STRING usados para mapear um nome diferenciado para um
valor de cadeia de caracteres sem consulta. Para obter mais informações, consulte Comentários.

Comentários
Ao estender o esquema do active directory para adicionar ADS_DN_WITH_BINARY, você
também deve especificar a definição de atributo "otherWellKnownGuid". Adicione o
seguinte à definição do atributo de arquivo ldf: "omObjectClass:: KoZIhvcUAQEBCw=="
Ao estender o esquema do active directory para adicionar ADS_DN_WITH_STRING, você
também deve especificar a definição de atributo "otherWellKnownGuid". Adicione o
seguinte à definição do atributo de arquivo ldf: "omObjectClass:: KoZIhvcUAQEBDA=="

Como o VBScript não pode ler dados de uma biblioteca de tipos, os aplicativos VBScript
não reconhecem constantes simbólicas, conforme definido acima. Em vez disso, use as
constantes numéricas para definir os sinalizadores apropriados em seu aplicativo
VBScript. Para usar as constantes simbólicas como uma boa prática de programação,
escreva declarações explícitas dessas constantes, como feito aqui, em seu aplicativo
VBScript.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Cabeçalho iads.h

Confira também
Enumerações ADSI

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Funções ADSI
Artigo • 13/06/2023

As Interfaces de Serviço do Active Directory expõem as seguintes funções auxiliares a


clientes que não usam a Automação.

Função Descrição

ADsBuildEnumerator Cria um objeto enumerador para o objeto de contêiner ADSI


especificado.

ADsBuildVarArrayInt Cria uma matriz variante de uma matriz de DWORDs.

ADsBuildVarArrayStr Cria uma matriz variante de uma matriz de cadeias de caracteres


Unicode.

ADsEncodeBinaryData Converte um blob de dados binários no formato adequado para um


filtro de pesquisa.

ADsEnumerateNext Preenche uma matriz variante com elementos recuperados do objeto


enumerador especificado.

ADsFreeEnumerator Libera um objeto enumerador criado anteriormente pelo


ADsBuildEnumerator.

ADsGetLastError Recupera o último valor de código de erro do thread de chamada.

ADsGetObject Associa a um objeto ADSI usando as credenciais atuais.

ADsOpenObject Associa a um objeto ADSI usando credenciais especificadas

ADsSetLastError Define o valor do código de erro do thread de chamada.

AllocADsMem Aloca um bloco de memória.

AllocADsStr Aloca memória para uma determinada cadeia de caracteres.

FreeADsMem Libera a memória alocada por AllocADsMem.

FreeADsStr Libera a memória alocada para a cadeia de caracteres fornecida.

ReallocADsMem Atribui o conteúdo de memória existente a um local de memória recém-


criado.

ReallocADsStr Substitui uma cadeia de caracteres existente por uma nova.

As seguintes funções ADSI são obsoletas.


Função Descrição

AdsFreeAllErrorRecords Obsoleto.

AdsDecodeBinaryData Obsoleto.

PropVariantToAdsType Obsoleto.

AdsTypeToPropVariant Obsoleto.

AdsFreeAdsValues Obsoleto.

InitAdsMem Obsoleto.

AssertAdsmemLeaks Obsoleto.

DumpMemorytracker Obsoleto.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Função ADsBuildEnumerator (adshlp.h)
Artigo14/03/2023

A função ADsBuildEnumerator cria um objeto enumerador para o objeto de contêiner


ADSI especificado.

Sintaxe
C++

HRESULT ADsBuildEnumerator(
[in] IADsContainer *pADsContainer,
[out] IEnumVARIANT **ppEnumVariant
);

Parâmetros
[in] pADsContainer

Tipo: IADsContainer*

Ponteiro para a interface IADsContainer do objeto a ser enumerado.

[out] ppEnumVariant

Tipo: IEnumVARIANT**

Ponteiro para um ponteiro de interface IEnumVARIANT que recebe o objeto


enumerador criado para o objeto de contêiner especificado.

Valor retornado
Tipo: HRESULT

Esse método dá suporte aos valores de retorno HRESULT padrão, incluindo S_OK para
uma operação bem-sucedida. Para obter mais informações sobre outros valores
retornados, consulte Códigos de erro ADSI.

Comentários
A função auxiliar ADsBuildEnumerator encapsula as chamadas usadas para recuperar a
interface IEnumVARIANT no objeto enumerador.

Para enumerar os objetos disponíveis em um contêiner

1. Chame a função ADsBuildEnumerator para criar um objeto IEnumVARIANT que


enumerará o conteúdo do contêiner.
2. Chame a função ADsEnumerateNext quantas vezes forem necessárias para
recuperar os itens do objeto enumerador.
3. Chame a função ADSFreeEnumerator para liberar o objeto enumerador quando ele
não for mais necessário.

Se o servidor der suporte a pesquisas paginadas e o cliente tiver especificado um


tamanho de página que exceda o máximo de resultados de pesquisa permitidos pelo
servidor, a função ADsBuildEnumerator encaminhará erros e resultados do servidor
para o usuário.

Exemplos
O exemplo de código a seguir mostra como as funções ADsBuildEnumerator,
ADsEnumerateNext e ADSFreeEnumerator podem ser usadas para enumerar o conteúdo
de um contêiner.

C++

HRESULT PrintAllObjects(IADsContainer* pContainer)


{
HRESULT hr;

if(NULL == pContainer)
{
return E_INVALIDARG;
}

IEnumVARIANT *pEnum = NULL;

// Create an enumerator object in the container.


hr = ADsBuildEnumerator(pContainer, &pEnum);
if(SUCCEEDED(hr))
{
VARIANT var;
ULONG ulFetched = 0L;

// Get the next contained object.


while(S_OK == (hr = ADsEnumerateNext(pEnum, 1, &var, &ulFetched)) &&
(ulFetched > 0))
{
IADs *pADs;
// Print the object
hr = V_DISPATCH(&var)->QueryInterface(IID_IADs, (void**)&pADs);
if(SUCCEEDED(hr))
{
CComBSTR sbstr;
IADsContainer *pChildContainer;

hr = pADs->get_Name(&sbstr);
if(SUCCEEDED(hr))
{
wprintf(sbstr);
wprintf(L"\n");
}

hr = pADs->QueryInterface(IID_IADsContainer,
(void**)&pChildContainer);
if(SUCCEEDED(hr))
{
// If the retrieved object is a container, recursively
print its contents as well.
PrintAllObjects(pChildContainer);
}

pADs->Release();
}

// Release the VARIANT.


VariantClear(&var);
}

ADsFreeEnumerator(pEnum);
}

return hr;
}

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho adshlp.h

Biblioteca Activeds.lib
DLL Activeds.dll

Confira também
Códigos de erro ADSI

Funções ADSI

ADsEnumerateNext

ADsFreeEnumerator

IADsContainer

IEnumVARIANT

Comentários
Esta página foi útil?  Yes  No
Função ADsBuildVarArrayInt (adshlp.h)
Artigo22/08/2023

A função ADsBuildVarArrayInt cria uma matriz variante de inteiros de uma matriz de


valores DWORD .

Sintaxe
C++

HRESULT ADsBuildVarArrayInt(
[in] LPDWORD lpdwObjectTypes,
[in] DWORD dwObjectTypes,
[out] VARIANT *pVar
);

Parâmetros
[in] lpdwObjectTypes

Tipo: LPDWORD

Matriz de valores DWORD .

[in] dwObjectTypes

Tipo: DWORD

Número de entradas DWORD na matriz fornecida.

[out] pVar

Tipo: VARIANT*

Ponteiro para a matriz variante resultante de inteiros.

Valor retornado
Tipo: HRESULT

Esse método dá suporte a valores retornados padrão.


Para obter mais informações sobre outros valores retornados, consulte Códigos de erro
ADSI.

Comentários
Use a função ADsBuildVarArrayInt para converter a matriz de inteiros em uma matriz
variante dos inteiros. O exemplo de código a seguir mostra como fazer isso.

C++

DWORD dwArray[]={0,1,2,3,4};
long nLength = sizeof(dwArray)/sizeof(DWORD);
VARIANT varArray[nLength];
HRESULT hr = ADsBuildVarArrayInt(dwArray, nLength, varArray);
if (hr = E_FAIL) exit(1);

// Resume work with the data in varArray.


. . .

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho adshlp.h

Biblioteca Activeds.lib

DLL Activeds.dll

Confira também
Códigos de erro ADSI

Funções ADSI

ADsBuildVarArrayStr
Comentários
Esta página foi útil?  Yes  No
Função ADsBuildVarArrayStr (adshlp.h)
Artigo22/08/2023

A função ADsBuildVarArrayStr cria uma matriz variante de uma matriz de cadeias de


caracteres Unicode.

Sintaxe
C++

HRESULT ADsBuildVarArrayStr(
[in] LPWSTR *lppPathNames,
[in] DWORD dwPathNames,
[out] VARIANT *pVar
);

Parâmetros
[in] lppPathNames

Tipo: LPWSTR*

Matriz de cadeias de caracteres Unicode terminadas em nulo.

[in] dwPathNames

Tipo: DWORD

Número de entradas Unicode na matriz fornecida.

[out] pVar

Tipo: VARIANT*

Ponteiro para a matriz variante resultante.

Valor retornado
Tipo: HRESULT

Esse método dá suporte aos valores retornados padrão, bem como aos seguintes.
Para obter mais informações sobre outros valores retornados, consulte Códigos de erro
ADSI.

Comentários
Para dar suporte à Automação, use a função ADsBuildVarArrayStr para converter
cadeias de caracteres Unicode em uma matriz variante de cadeias de caracteres.

Exemplos
O exemplo de código a seguir mostra como usar a função ADsBuildVarArrayStr para
converter nomes de classe de objeto de cadeias de caracteres Unicode em uma matriz
variante de cadeias de caracteres.

C++

HRESULT EnumObject(LPWSTR pszADsPath,


LPWSTR * lppClsNames,
DWORD dwClsNames)
{
ULONG ulFetched = 0L;
IEnumVARIANT * pEnumVar = NULL;
VARIANT varFilter, varArray[MAX_ADS_ENUM];
HRESULT hr;
IADsContainer * pADsContainer = NULL;
DWORD dwObjects = 0, dwEnumCount=0, i=0;
BSTR bstrName;
BOOL fContinue=TRUE;

hr = ADsGetObject(pszADsPath,
IID_IADsContainer,
(void**)&pADsContainer);
if (FAILED(hr)) goto cleanup;

// Create a string array of class names as search filters.


VariantInit(&varFilter);
hr = ADsBuildVarArrayStr(lppClsNames, dwClsNames, &varFilter);
if (FAILED(hr)) goto cleanup;

// Apply filters to objects in the container.


hr = pADsContainer->put_Filter(varFilter);
if(FAILED(hr)) goto cleanup;

// Create an enumerator.
hr = ADsBuildEnumerator(pADsContainer, &pEnumVar);
if(FAILED(hr)) goto cleanup;

// Enumerate the objects and print the names.


while(fContinue) {
IADs* pObject;
hr = ADsEnumerateNext(pEnumVar, MAX_ADS_ENUM,
varArray, &ulFetched);
if(hr == S_FALSE) fContinue = FALSE;
dwEEnumCount++;

for (i=0; i<ulFetched; i++) {


IDispatch *pDispatch = NULL;
pDispatch = varArray[I].pDispVal;
hr = pDispatch->QueryInterface(IID_IADs,
(void**) &pObject);
if (FAILED(hr)) goto cleanup;

hr = pObject->get_Name(&bstrName);
if(FAILED(hr)) goto cleanup;
printf(" Object name: %S\n",bstrName);

// Release the ADSI object.


SysFreeString(bstrname);
pObject->Release();
pDispatch->Release();
}
memset(varArray, 0, sizeof(VARIANT)*MAX_ADS_ENUM);
dwObjects += ulFetched;
}
hr = S_OK;

cleanup:
if(bstrName) SysFreeString(bstrName);
if(pEnumvar) ADsFreeEnumerator(pEnumVar);
if(pADsContainer) pADsContainer->Release();

return (hr);
}

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho adshlp.h

Biblioteca Activeds.lib

DLL Activeds.dll
Confira também
Códigos de erro ADSI

Funções ADSI

ADsBuildVarArrayInt

Comentários
Esta página foi útil?  Yes  No
Função ADsEncodeBinaryData
(adshlp.h)
Artigo22/08/2023

A função ADsEncodeBinaryData converte um BLOB (objeto binário grande) no formato


Unicode adequado para ser inserido em um filtro de pesquisa.

Sintaxe
C++

HRESULT ADsEncodeBinaryData(
[in] PBYTE pbSrcData,
[in] DWORD dwSrcLen,
[out] LPWSTR *ppszDestData
);

Parâmetros
[in] pbSrcData

Tipo: PBYTE

BLOB a ser convertido.

[in] dwSrcLen

Tipo: DWORD

Tamanho, em bytes, do BLOB.

[out] ppszDestData

Tipo: LPWSTR*

Ponteiro para uma cadeia de caracteres Unicode terminada em nulo que recebe os
dados convertidos.

Valor retornado
Tipo: HRESULT
Esse método dá suporte aos valores retornados padrão, bem como aos seguintes.

Comentários
No ADSI, os filtros de pesquisa devem ser cadeias de caracteres Unicode. Às vezes, um
filtro contém dados que normalmente são representados por um BLOB opaco de dados.
Por exemplo, talvez você queira incluir um identificador de segurança de objeto em um
filtro de pesquisa, que é de dados binários. Nesse caso, você deve primeiro chamar a
função ADsEncodeBinaryData para converter os dados binários no formato de cadeia
de caracteres Unicode. Quando os dados não forem mais necessários, chame a função
FreeADsMem para liberar a cadeia de caracteres Unicode convertida; ou seja,
ppszDestData.

A função ADsEncodeBinaryData não codifica valores de bytes que representam


caracteres alfanuméricos. Em vez disso, ele colocará o caractere na cadeia de caracteres
sem codificar. Isso resulta na cadeia de caracteres que contém uma mistura de
caracteres codificados e não codificados. Por exemplo, se os dados binários forem
0x05|0x1A|0x1B|0x43|0x32, a cadeia de caracteres codificada conterá "\05\1A\1BC2". Isso
não tem efeito sobre o filtro e os filtros de pesquisa funcionarão corretamente com
esses tipos de cadeias de caracteres.

Exemplos

O exemplo de código a seguir mostra como usar essa função.

C++

// Test binary values in filters and use


// a binary filter instead of a string filter in ExecuteSearch.

LPWSTR pszPrefix = L"objectSid=%s";


LPWSTR pszBinaryFilter = NULL;
LPWSTR pszDest = NULL;
HRESULT hr = S_OK;

BYTE column[] = {
0x01, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x15, 0x00,
0x00, 0x00, 0x59, 0x51, 0xb8, 0x17, 0x66, 0x72, 0x5d, 0x25,
0x64, 0x63, 0x3b, 0x0b, 0x29, 0x99, 0x21, 0x00 };

DWORD dwSize = sizeof(column)/sizeof(BYTE);

hr = ADsEncodeBinaryData (
column,
dwSize,
&pszDest
);

if(hr==S_OK)
{
dwSize = wcslen(pszPrefix) + wcslen(pszDest) + 1;
pszBinaryFilter = new WCHAR[dwSize];
sprintf_s(pszBinaryFilter,pszPrefix,pszDest);
}
else
{
return hr;
}

// Perform the search with the pszDest as the filter string. Code omitted.
. . .
// Done with the search and free the converted string.
FreeADsMem( pszDest );

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho adshlp.h

Biblioteca Activeds.lib

DLL Activeds.dll; AdsLdpc.dll

Confira também
Códigos de erro ADSI

Funções ADSI

FreeADsMem

Comentários
Esta página foi útil?  Yes  No
Função ADsEnumerateNext (adshlp.h)
Artigo22/08/2023

A função ADsEnumerateNext enumera por meio de um número especificado de


elementos da posição atual do cursor do enumerador. Quando a operação for bem-
sucedida, a função retornará o conjunto enumerado de elementos em uma matriz
variante. O número de elementos retornados pode ser menor que o número
especificado.

Sintaxe
C++

HRESULT ADsEnumerateNext(
[in] IEnumVARIANT *pEnumVariant,
[in] ULONG cElements,
[out] VARIANT *pvar,
[out] ULONG *pcElementsFetched
);

Parâmetros
[in] pEnumVariant

Tipo: IEnumVARIANT*

Ponteiro para a interface IEnumVARIANT no objeto enumerador.

[in] cElements

Tipo: ULONG

Número de elementos solicitados.

[out] pvar

Tipo: VARIANT*

Ponteiro para a matriz de elementos recuperados.

[out] pcElementsFetched

Tipo: ULONG*
Número real de elementos recuperados, que podem ser menores do que o número de
elementos solicitados.

Valor retornado
Tipo: HRESULT

Esse método dá suporte aos valores de retorno padrão.

Para obter mais informações sobre outros valores retornados, consulte Códigos de erro
ADSI.

Comentários
O processo geral para enumerar objetos em um contêiner envolve o seguinte:

Primeiro, crie um objeto enumerador nesse contêiner.

Em segundo lugar, recupere o ponteiro da interface IEnumVARIANT .

Em terceiro lugar, chame a função ADsEnumerateNext para retornar um conjunto


enumerado de elementos do objeto enumerador.

Em quarto lugar, chame a função ADSFreeEnumerator para liberar o objeto enumerador.

Para obter mais informações e um exemplo de código, consulte o tópico


ADsBuildEnumerator .

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho adshlp.h

Biblioteca Activeds.lib

DLL Activeds.dll
Confira também
Códigos de erro ADSI

Funções ADSI

ADsBuildEnumerator

ADsFreeEnumerator

FreeADsMem

IEnumVARIANT

Comentários
Esta página foi útil?  Yes  No
Função ADsFreeEnumerator (adshlp.h)
Artigo22/08/2023

A função ADsFreeEnumerator libera um objeto enumerador criado com a função


ADsBuildEnumerator .

Sintaxe
C++

HRESULT ADsFreeEnumerator(
[in] IEnumVARIANT *pEnumVariant
);

Parâmetros
[in] pEnumVariant

Tipo: IEnumVARIANT*

Ponteiro para a interface IEnumVARIANT no objeto enumerador a ser liberado.

Valor retornado
Tipo: HRESULT

Esse método dá suporte a valores retornados padrão, bem como aos seguintes.

Comentários
O processo geral para enumerar objetos em um contêiner é o seguinte.

Primeiro, crie um objeto enumerador nesse contêiner.

Em segundo lugar, recupere o ponteiro da interface IEnumVARIANT .

Em terceiro lugar, chame a função ADsEnumerateNext para retornar um conjunto


enumerado de elementos do objeto enumerador.

Em quarto lugar, chame a função ADSFreeEnumerator para liberar o objeto


enumerador.
Para obter mais informações e um exemplo de código, consulte ADsBuildEnumerator.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho adshlp.h

Biblioteca Activeds.lib

DLL Activeds.dll

Confira também
Códigos de erro ADSI

Funções ADSI

ADsBuildEnumerator

ADsEnumerateNext

IEnumVARIANT

Comentários
Esta página foi útil?  Yes  No
Função ADsGetLastError (adshlp.h)
Artigo14/03/2023

A função ADsGetLastError recupera o valor do código de último erro do thread de


chamada.

Sintaxe
C++

HRESULT ADsGetLastError(
[out] LPDWORD lpError,
[out] LPWSTR lpErrorBuf,
[in] DWORD dwErrorBufLen,
[out] LPWSTR lpNameBuf,
[in] DWORD dwNameBufLen
);

Parâmetros
[out] lpError

Tipo: LPDWORD

Ponteiro para o local que recebe o código de erro.

[out] lpErrorBuf

Tipo: LPWSTR

Ponteiro para o local que recebe a cadeia de caracteres Unicode terminada em nulo que
descreve o erro.

[in] dwErrorBufLen

Tipo: DWORD

Tamanho, em caracteres, do buffer lpErrorBuf . Se o buffer for muito pequeno para


receber a cadeia de caracteres de erro, a cadeia de caracteres será truncada, mas ainda
terminada em nulo. Um buffer, de pelo menos 256 bytes, é recomendado.

[out] lpNameBuf
Tipo: LPWSTR

Ponteiro para o local que recebe a cadeia de caracteres Unicode terminada em nulo que
descreve o nome do provedor que gerou o erro.

[in] dwNameBufLen

Tipo: DWORD

Tamanho, em caracteres, do buffer lpNameBuf . Se o buffer for muito pequeno para


receber o nome do provedor, a cadeia de caracteres será truncada, mas ainda terminada
em nulo.

Valor retornado
Tipo: HRESULT

Esse método dá suporte a valores retornados padrão, bem como aos seguintes.

Comentários
Os erros adsi se enquadram em dois tipos de acordo com os valores de seu código de
instalação. Os códigos de erro ADSI padrão têm um valor de código de instalação de
0x5 e os códigos de erro ADSI estendidos pressupõem que de FACILITY_WIN32. Os
valores de erro dos códigos de erro ADSI padrão e estendidos são das formas
0x80005xxx e 0x8007xxxx, respectivamente. Use a macro HRESULT_FACILITY(hr) para
determinar o tipo de erro ADSI.

Nota O provedor WinNT ADSI não dá suporte a ADsGetLastError.

O exemplo de código a seguir mostra como obter códigos de erro win32 e suas
descrições usando ADsGetLastError.

C++

if (FAILED(hr))
{
wprintf(L"An error occurred.\n HRESULT: %x\n",hr);
// If facility is Win32, get the Win32 error
if (HRESULT_FACILITY(hr)==FACILITY_WIN32)
{
DWORD dwLastError;
WCHAR szErrorBuf[MAX_PATH];
WCHAR szNameBuf[MAX_PATH];
// Get extended error value.
HRESULT hr_return =S_OK;
hr_return = ADsGetLastError( &dwLastError,
szErrorBuf,
MAX_PATH,
szNameBuf,
MAX_PATH);
if (SUCCEEDED(hr_return))
{
wprintf(L"Error Code: %d\n Error Text: %ws\n Provider: %ws\n",
dwLastError, szErrorBuf, szNameBuf);
}
}
}

Se hr for 80071392, o exemplo de código retornará o seguinte.

C++

An error occurred.
HRESULT: 80071392
Error Code: 8305
Error Text: 00002071: UpdErr: DSID-030502F1, problem 6005
(ENTRY_EXISTS), data 0
Provider: LDAP Provider

Nota O provedor WinNT ADSI não dá suporte a ADsGetLastError.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho adshlp.h

Biblioteca Activeds.lib

DLL Activeds.dll; AdsLdpc.dll


Confira também
Códigos de erro ADSI

Funções ADSI

ADsSetLastError

Obter Último Erro

Comentários
Esta página foi útil?  Yes  No
Função ADsGetObject (adshlp.h)
Artigo22/08/2023

A função ADsGetObject se associa a um objeto dado seu caminho e um identificador de


interface especificado.

Sintaxe
C++

HRESULT ADsGetObject(
[in] LPCWSTR lpszPathName,
[in] REFIID riid,
[out] VOID **ppObject
);

Parâmetros
[in] lpszPathName

Tipo: LPCWSTR

A cadeia de caracteres Unicode terminada em nulo que especifica o caminho usado


para associar ao objeto no serviço de diretório subjacente. Para obter mais informações
e exemplos de código para cadeias de caracteres de associação para esse parâmetro,
consulte LDAP ADsPath e WinNT ADsPath.

[in] riid

Tipo: REFIID

Identificador de interface para uma interface especificada neste objeto.

[out] ppObject

Tipo: VOID**

Ponteiro para um ponteiro para a Interface solicitada.

Valor retornado
Tipo: HRESULT
Esse método dá suporte aos valores de retorno HRESULT padrão, bem como aos
seguintes.

Para obter mais informações sobre outros valores retornados, consulte Códigos de erro
ADSI.

Comentários
Um cliente C/C++ chama a função auxiliar ADsGetObject para associar a um objeto
ADSI. É equivalente a um cliente do Visual Basic que chama a função GetObject . Ambos
tomam um ADsPath como entrada e retornam um ponteiro para a interface solicitada.
Por padrão, a associação usa ADS_SECURE_AUTHENTICATION opção com o contexto de
segurança do thread de chamada. No entanto, se a autenticação falhar, a associação
segura será rebaixada para uma associação anônima, por exemplo, uma associação
simples sem credenciais de usuário. Para associar com segurança a um objeto ADSI, use
a função ADsOpenObject em vez da função ADsGetObject .

Para obter um exemplo de código que mostra como usar ADsOpenObject, consulte
Binding With GetObject e ADsGetObject.

É possível associar a um objeto ADSI com uma credencial de usuário diferente daquela
do usuário conectado no momento. Para executar essa operação, use a função
ADsOpenObject .

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho adshlp.h

Biblioteca Activeds.lib

DLL Activeds.dll

Confira também
Códigos de erro ADSI
Funções ADSI

ADsOpenObject

Associação com GetObject e ADsGetObject

Comentários
Esta página foi útil?  Yes  No
Função ADsOpenObject (adshlp.h)
Artigo22/08/2023

A função ADsOpenObject se associa a um objeto ADSI usando credenciais explícitas de


nome de usuário e senha. ADsOpenObject é uma função wrapper para
IADsOpenDSObject e é equivalente ao método IADsOpenDSObject::OpenDsObject .

Sintaxe
C++

HRESULT ADsOpenObject(
[in] LPCWSTR lpszPathName,
[in] LPCWSTR lpszUserName,
[in] LPCWSTR lpszPassword,
[in] DWORD dwReserved,
[in] REFIID riid,
[out] void **ppObject
);

Parâmetros
[in] lpszPathName

Tipo: LPCWSTR

A cadeia de caracteres Unicode terminada em nulo que especifica o ADsPath do objeto


ADSI. Para obter mais informações e exemplos de código de cadeias de caracteres de
associação para esse parâmetro, consulte LDAP ADsPath e WinNT ADsPath.

[in] lpszUserName

Tipo: LPCWSTR

A cadeia de caracteres Unicode terminada em nulo que especifica o nome de usuário a


ser fornecido ao serviço de diretório a ser usado para credenciais. Essa cadeia de
caracteres sempre deve estar no formato "<domain\><user name>" para evitar
ambiguidade. Por exemplo, se DomainA e DomainB tiverem uma relação de confiança e
ambos os domínios tiverem um usuário com o nome "user1", não será possível prever
qual domínio ADsOpenObject usará para validar "user1".

[in] lpszPassword
Tipo: LPCWSTR

A cadeia de caracteres Unicode terminada em nulo que especifica a senha a ser


fornecida ao serviço de diretório a ser usada para credenciais.

[in] dwReserved

Tipo: DWORD

Sinalizadores de autenticação específicos do provedor usados para definir as opções de


associação. Para obter mais informações, consulte ADS_AUTHENTICATION_ENUM.

[in] riid

Tipo: REFIID

Identificador de interface para a interface solicitada neste objeto.

[out] ppObject

Tipo: VOID**

Ponteiro para um ponteiro para a interface solicitada.

Valor retornado
Tipo: HRESULT

Esse método dá suporte aos valores de retorno HRESULT padrão, incluindo o seguinte.

Para obter mais informações, consulte Códigos de erro ADSI.

Comentários
Essa função não deve ser usada apenas para validar as credenciais do usuário.

Um cliente C/C++ chama a função auxiliar ADsOpenObject para associar a um objeto


ADSI, usando o nome de usuário e a senha fornecidos como credenciais para o serviço
de diretório apropriado. Se lpszUsername e lpszPassword forem NULL e
ADS_SECURE_AUTHENTICATION estiver definido, ADSI associará ao objeto usando o
contexto de segurança do thread de chamada, que é o contexto de segurança da conta
de usuário sob a qual o aplicativo está em execução ou da conta de usuário cliente
representada pelo thread de chamada.
As credenciais passadas para a função ADsOpenObject são usadas apenas com o objeto
específico associado a e não afetam o contexto de segurança do thread de chamada.
Isso significa que, no exemplo abaixo, a chamada para ADsOpenObject usará
credenciais diferentes da chamada para ADsGetObject.

C++

HRESULT hr;
IADs *padsRoot1;
IADs *padsRoot2;

hr = ADsOpenObject(L"LDAP://rootDSE",
pwszUsername,
pwszPassword,
ADS_SECURE_AUTHENTICATION,
IID_IADs,
(LPVOID*)&padsRoot1);

hr = ADsGetObject(L"LDAP://rootDSE",
IID_IADs,
(LPVOID*)&padsRoot2);

Para trabalhar com o provedor WinNT: , você pode passar lpszUsername como uma das
seguintes cadeias de caracteres:

O nome de uma conta de usuário, ou seja, "jeffsmith".


O nome de usuário estilo Windows, ou seja, "Fabrikam\jeffsmith".

Com o provedor LDAP para Active Directory, você pode passar lpszUsername como uma
das seguintes cadeias de caracteres:

O nome de uma conta de usuário, como "jeffsmith". Para usar um nome de usuário
por si só, você deve definir apenas o sinalizador ADS_SECURE_AUTHENTICATION
no parâmetro dwReserved .
O caminho do usuário de uma versão anterior do Windows, como
"Fabrikam\jeffsmith".
Nome diferenciado, como "CN=Jeff Smith,OU=Sales,DC=Fabrikam,DC=Com". Para
usar um DN, o parâmetro dwReserved deve ser zero ou deve incluir o sinalizador
ADS_USE_SSL .
Nome da entidade de usuário (UPN), como "jeffsmith@Fabrikam.com". Para usar
um UPN, atribua o valor UPN apropriado para o atributo userPrincipalName do
objeto de usuário de destino.

Se a autenticação Kerberos for necessária para a conclusão bem-sucedida de uma


solicitação de diretório específica usando o provedor LDAP, a cadeia de caracteres de
associação lpszPathName deverá usar um ADsPath sem servidor, como "LDAP://CN=Jeff
Smith,CN=admin,DC=Fabrikam,DC=com", ou deve usar um ADsPath com um nome de
servidor DNS totalmente qualificado, como
"LDAP://central3.corp.Fabrikam.com/CN=Jeff Smith, CN=admin,DC=Fabrikam,DC=com".
A associação ao servidor usando um nome NETBIOS simples ou um nome DNS curto,
por exemplo, usando o nome curto "central3" em vez de "central3.corp.Fabrikam.com",
pode ou não gerar a autenticação Kerberos.

O exemplo de código a seguir mostra como associar a um objeto de serviço de diretório


com as credenciais de usuário solicitadas.

C++

IADs *pObject;
LPWSTR szUsername = NULL;
LPWSTR szPassword = NULL
HRESULT hr;

// Insert code to securely retrieve the user name and password.

hr = ADsOpenObject(L"LDAP://CN=Jeff,DC=Fabrikam,DC=com",
"jeffsmith",
"etercespot",
ADS_SECURE_AUTHENTICATION,
IID_IADs,
(void**) &pObject);

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho adshlp.h

Biblioteca Activeds.lib

DLL Activeds.dll

Confira também
Códigos de erro ADSI
Funções ADSI

ADsOpenObject e IADsOpenDSObject::OpenDsObject

Associação

IADsOpenDSObject

IADsOpenDSObject::OpenDsObject

Comentários
Esta página foi útil?  Yes  No
Função ADsSetLastError (adshlp.h)
Artigo22/08/2023

O ADsSetLastError define o valor do código do último erro para o thread de chamada.


Os provedores de serviços de diretório podem usar essa função para definir erros
estendidos. A função salva os dados de erro em uma estrutura de dados por thread.
ADsSetLastError opera semelhante à função SetLastError .

Sintaxe
C++

void ADsSetLastError(
[in] DWORD dwErr,
[in] LPCWSTR pszError,
[in] LPCWSTR pszProvider
);

Parâmetros
[in] dwErr

Tipo: DWORD

O código de erro que ocorreu. Se esse for um erro definido pelo Windows, pszError será
ignorado. Se for ERROR_EXTENDED_ERROR, isso indicará que o provedor tem um erro
específico de rede para relatar.

[in] pszError

Tipo: LPWSTR

A cadeia de caracteres Unicode terminada em nulo que descreve o erro específico da


rede.

[in] pszProvider

Tipo: LPWSTR

A cadeia de caracteres Unicode terminada em nulo que nomeia o provedor ADSI que
gerou o erro.
Valor retornado
Nenhum

Comentários
Em uma implementação personalizada de um provedor ADSI, por exemplo, um
provedor LDAP, você pode definir uma mensagem de erro de operação da seguinte
maneira.

C++

ADsSetLastError(HRESULT_FROM_WIN32(ERROR_DS_OPERATIONS_ERROR),
L"ERROR_DS_OPERATIONS_ERROR",
L"LDAP Provider");

O usuário pode usar o exemplo de código a seguir para examinar esse código de
operação.

C++

DWORD dwLastError;
WCHAR szErrorBuf[MAX_PATH];
WCHAR szNameBuf[MAX_PATH];
// Get extended error value.
HRESULT hr_return =S_OK;
hr_return = ADsGetLastError( &dwLastError,
szErrorBuf,
MAX_PATH,
szNameBuf,
MAX_PATH);
if (SUCCEEDED(hr_return))
{
wprintf(L"Error Code: %d\n Error Text: %ws\n Provider: %ws\n",
dwLastError, szErrorBuf, szNameBuf);
}

O exemplo de código anterior produz a saída a seguir para o código de erro de


operações definido acima.

C++

Error value: 80072020


Error Text: ERROR_DS_OPERATIONS_ERROR
Provider: LDAP Provider
Se você usar ERROR_DS_OPERATIONS_ERROR sem invocar a macro
HRESULT_FROM_WIN32 ao definir o erro, a saída a seguir será retornada.

C++

Error value: 2020


Error Text: ERROR_DS_OPERATIONS_ERROR
Provider: LDAP Provider

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho adshlp.h

Biblioteca Activeds.lib

DLL Activeds.dll

Confira também
Códigos de erro ADSI

Funções ADSI

ADsGetLastError

SetLastError

Comentários
Esta página foi útil?  Yes  No
Função AllocADsMem (adshlp.h)
Artigo22/08/2023

A função AllocADsMem aloca um bloco de memória do tamanho especificado.

Sintaxe
C++

LPVOID AllocADsMem(
[in] DWORD cb
);

Parâmetros
[in] cb

Tipo: DWORD

Contém o tamanho, em bytes, a ser alocado.

Valor retornado
Tipo: LPVOID

Quando bem-sucedida, a função retorna um ponteiro não NULL para a memória


alocada. O chamador deve liberar essa memória quando ela não for mais necessária
passando o ponteiro retornado para FreeADsMem.

Retorna NULL se não for bem-sucedido. Chame ADsGetLastError para obter um erro
estendido status. Para obter mais informações sobre valores de código de erro, consulte
Códigos de erro ADSI.

Comentários
O bloco de memória retornado por AllocADsMem é inicializado como zero.

Para obter mais informações e um exemplo de código que mostra como usar a função
AllocADsMem , consulte ReallocADsMem.
Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho adshlp.h

Biblioteca Activeds.lib

DLL Activeds.dll; AdsLdpc.dll

Confira também
Códigos de erro ADSI

Funções ADSI

ADsGetLastError

FreeADsMem

ReallocADsMem

Comentários
Esta página foi útil?  Yes  No
Função AllocADsStr (adshlp.h)
Artigo22/08/2023

A função AllocADsStr aloca memória para e copia uma cadeia de caracteres


especificada.

Sintaxe
C++

LPWSTR AllocADsStr(
[in] LPCWSTR pStr
);

Parâmetros
[in] pStr

Tipo: LPWSTR

Ponteiro para uma cadeia de caracteres Unicode terminada em nulo a ser copiada.

Valor retornado
Tipo: LPWSTR

Quando bem-sucedida, a função retorna um ponteiro não NULL para a memória


alocada. A cadeia de caracteres em pStr é copiada para esse buffer e terminada em nulo.
O chamador deve liberar essa memória quando ela não for mais necessária passando o
ponteiro retornado para FreeADsStr.

Retorna NULL se não for bem-sucedido. Chame ADsGetLastError para obter o erro
estendido status. Para obter mais informações sobre valores de código de erro, consulte
Códigos de erro ADSI.

Comentários
Para obter mais informações e um exemplo de código que mostra como usar a função
AllocADsStr , consulte ReallocADsStr.
Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho adshlp.h

Biblioteca Activeds.lib

DLL Activeds.dll

Confira também
Funções ADSI

ADsGetLastError

FreeADsStr

ReallocADsStr

Comentários
Esta página foi útil?  Yes  No
Função BinarySDToSecurityDescriptor
(adshlp.h)
Artigo22/08/2023

A função BinarySDToSecurityDescriptor converte um descritor de segurança binário em


um objeto IADsSecurityDescriptor .

Sintaxe
C++

HRESULT BinarySDToSecurityDescriptor(
[in] PSECURITY_DESCRIPTOR pSecurityDescriptor,
[out] VARIANT *pVarsec,
[in] LPCWSTR pszServerName,
[in] LPCWSTR userName,
[in] LPCWSTR passWord,
[in] DWORD dwFlags
);

Parâmetros
[in] pSecurityDescriptor

Tipo: PSECURITY_DESCRIPTOR

Endereço de uma estrutura SECURITY_DESCRIPTOR a ser convertida.

[out] pVarsec

Tipo: VARIANT*

Endereço de um VARIANT que recebe o objeto . A VARIANT contém um objeto


VT_DISPATCH que pode ser consultado para a interface IADsSecurityDescriptor . O
chamador deve liberar essa VARIANTpassando VARIANT para a função VariantClear .

[in] pszServerName

Tipo: LPCWSTR

Uma cadeia de caracteres Unicode terminada em nulo que fornece o nome do servidor
do qual o descritor de segurança foi recuperado. Esse parâmetro é opcional e pode ser
NULL.

[in] userName

Tipo: LPCWSTR

Uma cadeia de caracteres Unicode terminada em nulo que fornece o nome de usuário a
ser associado ao descritor de segurança. Esse parâmetro é opcional e pode ser NULL.

[in] passWord

Tipo: LPCWSTR

Uma cadeia de caracteres Unicode terminada em nulo que fornece a senha a ser
associada ao descritor de segurança. Esse parâmetro é opcional e pode ser NULL.

[in] dwFlags

Tipo: DWORD

Contém sinalizadores de autenticação para a conversão. Isso pode ser zero ou uma
combinação de um ou mais dos valores de enumeração ADS_AUTHENTICATION_ENUM .

Valor retornado
Tipo: HRESULT

Esse método dá suporte a valores retornados padrão, bem como o seguinte:

Se a operação falhar, um código de erro ADSI será retornado. Para obter mais
informações, consulte Códigos de erro ADSI.

Comentários
Essa função é usada para aplicativos herdados que devem converter manualmente
descritores de segurança em descritores de segurança binários. Para novos aplicativos,
use a interface IADsSecurityUtility , que faz essa conversão automaticamente.

Requisitos

Cliente mínimo com suporte Windows Vista


Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho adshlp.h

Biblioteca Activeds.lib

DLL Activeds.dll

Confira também
Códigos de erro ADSI

Funções ADSI

ADS_AUTHENTICATION_ENUM

IADsSecurityDescriptor

IADsSecurityUtility

SECURITY_DESCRIPTOR

SecurityDescriptorToBinarysd

Variantclear

Comentários
Esta página foi útil?  Yes  No
Função FreeADsMem (adshlp.h)
Artigo22/08/2023

A função FreeADsMem libera a memória alocada por AllocADsMem ou


ReallocADsMem.

Sintaxe
C++

BOOL FreeADsMem(
[in] LPVOID pMem
);

Parâmetros
[in] pMem

Tipo: LPVOID

Ponteiro para a memória a ser liberada. Essa memória deve ter sido alocada com a
função AllocADsMem ou ReallocADsMem .

Valor retornado
Tipo: BOOL

A função retornará TRUE se tiver êxito; caso contrário, retornará FALSE.

Comentários
Não use essa função para liberar memória alocada com a função AllocADsStr ou
ReallocADsStr . Use a função FreeADsStr para liberar memória alocada com essas
funções.

Para obter mais informações e um exemplo de código que mostra como usar a função
FreeADsMem , consulte ReallocADsMem.

Requisitos
Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho adshlp.h

Biblioteca Activeds.lib

DLL Activeds.dll; AdsLdpc.dll

Confira também
Funções ADSI

AllocADsMem

AllocADsStr

FreeADsStr

ReallocADsMem

ReallocADsStr

Comentários
Esta página foi útil?  Yes  No
Função FreeADsStr (adshlp.h)
Artigo22/08/2023

A função FreeADsStr libera a memória de uma cadeia de caracteres alocada por


AllocADsStr ou ReallocADsStr.

Sintaxe
C++

BOOL FreeADsStr(
[in] LPWSTR pStr
);

Parâmetros
[in] pStr

Tipo: LPWSTR

Ponteiro para a cadeia de caracteres a ser liberada. Essa cadeia de caracteres deve ter
sido alocada com a função AllocADsStr ou ReallocADsStr .

Valor retornado
Tipo: BOOL

A função retornará TRUE se a memória for liberada. Caso contrário, retornará FALSE.

Comentários
Não use essa função para liberar memória alocada com a função AllocADsMem ou
ReallocADsMem . Use a função FreeADsMem para liberar memória alocada com essas
funções.

Para obter mais informações e um exemplo de código que mostra como usar a função
FreeADsStr , consulte ReallocADsStr.

Requisitos
Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho adshlp.h

Biblioteca Activeds.lib

DLL Activeds.dll; AdsLdpc.dll

Confira também
Funções ADSI

AllocADsMem

AllocADsStr

FreeADsMem

ReallocADsMem

ReallocADsStr

Comentários
Esta página foi útil?  Yes  No
Função ReallocADsMem (adshlp.h)
Artigo22/08/2023

A função ReallocADsMem realoca e copia um bloco de memória existente.

Sintaxe
C++

LPVOID ReallocADsMem(
[in] LPVOID pOldMem,
[in] DWORD cbOld,
[in] DWORD cbNew
);

Parâmetros
[in] pOldMem

Tipo: LPVOID

Ponteiro para a memória a ser copiada. O ReallocADsMem liberará essa memória com
FreeADsMem depois que ela for copiada. Se não for possível alocar memória adicional,
essa memória não será liberada. Essa memória deve ter sido alocada com a função
AllocADsMem, AllocADsStr, ReallocADsMem ou ReallocADsStr .

O chamador deve liberar essa memória quando ela não for mais necessária passando
esse ponteiro para FreeADsMem.

[in] cbOld

Tipo: DWORD

Tamanho, em bytes, da memória a ser copiada.

[in] cbNew

Tipo: DWORD

Tamanho, em bytes, da memória a ser alocada.

Valor retornado
Tipo: LPVOID

Quando bem-sucedida, a função retorna um ponteiro para a nova memória alocada.


Caso contrário, retornará NULL.

Comentários
Se cbNew for menor que cbOld, a memória existente será truncada para se ajustar ao
novo tamanho de memória.

Exemplos

O exemplo de código a seguir mostra como usar ReallocADsMem para ampliar uma
cadeia de caracteres.

C++

LPWSTR pwszPrefix = L"LDAP://"


DWORD dwOldSize = (lstrlenW(pwszPrefix) + 1) * sizeof(WCHAR);

LPWSTR pwszADsPath = (LPWSTR)AllocADsMem(dwOldSize);


if(pwszADsPath)
{
LPWSTR pwszDN = L"DC=fabrikam,DC=com";

wcsncpy_s(pwszADsPath, pwszPrefix); // Path becomes "LDAP://"


wprintf(L"path = %s\n", pwszADsPath);

DWORD dwNewSize = (lstrlenW(pwszPrefix) + lstrlenW(pwszDN) + 1) *


sizeof(WCHAR);

/*
If successful, this will free the old path buffer, so it does not have
to be
freed manually. But if it fails, the original memory still exists, so
the
reallocated memory pointer is temporarily placed in another variable.
*/
LPWSTR pwszNewPath = (LPWSTR)ReallocADsMem(pwszADsPath, dwOldSize,
dwNewSize);
if(pwszNewPath)
{
pwszADsPath = pwszNewPath;

// Path is still "LDAP://"


wcsncat_s(pwszADsPath, pwszDN);

// Path is "LDAP://DC=fabrikam,DC=com"
wprintf(L"path = %s\n", pwszADsPath);
}
else
{
wprintf(L"Unable to allocate additional memory.");
}

// Free remaining memory.


FreeADsMem(pwszADsPath);
}

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho adshlp.h

Biblioteca Activeds.lib

DLL Activeds.dll

Confira também
Funções ADSI

AllocADsMem

AllocADsStr

FreeADsMem

ReallocADsMem

Comentários
Esta página foi útil?  Yes  No
Função ReallocADsStr (adshlp.h)
Artigo22/08/2023

A função ReallocADsStr cria uma cópia de uma cadeia de caracteres Unicode.

Sintaxe
C++

BOOL ReallocADsStr(
[out] LPWSTR *ppStr,
[in] LPWSTR pStr
);

Parâmetros
[out] ppStr

Tipo: LPWSTR*

Ponteiro para o ponteiro de cadeia de caracteres Unicode terminada em nulo que


recebe a cadeia de caracteres alocada. ReallocADsStr tentará liberar essa memória com
FreeADsStr antes de realocar a cadeia de caracteres, portanto, esse parâmetro deve ser
inicializado como NULL se a memória não deve ser liberada ou não foi alocada com a
função AllocADsMem, AllocADsStr, ReallocADsMem ou ReallocADsStr .

O chamador deve liberar essa memória quando ela não for mais necessária passando
esse ponteiro para FreeADsStr.

[in] pStr

Tipo: LPWSTR

Ponteiro para uma cadeia de caracteres Unicode terminada em nulo que contém a
cadeia de caracteres a ser copiada.

Valor retornado
Tipo: BOOL

A função retornará TRUE se tiver êxito, caso contrário, FALSE será retornado.
Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho adshlp.h

Biblioteca Activeds.lib

DLL Activeds.dll

Confira também
Funções ADSI

AllocADsMem

AllocADsStr

FreeADsStr

ReallocADsMem

Comentários
Esta página foi útil?  Yes  No
Função SecurityDescriptorToBinarySD
(adshlp.h)
Artigo22/08/2023

A função SecurityDescriptorToBinarySD converte um objeto IADsSecurityDescriptor no


formato de descritor de segurança binário.

Sintaxe
C++

HRESULT SecurityDescriptorToBinarySD(
[in] VARIANT vVarSecDes,
[out] PSECURITY_DESCRIPTOR *ppSecurityDescriptor,
[out] PDWORD pdwSDLength,
[in] LPCWSTR pszServerName,
[in] LPCWSTR userName,
[in] LPCWSTR passWord,
[in] DWORD dwFlags
);

Parâmetros
[in] vVarSecDes

Tipo: VARIANT

Contém um VARIANT que contém o descritor de segurança a ser convertido. O


VARIANT deve conter um VT_DISPATCH que contém um objeto IADsSecurityDescriptor
.

[out] ppSecurityDescriptor

Tipo: PSECURITY_DESCRIPTOR*

Endereço de um ponteiro SECURITY_DESCRIPTOR que recebe os dados do descritor de


segurança binário. O chamador deve liberar essa memória passando esse ponteiro para
a função FreeADsMem .

[out] pdwSDLength

Tipo: PDWORD
Endereço de um valor DWORD que recebe o comprimento, em bytes dos dados do
descritor de segurança binário.

[in] pszServerName

Tipo: LPCWSTR

Uma cadeia de caracteres Unicode terminada em nulo que especifica o nome do


servidor em que o descritor de segurança é colocado. Esse parâmetro é opcional e pode
ser NULL.

[in] userName

Tipo: LPCWSTR

Uma cadeia de caracteres Unicode terminada em nulo que contém o nome de usuário
ao qual o descritor de segurança está associado. Esse parâmetro é opcional e pode ser
NULL.

[in] passWord

Tipo: LPCWSTR

Uma cadeia de caracteres Unicode terminada em nulo que contém a senha que o
descritor de segurança está associado. Esse parâmetro é opcional e pode ser NULL.

[in] dwFlags

Tipo: DWORD

Contém sinalizadores de autenticação para a conversão. Isso pode ser zero ou uma
combinação de um ou mais dos valores de enumeração ADS_AUTHENTICATION_ENUM.

Valor retornado
Tipo: HRESULT

Esse método dá suporte aos valores retornados padrão, bem como aos seguintes.

Comentários
Essa função é usada para aplicativos herdados converterem manualmente descritores de
segurança em descritores de segurança binários. Para novos aplicativos, use
IADsSecurityUtility, que executa essa conversão automaticamente.
Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho adshlp.h

Biblioteca Activeds.lib

DLL Activeds.dll

Confira também
Códigos de erro ADSI

Funções ADSI

ADS_AUTHENTICATION_ENUM

BinarySDToSecurityDescriptor

FreeADsMem

IADsSecurityDescriptor

SECURITY_DESCRIPTOR

VARIANT

Comentários
Esta página foi útil?  Yes  No
Funções ADSI obsoletas
Artigo • 03/06/2023

As funções a seguir foram expostas nas versões anteriores do SDK adsi, mas não são
mais usadas no SDK.

ADsDecodeBinaryData
AdsFreeAdsValues
ADsFreeAllErrorRecords
AdsTypeToPropVariant
AssertADsMemLeaks
DumpMemoryTracker
InitADsMem
PropVariantToAdsType

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


ADSI Interfaces
Artigo • 13/06/2023

O ADSI (Active Directory Service Interfaces) dá suporte a um conjunto avançado de


interfaces que podem ser classificadas de acordo com as seguintes categorias:

Núcleo. Essas interfaces fornecem as funções básicas de gerenciamento de objetos


ADSI. As funções principais incluem fornecer um ponto de entrada em um
repositório de diretórios, carregar propriedades no cache de propriedades e
confirmar alterações no diretório subjacente.
Esquema. Essas interfaces fornecem métodos para gerenciar e estender o esquema
de diretório.
Cache de Propriedades. Essas interfaces definem métodos para manipular
propriedades no cache de propriedades.
Objeto Persistente. Essas interfaces manipulam dados persistentes no namespace
do serviço de diretório subjacente. Os objetos ADSI implementam esses tipos de
interfaces para fornecer acesso aos seus dados persistentes, incluindo contas de
usuário, compartilhamentos de arquivos, hierarquias organizacionais e listagens de
trabalho em uma fila de impressão.
Objeto Dinâmico. Essas interfaces funcionam com dados dinâmicos em um serviço
de diretório. Os objetos de diretório não representados no serviço de diretório
subjacente implementam essas interfaces. Exemplos de dados dinâmicos incluem
comandos emitidos em uma rede.
Segurança. Essas interfaces permitem que um cliente ADSI estabeleça suas
credenciais para um servidor e use recursos de segurança compatíveis com o
serviço de diretório, como a lista de controle de acesso ou descritores de
segurança.
Não automação. Essas interfaces permitem acesso de baixa sobrecarga de clientes
que não são de Automação (por exemplo, aplicativos C/C++) a objetos de
diretório fornecendo acesso Vtable a métodos para gerenciar e pesquisar objetos
de serviço de diretório.
Extensão. Essas interfaces permitem que os clientes ADSI estendam os recursos
das classes ADSI existentes para oferecer soluções personalizadas para serviços de
diretório.
Utilitário. Essas interfaces fornecem funções auxiliares avançadas para gerenciar
objetos ADSI.
Tipo de dados. Essas interfaces fornecem métodos para acessar tipos de dados
ADSI.
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Listagem alfabética de interfaces ADSI
Artigo • 03/06/2023

A tabela a seguir contém uma listagem alfabética de todas as interfaces ADSI.

Interface Categoria/descrição

Iads Núcleo

IADsAccessControlEntry Segurança

IADsAccessControlList Segurança

IADsAcl Tipo de Dados

IADsADSystemInfo Utilitário

IADsAggregatee Obsoleto

IADsAggregator Obsoleto

IADsBackLink Tipo de Dados

IADsCaseIgnoreList Tipo de Dados

IADsClass Esquema

IADsCollection Objeto persistente

IADsComputer Objeto persistente

IADsComputerOperations Objeto dinâmico

IADsContainer Núcleo

IADsDeleteOps Utilitário

IADsDNWithBinary Tipo de Dados

IADsDNWithString Tipo de Dados

IADsDomain Objeto persistente

IADsEmail Tipo de Dados

IADsExtension Extensão

IADsFaxNumber Tipo de Dados

IADsFileService Objeto persistente


Interface Categoria/descrição

IADsFileServiceOperations Objeto dinâmico

IADsFileShare Objeto persistente

IADsGroup Objeto persistente

IADsHold Tipo de Dados

Iadslargeinteger Tipo de Dados

IADsLocality Objeto persistente

IADsMembers Objeto persistente

IADsNamespaces Núcleo

IADsNameTranslate Utilitário

IADsNetAddress Tipo de Dados

IADsO Objeto persistente

IADsObjectOptions Utilitário

IADsOctetList Tipo de Dados

IADsOpenDSObject Núcleo

IADsOU Objeto persistente

IADsPath Tipo de Dados

IADsPathName Utilitário

IADsPostalAddress Tipo de Dados

IADsPrintJob Objeto persistente

IADsPrintJobOperations Objeto dinâmico

IADsPrintQueue Objeto persistente

IADsPrintQueueOperations Objeto dinâmico

IADsProperty Esquema

IADsPropertyEntry Cache de Propriedades

IADsPropertyList Cache de Propriedades

IADsPropertyValue Cache de Propriedades


Interface Categoria/descrição

IADsPropertyValue2 Cache de Propriedades

IADsReplicaPointer Tipo de Dados

IADsResource Objeto dinâmico

IADsSecurityDescriptor Segurança

IADsService Objeto persistente

IADsServiceOperations Objeto dinâmico

IADsSession Objeto dinâmico

IADsSyntax Esquema

IADsTimestamp Tipo de Dados

IADsTsUserEx Dados do usuário do Terminal Services

IADsTypedName Tipo de Dados

Iadsuser Objeto persistente

IADsWinNTSystemInfo Utilitário

IDirectoryObject Core/Non-Automation

IDirectorySchemaMgmt Obsoleto

Idirectorysearch Core/Non-Automation

IPrivateDispatch Obsoleto

IPrivateUnknown Obsoleto

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Métodos de propriedade interface
Artigo • 12/06/2023

Muitas interfaces ADSI foram projetadas para dar suporte à Automação e, portanto, são
interfaces duplas, pois dão suporte ao acesso ao cliente por meio de interfaces
IUnknown e IDispatch . Clientes que não são de Automação, como aqueles escritos em
C/C++, resolve invocação de método diretamente, usando o método
IUnknown::QueryInterface e chamam o método diretamente. Os clientes de
automação, também conhecidos como clientes associados ao nome, como aqueles
escritos no Visual Basic ou VBScript (Visual Basic Scripting Edition), devem resolve
invocação de método indiretamente usando o método dispinterface.

Uma interface ADSI que dá suporte à Automação define métodos de propriedade para
recuperar e modificar propriedades de um objeto que implementa a interface. Os
métodos de propriedade têm nomes que têm get_ e put_ anexados aos nomes de
propriedade apropriados, por exemplo, get_User e put_Name.

Cada método get_ usa um único parâmetro como saída. Esse parâmetro é um endereço
alocado pelo método de uma variável do tipo de dados de propriedade. No retorno,
essa variável pressupõe o valor atual da propriedade solicitada. O chamador deve liberar
a memória alocada da variável quando a propriedade não for mais necessária.

Cada método put_ usa um único parâmetro como entrada para o tipo de dados da
propriedade correspondente. O parâmetro contém um novo valor da propriedade .

O exemplo de código a seguir mostra a invocação dos métodos de propriedade que


seguem o procedimento usual para chamar a função membro de um objeto .

C++

IADs *pADs;
BSTR bstrName;
pADs->get_Name(&bstrName);

O exemplo de código a seguir mostra a invocação dos métodos de propriedade em


clientes de automação, o que pode ser um pouco diferente. Por exemplo, o Visual Basic
usa notação de ponto.

VB

Dim Obj As IADs


Dim objName As String
objName = Obj.Name
Todos os parâmetros e tipos de retorno devem ser aqueles definidos pelo tipo de dados
VARIANT. Todos os métodos em uma interface dupla retornam um valor HRESULT para
indicar êxito ou falha.

Para obter mais informações sobre como obter e definir propriedades em objetos ADSI,
consulte Cache de Propriedades.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Implementação de interface de
provedores de sistema
Artigo • 12/06/2023

O ADSI incorpora vários provedores de serviços de diretório, ou seja, LDAP e WinNT.


Provedores diferentes podem optar por implementar ou não uma interface. Diferentes
provedores de serviços de diretório dão suporte a diferentes propriedades e métodos.
Para obter mais informações sobre o suporte a provedores de serviços de diretório
específicos, consulte Provedores de sistema ADSI.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Objetos e interfaces ADSI
Artigo • 03/06/2023

Esta seção contém modelos gráficos de objetos ADSI e as interfaces usadas para acessar
esses objetos por diferentes provedores de serviços.

Modelo de objeto ADSI para provedores LDAP


Modelo de objeto ADSI para provedores WinNT

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Modelo de objeto ADSI para provedores
LDAP
Artigo • 03/06/2023

A ilustração a seguir mostra objetos ADSI usados para o provedor LDAP e interfaces
usadas para acessar esses objetos.

Objeto Interface

Classe IADs, IADsClass

Propriedade IADs, IADsProperty

GenObject IADs, IADsContainer, IADsDeleteOps, IADsObjectOptions,


IADsPropertyList, IDirectoryObject, IDirectorySearch

Namespace IADs, IADsContainer, IADsOpenDSObject

Rootdse IADs, IADsPropertyList


Objeto Interface

Caminho IADs, IADsPathname

Esquema IADs, IADsContainer

Sintaxe IADs, IADsSyntax

Organização IADsO

OrganizationalUnit IADsOU

Groupcollection IADsMembers

Agrupar IADsGroup

Usercollection IADsMembers

Usuário Iadsuser

Localidade IADsLocality

NameTranslate IADsNameTranslate

PrintQueue IADsPrintQueue, IADsPrintQueueOperations

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Modelo de objeto ADSI para provedores
WinNT
Artigo • 03/06/2023

A ilustração a seguir mostra os objetos ADSI usados para o provedor WinNT e as


interfaces usadas para acessar os objetos ADSI.
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interfaces principais (ADSI)
Artigo • 03/06/2023

Esta seção descreve as seguintes interfaces ADSI principais:

IADS
IADSContainer
IADSNamespaces
IADSOpenDSObject

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interface IADs (iads.h)
Artigo24/08/2023

A interface IADs define os recursos básicos do objeto, ou seja, propriedades e métodos,


de qualquer objeto ADSI. Exemplos de objetos ADSI incluem usuários, computadores,
serviços, organização de contas de usuário e computadores, sistemas de arquivos e
operações de serviço de arquivo. Cada objeto ADSI deve dar suporte a essa interface,
que serve para fazer o seguinte:

Fornece identificação de objeto por nome, classe ou ADsPath


Identifica o contêiner do objeto que gerencia a criação e a exclusão do objeto
Recupera a definição de esquema do objeto
Carrega os atributos do objeto no cache de propriedades e confirma as alterações
no repositório de diretório persistente
Acessa e modifica os valores de atributo do objeto no cache de propriedades

A interface IADs foi projetada para garantir que os objetos ADSI forneçam aos
administradores de rede e aos provedores de serviços de diretório uma representação
simples e consistente de vários serviços de diretório subjacentes.

Herança
A interface IADs herda da interface IDispatch . As IADs também têm estes tipos de
membros:

Métodos
A interface IADs tem esses métodos.

IADs::Get

Recupera uma propriedade de um determinado nome do cache de propriedades.

IADs::GetEx

Recupera, do cache de propriedades, os valores de propriedade de um determinado atributo.

IADs::GetInfo
Carrega nos valores de cache de propriedade das propriedades com suporte desse objeto ADSI
do repositório de diretórios subjacente.

IADs::GetInfoEx

O método IADs::GetInfoEx carrega os valores das propriedades especificadas do objeto ADSI do


repositório de diretórios subjacente no cache de propriedades.

IADs::P ut

Define os valores de um atributo no cache de atributos ADSI.

IADs::P utEx

Modifica os valores de um atributo no cache de atributo ADSI.

IADs::SetInfo

O método IADs::SetInfo salva os valores de propriedade armazenados em cache do objeto ADSI


no repositório de diretórios subjacente.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Comentários
Esta página foi útil?  Yes  No
Métodos de propriedade IADs
Artigo • 12/06/2023

Os métodos de propriedade da interface IADs obtêm ou definem as propriedades descritas


na tabela a seguir. Para obter mais informações sobre métodos de propriedade, consulte
Métodos de propriedade de interface.

Propriedades
Adspath

A cadeia de caracteres ADsPath desse objeto. A cadeia de caracteres identifica


exclusivamente esse objeto em um ambiente de rede. O objeto sempre pode ser
recuperado usando esse caminho.

Tipo de acesso: Somente leitura

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_ADsPath(
[out] BSTR* pbstrADsPath
);

Classe

O nome da classe Schema do objeto.

Tipo de acesso: Somente leitura

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Class(
[out] BSTR* pbstrClass
);

GUID

O identificador global exclusivo do objeto de diretório. A interface IADs converte o GUID de


uma cadeia de caracteres de octeto, conforme armazenado em um servidor de diretório, em
um formato de cadeia de caracteres.
Tipo de acesso: Somente leitura

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_GUID(
[out] BSTR* pbstrGUID
);

Nome

O nome relativo do objeto, conforme nomeado no serviço de diretório subjacente. Esse


nome distingue esse objeto de seus irmãos.

Tipo de acesso: Somente leitura

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Name(
[out] BSTR* pbstrName
);

Pai

A cadeia de caracteres ADsPath do contêiner pai. O Active Directory não permite a


formação do ADsPath de um determinado objeto concatenando as propriedades Parent e
Name . Embora essa operação possa funcionar em alguns provedores, não há garantia de
que ela funcione para todas as implementações. O ADsPath tem a garantia de ser válido e
sempre deve ser usado para recuperar o ponteiro de interface de um objeto.

Tipo de acesso: Somente leitura

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Parent(
[out] BSTR* pbstrParent
);

Esquema

A cadeia de caracteres ADsPath do objeto da classe Schema desse objeto .


Tipo de acesso: Somente leitura

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Schema(
[out] BSTR* pbstrSchema
);

Comentários
No Active Directory, o GUID retornado do GUID é uma cadeia de caracteres de
hexadecimals. Use o GUID resultante para associar ao objeto diretamente.

VB

Dim x As IADs
Set x = GetObject("LDAP://servername/<GUID=xxx>")

em que xxx é o valor retornado da propriedade GUID. Para obter mais informações, consulte
Usando objectGUID para associar a um objeto. Lembre-se de que, se você usar um GUID
para associar a um objeto , o método de propriedade ADsPath retornará valores diferentes
dos valores normais que seriam retornados se você usasse um DN (nome diferenciado) para
associar ao mesmo objeto. Por exemplo, a tabela a seguir lista os valores retornados ao usar
os dois métodos de associação diferentes para associar ao mesmo objeto de usuário.

Associar usando DN Associar usando GUID

Nome CN=Jeff Smith CN=Jeff Smith

Pai LDAP://server/CN=Users,DC=Fabrikam,DC=com LDAP://server/CN=Users,DC=Fabrikam,DC=com

Adspath LDAP://server/CN=Jeff <LDAP://server/


Smith,CN=Users,DC=Fabrikam,DC=com GUID=c0f59dfcf507d311a99e0000f879f7c7>

7 Observação

O provedor WinNT não dá suporte à associação usando o GUID do objeto e retorna a


propriedade GUID em um formato de cadeia de caracteres ligeiramente diferente.

Exemplos
O exemplo de código a seguir mostra como recuperar dados de objeto usando métodos de
propriedade da interface IADs .

VB

Dim x As IADs
Dim parent As IADsContainer
Dim cls As IADsClass
Dim op As Variant

On Error GoTo Cleanup

Set x = GetObject("WinNT://Fabrikam/Administrator")
Debug.Print "Object Name: " & x.Name
Debug.Print "Object Path: " & x.ADsPath
Debug.Print "Object Class: " & x.Class

' Get more data about the object schema.


Set cls = GetObject(x.Schema)
Debug.Print "Class Name is: " & cls.Name
For Each op In cls.OptionalProperties
Debug.Print "Optional Property: " & op
Next op

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set x = Nothing
Set parent = Nothing
Set cls = Nothing

O exemplo de código a seguir mostra como recuperar dados de objeto usando métodos de
propriedade da interface IADs .

VB

<HTML>
<head><title></title></head>

<body>
<%
Dim x
On Error Resume Next

Set x = GetObject("WinNT://Fabrikam/Administrator")
Response.Write "Object Name: " & x.Name & "<br>"
Response.Write "Object Path: " & x.ADsPath & "<br>"
Response.Write "Object Class: " & x.Class & "<br>"

' Get more data about the object schema.


Set cls = GetObject(x.Schema)
Response.Write "Class Name is: " & cls.Name & "<br>"
For Each op In cls.OptionalProperties
Response.Write "Optional Property: " & op & "<br>"
Next op
%>

</body>
</html>

O exemplo de código a seguir mostra como trabalhar com os métodos de propriedade da


interface IADs .

C++

#include <stdio.h>
#include <activeds.h>

int main(int argc, char* argv[])


{
IADs *pADs = NULL;
IADsUser *pADsUser = NULL;
IADsClass *pCls = NULL;
CComBSTR sbstr;

HRESULT hr = CoInitialize(NULL);
if (hr != S_OK) { return 0; }

hr=ADsGetObject(L"WinNT://Fabrikam/Administrator",
IID_IADsUser,
(void**) &pADsUser);
if (hr != S_OK) { goto Cleanup; }

hr = pADsUser->QueryInterface(IID_IADs, (void**) &pADs);


if( hr !=S_OK) { goto Cleanup;}

pADsUser->Release();

if( S_OK == pADs->get_Name(&sbstr) ) {


printf("Object Name: %S\n",sbstr);
}

if( S_OK == pADs->get_ADsPath(&sbstr) ) {


printf("Object path: %S\n",sbstr);
}

if( S_OK == pADs->get_Class(&sbstr) ) {


printf("Object class: %S\n",sbstr);
}

hr = pADs->get_Schema(&sbstr);
if ( hr != S_OK) {goto Cleanup;}

hr = ADsGetObject(sbstr,IID_IADsClass, (void**)&pCls);
if ( hr != S_OK) {goto Cleanup;}
if( S_OK == pCls->get_Name(&sbstr) ) {
printf("Class name is %S\n", sbstr);
}
Cleanup:
if(pADs)
pADs->Release();

if(pIADsUser)
pADsUser->Release();

if(IADsClass)
pADsClass->Release();

CoUninitialize();

if(hr==S_OK)
{
return 1;
}
else
{
return 0;
}
}

Requisitos
Requisito Valor

Cliente mínimo com suporte Windows Vista

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADs é definido como FD8256D0-FD15-11CE-ABC4-02608C9E7553

Confira também
Iads

IADsContainer

Comentários
Esta página foi útil? ツ Yes ト No
Obter ajuda no Microsoft Q&A
Método IADs::Get (iads.h)
Artigo24/08/2023

O método IADs::Get recupera uma propriedade de um determinado nome do cache de


propriedades. A propriedade pode ser com valor único ou com valores múltiplos. O
valor da propriedade é representado como uma variante para uma propriedade de valor
único ou uma matriz variante (de VARIANT ou bytes) para uma propriedade que
permite vários valores.

Sintaxe
C++

HRESULT Get(
[in] BSTR bstrName,
[out] VARIANT *pvProp
);

Parâmetros
[in] bstrName

Contém um BSTR que especifica o nome da propriedade.

[out] pvProp

Ponteiro para um VARIANT que recebe o valor da propriedade . Para uma propriedade
com vários valores, pvProp é uma matriz variante de VARIANT, a menos que a
propriedade seja um tipo binário. Neste último caso, pvProp é uma matriz variante de
bytes (VT_U1 ou VT_ARRAY). Para a propriedade que se refere a um objeto , pvProp é
um ponteiro VT_DISPATCH para o objeto referido.

Valor retornado
Esse método dá suporte a valores retornados padrão, bem como os seguintes.

Para obter mais informações, consulte Códigos de erro ADSI.

Comentários
O método IADs::Get exige que o chamador manipule os valores de propriedade de
valor único e múltiplo de maneira diferente. Portanto, se você souber que a propriedade
de interesse é única ou com vários valores, use o método IADs::Get para recuperar o
valor da propriedade. O exemplo de código a seguir mostra como você, como um
chamador, pode lidar com propriedades de valores únicos e múltiplos ao chamar esse
método.

Quando uma propriedade é não inicializada, chamar esse método invoca uma chamada
implícita para o método IADs::GetInfo . Isso é carregado do diretório subjacente que
armazena os valores das propriedades com suporte que não foram definidas no cache.
Todas as chamadas subsequentes para IADs::Get lidam com valores de propriedade
somente no cache. Para obter mais informações sobre o comportamento de chamadas
implícitas e explícitas para IADs::GetInfo, consulte IADs::GetInfo.

Você também pode usar IADs::GetEx para recuperar valores de propriedade do cache de
propriedades. No entanto, os valores são retornados como uma matriz variante de
VARIANTs, independentemente de serem de valor único ou de vários valores. Ou seja,
ADSI tenta empacotar os valores de propriedade retornados em formatos de dados
consistentes. Isso salva você, como um chamador, o esforço de validar os tipos de
dados quando não tem certeza de que os dados retornados têm valores únicos ou
múltiplos.

Exemplos

O exemplo de código a seguir recupera o descritor de segurança de um objeto usando


IADs::Get.

VB

Dim x As IADs
Dim Desc As IADsSecurityDescriptor
On Error GoTo ErrTest:

Set x = GetObject("LDAP://CN=Administrator,CN=Users,DC=Fabrikam,DC=com")

' Single-valued properties.


Debug.Print "Home Phone Number is: " & x.Get("homePhone")

' Some property values represents other ADSI objects.


' Consult your provider documentation.
Set Desc = x.Get("ntSecurityDescriptor")

' Multi-valued property, assuming that multiple values were


' assigned to the "otherHomePhone" properties. Caller must
' enumerate all the available values.
Debug.Print "Other Phone Numbers are: "
otherNumbers = x.Get("otherHomePhone")
For Each homeNum In otherNumbers
Debug.Print homeNum
Next

Exit Sub

ErrTest:
Debug.Print Hex(Err.Number)
Set x = Nothing
Set Desc = Nothing

O exemplo de código a seguir mostra como trabalhar com valores de propriedade de


dados binários usando IADs::Get e IADs::P ut.

VB

Dim oTarget As IADs


Dim Octet(5) As Byte
Dim MultiOctet(2) As Variant
Dim i As Integer, j As Integer

On Error GoTo Cleanup

' Set up MultiOctetString.


For i = 0 To 2
For j = 0 To 5
Octet(j) = CByte(i * j)
Next j
MultiOctet(i) = Octet
Next i

' Bind to the object and set MultiOctetString.


Set oTarget=GetObject("LDAP://CN=SomeUser,CN=Users,DC=Fabrikam, DC=COM")
oTarget.Put "multiOctetString", MultiOctet
oTarget.SetInfo

Dim GetOctet As Variant


Dim Temp As Variant

' Read back and print MultiOctetString.


GetOctet = oTarget.Get("multiOctetString")
For i = LBound(GetOctet) To UBound(GetOctet)
Temp = GetOctet(i)
For j = LBound(Temp) To UBound(Temp)
Debug.Print Temp(j)
Next j
Debug.Print "----"
Next i

Exit Sub

Cleanup:
MsgBox("An error has occurred. " & Err.Number)
Set oTarget = Nothing

O exemplo de código a seguir mostra como recuperar valores das propriedades


opcionais de um objeto usando IADs::Get.

VB

<HTML>
<head><title></title></head>

<body>
<%
Dim x

On error resume next


Set x = GetObject("WinNT://Fabrikam/Administrator")
Response.Write "Object Name: " & x.Name & "<br>"
Response.Write "Object Class: " & x.Class & "<br>"

' Get optional property values of this object.


Set cls = GetObject(x.Schema)

For Each op In cls.OptionalProperties


v = obj.Get(op)
if err.Number = 0 then
Response.Write "Optional Property: " & op & "=" & v & "<br>"
end if
Next
%>

</body>
</html>

O exemplo de código a seguir lê atributos com valores únicos e múltiplos usando


IADs::Get.

C++

HRESULT hr;
IADs *pUsr=NULL;

CoInitialize(NULL);

///////////////////////////////
// Bind to a directory object.
///////////////////////////////
hr = ADsGetObject(L"WinNT://Fabrikam/Administrator,user", IID_IADs, (void**)
&pUsr );
if ( !SUCCEEDED(hr) ) { return hr; }
//////////////////////////////////
// Get a single-valued attribute.
//////////////////////////////////
VARIANT var;
VariantInit(&var);

hr = pUsr->Get(CComBSTR("FullName"), &var );
if ( SUCCEEDED(hr) )
{
printf("FullName: %S\n", V_BSTR(&var) );
VariantClear(&var);
}

if ( pUsr )
{
pUsr->Release();
}

///////////////////////////////////////////////////////
// Get a multi-valued attribute from a service object.
///////////////////////////////////////////////////////
IADs *pSvc = NULL;

hr = ADsGetObject(L"WinNT://Fabrikam/Account/Browser,service", IID_IADs,
(void**) &pSvc );
if ( !SUCCEEDED(hr) )
{
return hr;
}

hr = pSvc->Get(CComBSTR("Dependencies"), &var );
if ( SUCCEEDED(hr) )
{
LONG lstart, lend;
SAFEARRAY *sa = V_ARRAY( &var );
VARIANT varItem;

// Get the lower and upper bound.


hr = SafeArrayGetLBound( sa, 1, &lstart );
hr = SafeArrayGetUBound( sa, 1, &lend );

// Iterate and print the content.


VariantInit(&varItem);
printf("Getting service dependencies using IADs :\n");
for ( long idx=lstart; idx <= lend; idx++ )
{
hr = SafeArrayGetElement( sa, &idx, &varItem );
printf("%S ", V_BSTR(&varItem));
VariantClear(&varItem);
}
printf("\n");

VariantClear(&var);
}
// Cleanup.
if ( pSvc )
{
pSvc->Release();
}

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Iads

IADs::GetEx

IADs::GetInfo

IADs::P ut

IADs::P utEx

Cache de Propriedades

Comentários
Esta página foi útil?  Yes  No
Método IADs::GetEx (iads.h)
Artigo24/08/2023

O método IADs::GetEx recupera, do cache de propriedades, valores de propriedade de


um determinado atributo. Os valores de propriedade retornados podem ser de valor
único ou de vários valores. Ao contrário do método IADs::Get , os valores de
propriedade são retornados como uma matriz variante de VARIANT ou uma matriz
variante de bytes para dados binários. Uma propriedade de valor único é representada
como uma matriz de um único elemento.

Sintaxe
C++

HRESULT GetEx(
[in] BSTR bstrName,
[out] VARIANT *pvProp
);

Parâmetros
[in] bstrName

Contém um BSTR que especifica o nome da propriedade.

[out] pvProp

Ponteiro para uma VARIANT que recebe o valor ou valores da propriedade .

Valor retornado
Esse método dá suporte aos valores retornados padrão, bem como aos valores
retornados listados na lista a seguir.

Para obter mais informações, consulte Códigos de erro ADSI.

Comentários
Os métodos IADs::Get e IADs::GetEx retornam uma estrutura variante diferente para um
valor de propriedade de valor único. Se a propriedade for uma cadeia de caracteres,
IADs::Get retornará uma variante de cadeia de caracteres (VT_BSTR), enquanto
IADs::GetEx retornará uma matriz variante de uma cadeia de caracteres de tipo
VARIANT com um único elemento. Portanto, se você não tiver certeza de que um
atributo de vários valores retornará um único valor ou vários valores, use IADs::GetEx.
Como ele não exige que você valide as estruturas de dados do resultado, talvez você
queira usar IADs::GetEx para recuperar uma propriedade quando não tiver certeza se
ela tem valores únicos ou múltiplos. A lista a seguir compara os dois métodos.

IADs::Obter versão Versão IADs::GetEx

VB C++

Dim x as IADs Dim x as IADs

otherNumbers = otherNumbers =
x.Get("otherHomePhone") x.GetEx("otherHomePhone")
If VarType(otherNumbers) = For Each homeNum In otherNumbers
vbString Then Debug.Print homeNum
Debug.Print otherNumbers Next
Else
For Each homeNum In
otherNumbers
Debug.Print homeNum
Next
End If

Como o método IADs::Get , IADs::GetEx chama implicitamente IADs::GetInfo em um


cache de propriedade não inicializado. Para obter mais informações sobre chamadas
implícitas e explícitas para IADs::GetInfo, consulte IADs::GetInfo.

Exemplos

O exemplo de código a seguir mostra como usar IADs::GetEx para recuperar


propriedades de objeto.

VB

Dim x As IADs
On Error GoTo ErrTest:

Set x = GetObject("LDAP://CN=Administrator,CN=Users,DC=Fabrikam,DC=com")

' Single value property.


Debug.Print "Home Phone Number is: "
phoneNumber = x.GetEx(""homePhone")
For Each homeNum in phoneNumber
Debug.Print homeNum
Next

' Multiple value property.


Debug.Print "Other Phone Numbers are: "
otherNumbers = x.GetEx("otherHomePhone")
For Each homeNum In otherNumbers
Debug.Print homeNum
Next
Exit Sub

ErrTest:
Debug.Print Hex(Err.Number)
Set x = Nothing

O exemplo de código a seguir mostra como recuperar valores das propriedades


opcionais de um objeto usando o método IADs::Get .

VB

<HTML>
<head><title></title></head>

<body>
<%
Dim x

On Error Resume Next


Set x = GetObject("WinNT://Fabrikam/Administrator")
Response.Write "Object Name: " & x.Name & "<br>"
Response.Write "Object Class: " & x.Class & "<br>"

' Get the optional property values for this object.


Set cls = GetObject(x.Schema)
For Each op In cls.OptionalProperties
vals = obj.GetEx(op)
if err.Number = 0 then
Response.Write "Optional Property: & op & "="
for each v in vals
Response.Write v & " "
next
Response.Write "<br>"
end if
Next
%>

</body>
</html>
O exemplo de código a seguir recupera os valores de propriedade "homePhone"
usando IADs::GetEx.

C++

IADs *pADs = NULL;

hr = ADsGetObject(L"LDAP://CN=Administrator,CN=Users,DC=Fabrikam,DC=Com",
IID_IADs, (void**) &pADs );
if ( !SUCCEEDED(hr) ) { return hr;}

hr = pADs->GetEx(CComBSTR("homePhone"), &var);
if ( SUCCEEDED(hr) )
{
LONG lstart, lend;
SAFEARRAY *sa = V_ARRAY( &var );
VARIANT varItem;

// Get the lower and upper bound.


hr = SafeArrayGetLBound( sa, 1, &lstart );
hr = SafeArrayGetUBound( sa, 1, &lend );

// Iterate and print the content.


VariantInit(&varItem);
printf("Getting Home Phone using IADs::Get.\n");
for ( long idx=lstart; idx <= lend; idx++ )
{
hr = SafeArrayGetElement( sa, &idx, &varItem );
printf("%S ", V_BSTR(&varItem));
VariantClear(&varItem);
}
printf("\n");

VariantClear(&var);
}

// Cleanup.
if ( pADs )
{
pADs->Release();
}

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008


Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Iads

IADs::Get

IADs::GetInfo

IADs::P ut

IADs::P utEx

Interfaces de cache de propriedade

Comentários
Esta página foi útil?  Yes  No
Método IADs::GetInfo (iads.h)
Artigo24/08/2023

O método IADs::GetInfo é carregado nos valores de cache de propriedade das


propriedades com suporte desse objeto ADSI do repositório de diretórios subjacente.

Sintaxe
C++

HRESULT GetInfo();

Valor retornado
Esse método dá suporte aos valores retornados padrão, bem como aos seguintes.

Para obter mais informações, consulte Códigos de erro ADSI.

Comentários
A função IADs::GetInfo é chamada para inicializar ou atualizar o cache de propriedades.
Isso é semelhante à obtenção desses valores de propriedade de propriedades com
suporte do repositório de diretórios subjacente.

Um cache de propriedades não inicializado não está necessariamente vazio. Chame


IADs::P ut ou IADs::P utEx para colocar um valor no cache de propriedades para
qualquer propriedade com suporte e o cache permanece não inicializado.

Uma chamada explícita para IADs::GetInfo carrega ou recarrega todo o cache de


propriedades, substituindo todos os valores de propriedade armazenados em cache.
Mas uma chamada implícita carrega apenas as propriedades não definidas no cache.
Sempre chame IADs::GetInfo explicitamente para recuperar os valores de propriedade
mais atuais do objeto ADSI.

Como uma chamada explícita para IADs::GetInfo substitui todos os valores no cache de
propriedades, qualquer alteração feita no cache será perdida se um IADs::SetInfo não
tiver sido invocado antes de IADs::GetInfo.

Para um objeto de contêiner ADSI, IADs::GetInfo armazena em cache apenas os valores


de propriedade do contêiner, mas não os dos objetos filho.
É importante enfatizar as diferenças entre os métodos IADs::Get e IADs::GetInfo . O
primeiro retorna valores de uma determinada propriedade do cache de propriedades,
enquanto o último carrega todos os valores de propriedade com suporte no cache de
propriedades do repositório de diretórios subjacente.

O exemplo de código a seguir ilustra as diferenças entre os métodos IADs::Get e


IADs::GetInfo .

VB

Set x = GetObject("LDAP://CN=Administrator,CN=Users,DC=Fabrikam,DC=com")
' The first IADs::Get calls
' GetInfo implicitly.
Debug.Print x.Get("homePhone") ' Assume value is '999-9999'.
x.Put "homePhone", "868-4449" ' Put with no commit(SetInfo)
Debug.Print x.Get("homePhone") ' Value='868-4449' from the cache.
x.GetInfo ' Refresh the cache, get the data
' from the directory.
Debug.Print x.Get("homePhone") ' Value will be '999-9999'.

Para aumentar o desempenho, chame explicitamente IADs::GetInfoEx para atualizar


propriedades específicas. Além disso, IADs::GetInfoEx deve ser chamado em vez de
IADs::GetInfo se os valores de propriedade operacional do objeto tiverem que ser
acessados. Essa função substitui todos os valores armazenados em cache anteriormente
das propriedades especificadas.

Exemplos

O exemplo de código a seguir usa um objeto de computador atendido pelo provedor


WinNT. As propriedades com suporte incluem Owner ("Owner"), OperatingSystem
("Windows NT"), OperatingSystemVersion ("4.0"), Division ("Fabrikam"),
ProcessorCount ("Uniprococessor Free"), Processor ("x86 Family 6 Model 5 Stepping 1").
Os valores padrão são mostrados entre parênteses.

VB

Dim pList As IADsPropertyList


Dim pEntry As IADsPropertyEntry
Dim pValue As IADsPropertyValue

On Error GoTo Cleanup

Set pList = GetObject("WinNT://localhost,computer")

' pList now represents an uninitialized empty property cache.


pList.Put "Owner", "JeffSmith" ' Property cache remains uninitialized,
' but with one property value.
count = pList.PropertyCount ' count = 1.
MsgBox "Number of property found in the property cache: " & count

v = pList.Get("Division") ' pList.GetInfo is called implicitly


ShowPropertyCache ' This will display "JeffSmith" for Owner,
' "Fabrikam" for Division, "Windows NT" for
' OperatingSystem, and so on.

pList.GetInfo ' Refreshes the entire cache, overwriting


' "JeffSmith" for the Owner property.
ShowPropertyCache ' This will display "Owner" for Owner,
' "Fabrikam" for Division, "Windows NT" for
' OperatingSystem, and so on.

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set pList = Nothing
Set pEntry = Nothing
Set pValue = Nothing

Private Sub ShowPropertyCache()


For I = 0 To pList.PropertyCount-1
Set pEntry = pList.Item(I)
Debug.Print pEntry.Name
For Each v In pEntry.Values
Set pValue = v
Debug.Print " " & pvalue.CaseIgnoreString
Next
Next
End Sub

O exemplo de código a seguir é um script do lado do cliente que ilustra o efeito do


método IADs::GetInfo . As propriedades com suporte incluem Owner ("Owner"),
OperatingSystem ("Windows NT"), OperatingSystemVersion ("4.0"), Division
("Fabrikam"), ProcessorCount ("Uniprococessor Free"), Processor ("x86 Family 6 Model 5
Stepping 1"). Os valores padrão são mostrados entre parênteses.

VB

<html>
<body>
<table>
<tr>
<td>Owner:</td>
<td><input type=text name=txtOwner></td>
</tr>
<tr>
<td>Operating System:</td>
<td><input type=text name=txtOS></td>
</tr>
<tr>
<td>Operating System Version:</td>
<td><input type=text name=txtOSV></td>
</tr>
<tr>
<td>Division:</td>
<td><input type=text name=txtDiv></td>
</tr>
</table>

<input type=button onClick = "showGetInfo()">


</body>

<script language="vbscript">
Dim pList

sub showGetInfo()
Set oFac = CreateObject("ADsFactory")
path = "WinNT://Fabrikam"
ADS_SECURE_AUTH = 1
On Error Resume Next

' Browser security requires enabled/Prompt for "Initialize and


' script ActiveX Controls not marked as safe"
Set
pList=oFac.OpenDSObject(path,vbNullString,vbNullString,ADS_SECURE_AUTH)

' pList now represents an uninitialized empty property cache


pList.Put "Owner" "JeffSmith" ' Property cache remain uninitialized
' but with one property value.

v = pList.Get("Division") ' pList.GetInfo is called implicitly


ShowPropertyCache ' This will display "JeffSmith" for Owner,
' "Fabrikam" for Division, "Windows NT"
' for OperatingSystem, and so on.

pList.GetInfo ' Refreshes entire cache, overwriting


' "JeffSmith" for the Owner property.
ShowPropertyCache ' This will display "Owner" for Owner,
' "Fabrikam" for Division, "Windows NT"
' for OperatingSystem, and so on.
end sub

sub ShowPropertyCache()
txtOwner.value = pList.Get("Owner")
txtDiv.value = pList.Get("Division")
txtOS.Value = pList.Get("OperatingSystem")
txtOSV.value = pList.Get("OperatingSystemVersion")
end sub
</script>

</html>
O exemplo de código a seguir realça o efeito de Get e GetInfo. Para resumir, a
verificação de erros é omitida.

C++

IADs *pADs;
IADsPropertyList *pList;
BSTR bstr;
VARIANT var;
HRESULT hr;

hr = ADsGetObject(L"WinNT://somecomputer,computer",
IID_IADsPropertyList,
(void**)&pList);

if(!(hr==S_OK)){return hr;}

VariantInit(&var);

// Get the number of property entries, should be zero.


long pCount;
hr = pList->get_PropertyCount(&pCount);
printf(" prop count = %d\n",pCount); // 0 for empty cache.

hr = pList->QueryInterface(IID_IADs, (void**)&pADs);

// Set "Owner=JeffSmith" in the property cache.


V_BSTR(&var) = SysAllocString(L"JeffSmith");
V_VT(&var) = VT_BSTR;
hr = pADs->Put(CComBSTR("Owner"), var);
VariantClear(&var);

// This time the number of property entries should read one (1).
hr = pList->get_PropertyCount(&pCount);
printf(" prop count = %d\n",pCount); // 1 for what was set.

// The following Get invokes GetInfo implicitly, but


// the cache (that is, "Owner=JeffSmith") remains intact.
hr = pADs->Get(CComBSTR("Division"), &var);
printf(" division = %S\n", V_BSTR(&var));
VariantClear(&var);

hr = pADs->Get(CComBSTR("Owner"), &var);
printf(" owner = %S\n", V_BSTR(&var)); // Owner = JeffSmith
VariantClear(&var);

// The following GetInfo call refreshes the entire prop cache.


// Now Owner is no longer "JeffSmith", but the value stored in the
// persistent store, for example, "BenSmith".
hr = pADs->GetInfo();

hr = pADs->Get(CComBSTR("Owner"), &var);
printf(" owner = %S\n", V_BSTR(&var)); // Owner = BenSmith
VariantClear(&var);

// ...

if(pADs)
pADs->Release();

if(pList)
pList->Release();

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Iads

IADs::Get

IADs::GetEx

IADs::GetInfoEx

Cache de Propriedades

Comentários
Esta página foi útil?  Yes  No
Método IADs::GetInfoEx (iads.h)
Artigo24/08/2023

O método IADs::GetInfoEx carrega os valores das propriedades especificadas do objeto


ADSI do repositório de diretórios subjacente no cache de propriedades.

Sintaxe
C++

HRESULT GetInfoEx(
[in] VARIANT vProperties,
[in] long lnReserved
);

Parâmetros
[in] vProperties

Matriz de entradas de cadeia de caracteres Unicode terminadas em nulo que listam as


propriedades a serem carregadas no cache de propriedades do Active Directory. Cada
nome de propriedade deve corresponder a um na definição da classe de esquema deste
objeto.

[in] lnReserved

Reservado para uso futuro. Deve ser definido como zero.

Valor retornado
Esse método dá suporte aos valores retornados padrão, bem como aos seguintes.

Para obter mais informações, consulte Códigos de erro ADSI.

Comentários
O método IADs::GetInfoEx substitui todos os valores armazenados em cache
anteriormente das propriedades especificadas por aqueles no repositório de diretórios.
Portanto, qualquer alteração feita no cache será perdida se IADs::SetInfo não tiver sido
invocado antes da chamada para IADs::GetInfoEx.
Use IADs::GetInfoEx para atualizar valores da propriedade selecionada no cache de
propriedades de um objeto ADSI. Use IADs::GetInfo para atualizar todos os valores de
propriedade.

Para um objeto de contêiner ADSI, IADs::GetInfoEx armazena em cache apenas os


valores de propriedade do contêiner, mas não os dos objetos filho.

Exemplos
O exemplo de código a seguir mostra como usar o IADs::GetInfoEx para obter valores
das propriedades selecionadas, supondo que os valores de propriedade desejados
possam ser encontrados no diretório .

VB

Dim x As IADs
On Error GoTo Cleanup

Set x = GetObject("LDAP://CN=JeffSmith,CN=Users,DC=Fabrikam,DC=com")

' Retrieve givenName and sn from the underlying directory storage.


' Cache should have givenName and sn values.
x.GetInfoEx Array("givenName", "sn"), 0
Debug.Print x.Get("givenName") ' Property is in the cache.
Debug.Print x.Get("sn") ' Property is in the cache.

' If the "homePhone" property is not in the cache (in the next line),
' GetInfo is called implicitly.
Debug.Print x.Get("homePhone")

Cleanup:
If(Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number);
End If

Set x = Nothing

O exemplo de código a seguir mostra como usar o IADs::GetInfoEx para obter valores
das propriedades selecionadas, supondo que os valores de propriedade desejados
possam ser encontrados no diretório . Para resumir, a verificação de erros foi omitida.

C++

IADs *pADs = NULL;


VARIANT var;
HRESULT hr = S_OK;
hr = ADsGetObject(L"WinNT://somecomputer,computer",
IID_IADs,
(void**)&pADs);

if(!(hr==S_OK)){return hr;}

VariantInit(&var);

// Get "Owner" and "Division" attribute values.


LPWSTR pszAttrs[] = { L"Owner", L"Division" };
DWORD dwNumber = sizeof( pszAttrs ) /sizeof(LPWSTR);
hr = ADsBuildVarArrayStr( pszAttrs, dwNumber, &var );
hr = pADs->GetInfoEx(var, 0);
VariantClear(&var);

hr = pADs->Get(CComBSTR("Division"), &var);
printf(" division = %S\n", V_BSTR(&var));
VariantClear(&var);
hr = pADs->Get(CComBSTR("Owner"), &var);
printf(" owner = %S\n", V_BSTR(&var));
VariantClear(&var);

if(pADs)
pADs->Release();

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Iads

IADs::GetInfo

IADs::SetInfo
Cache de Propriedades

Comentários
Esta página foi útil?  Yes  No
Método IADs::P ut (iads.h)
Artigo24/08/2023

O método IADs::P ut define os valores de um atributo no cache de atributo ADSI.

Sintaxe
C++

HRESULT Put(
[in] BSTR bstrName,
[in] VARIANT vProp
);

Parâmetros
[in] bstrName

Contém um BSTR que especifica o nome da propriedade.

[in] vProp

Contém uma VARIANT que especifica os novos valores da propriedade .

Valor retornado
Esse método dá suporte aos valores retornados padrão, bem como aos seguintes.

Para obter mais informações e outros valores retornados, consulte Códigos de erro
ADSI.

Comentários
A atribuição dos novos valores de propriedade, executada por Put , ocorre apenas no
cache de propriedades. Para propagar as alterações no repositório de diretórios, chame
IADs::SetInfo no objeto depois de chamar Put.

Para manipular os valores de propriedade além de uma atribuição simples, use Put para
acrescentar ou remover um valor de uma matriz existente de valores de atributo.
Exemplos
O exemplo de código a seguir mostra como usar o método IADs::P ut .

VB

Dim x As IADs
On Error GoTo Cleanup

Set x = GetObject("LDAP://CN=JeffSmith,CN=Users,DC=Fabrikam, DC=Com")


x.Put "givenName", "Jeff"
x.Put "sn", "Smith"
x.SetInfo ' Commit to the directory.

Cleanup:
If(Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set x = Nothing

O exemplo de código a seguir mostra como usar o método IADs::P ut .

C++

HRESULT hr;
IADs *pADs = NULL;
LPWSTR pszADsPath = L"LDAP://CN=JeffSmith,CN=Users,DC=Fabrikam,DC=com";

CoInitialize(NULL);

//////////////////////////////////
// Modifying attributes using IADs
//////////////////////////////////
hr = ADsGetObject(pszADsPath, IID_IADs, (void**) &pADs);

if(SUCCEEDED(hr))
{
VARIANT var;
VariantInit(&var);

// Set the first name.


V_BSTR(&var) = SysAllocString(L"Jeff");
V_VT(&var) = VT_BSTR;
hr = pADs->Put(CComBSTR("givenName"), var);

// Set the last name.


VariantClear(&var);
V_BSTR(&var) = SysAllocString(L"Smith");
V_VT(&var) = VT_BSTR;
hr = pADs->Put(CComBSTR("sn"), var);
VariantClear(&var);
// Other Telephones.
LPWSTR pszPhones[] = { L"425-707-9790", L"425-707-9791" };
DWORD dwNumber = sizeof(pszPhones)/sizeof(LPWSTR);
hr = ADsBuildVarArrayStr(pszPhones, dwNumber, &var);
hr = pADs->Put(CComBSTR("otherTelephone"), var);
VariantClear(&var);

// Commit the change to the directory.


hr = pADs->SetInfo();
pADs->Release();
}

CoUninitialize();

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Iads

IADs::Get

IADs::GetEx

IADs::P utEx

Cache de Propriedades

Comentários
Esta página foi útil?  Yes  No
Método IADs::P utEx (iads.h)
Artigo24/08/2023

O método IADs::P utEx modifica os valores de um atributo no cache de atributos ADSI.


Por exemplo, para propriedades que permitem vários valores, você pode acrescentar
valores adicionais a um conjunto de valores existente, modificar os valores no conjunto,
remover valores especificados do conjunto ou excluir valores do conjunto.

Sintaxe
C++

HRESULT PutEx(
[in] long lnControlCode,
[in] BSTR bstrName,
[in] VARIANT vProp
);

Parâmetros
[in] lnControlCode

Código de controle que indica o modo de modificação: Acrescentar, Substituir, Remover


e Excluir. Para obter mais informações e uma lista de valores, consulte
ADS_PROPERTY_OPERATION_ENUM.

[in] bstrName

Contém um BSTR que especifica o nome da propriedade.

[in] vProp

Contém uma matriz VARIANT que contém o novo valor ou valores da propriedade .
Uma propriedade de valor único é representada como uma matriz com um único
elemento. Se InControlCode for definido como ADS_PROPERTY_CLEAR, o valor da
propriedade especificada por vProp será irrelevante.

Valor retornado
Esse método dá suporte a valores retornados padrão, bem como aos seguintes.
Para obter mais informações, consulte Códigos de erro ADSI.

Comentários
PutEx geralmente é usado para definir valores em atributos de vários valores. Ao
contrário do método IADs::P ut , com PutEx, você não precisa obter os valores de
atributo antes de modificá-los. No entanto, como PutEx faz alterações apenas em
valores de atributos contidos no cache de propriedades ADSI, você deve usar
IADs::SetInfo após cada chamada PutEx para confirmar as alterações no diretório.

PutEx permite que você acrescente valores a um conjunto existente de valores em um


atributo de vários valores usando ADS_PROPERTY_APPEND. Ao atualizar, acrescentar ou
excluir valores a um atributo de vários valores, você deve usar uma matriz.

O Active Directory não aceita valores duplicados em um atributo de vários valores. Se


você chamar PutEx para acrescentar um valor duplicado a um atributo de vários valores
de um objeto do Active Directory, a chamada PutEx terá êxito, mas o valor duplicado
será ignorado.

Da mesma forma, se você usar PutEx para excluir um ou mais valores de uma
propriedade de vários valores de um objeto do Active Directory, a operação terá êxito,
ou seja, não produzirá um erro, mesmo que qualquer um ou todos os valores
especificados não estejam definidos na propriedade .

Nota O provedor WinNT ignora o valor passado pelo argumento InControlCode e


executa o equivalente a uma solicitação de ADS_PROPERTY_UPDATE ao usar
PutEx.

Exemplos
O exemplo de código a seguir mostra como usar o método IADs.PutEx .

VB

Dim x As IADs

On Error GoTo Cleanup

Set x = GetObject("LDAP://CN=JeffSmith,CN=Users,DC=Fabrikam,DC=com")
'----------------------------------------------------------
' Assume the otherHomePhone has the values
' 425-707-9790, 425-707-9791
'----------------------------------------------------------

' Adding a value


x.PutEx ADS_PROPERTY_APPEND, "otherhomePhone", Array("425-707-9792")
x.SetInfo ' Now the values are 425-707-9790,425-707-9791,425-
707-9792.
deleting two values
x.PutEx ADS_PROPERTY_DELETE, "otherHomePhone", Array("425-707-9790", "425-
707-9791")
x.SetInfo ' Now the values are 425-707-9792.

' Changing the remaining value


x.PutEx ADS_PROPERTY_UPDATE, "otherHomePhone", Array("425-707-9793", "425-
707-9794")
x.SetInfo ' Now the values are 425-707-9793,425-707-9794.

' Deleting the value


x.PutEx ADS_PROPERTY_CLEAR, "otherHomePhone", vbNullString
x.SetInfo ' Now the property has no value.

Cleanup:
If(Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set x = Nothing

O exemplo de código a seguir mostra como usar o método IADs::P utEx .

C++

HRESULT hr;
IADs *pADs=NULL;
LPWSTR pszADsPath = L"LDAP://CN=JeffSmith,CN=Users,DC=Fabrikam,DC=com";

CoInitialize(NULL);

hr = ADsGetObject(pszADsPath, IID_IADs, (void**) &pADs);

if(SUCCEEDED(hr))
{
VARIANT var;
VariantInit(&var);

LPWSTR pszPhones[] = { L"425-707-9790", L"425-707-9791" };


DWORD dwNumber = sizeof(pszPhones)/sizeof(LPWSTR);
hr = ADsBuildVarArrayStr(pszPhones, dwNumber, &var);
hr = pADs->Put(CComBSTR("otherHomePhone"), var);
VariantClear(&var);
hr = pADs->SetInfo(); // The phone list is now 425-707-9790, 425-707-
9791.

// Append another number to the list.


LPWSTR pszAddPhones[]={L"425-707-9792"};
hr = ADsBuildVarArrayStr(pszAddPhones, 1, &var);
hr = pADs->PutEx(ADS_PROPERTY_APPEND, CComBSTR("otherHomePhone"), var);
hr = pADs->SetInfo(); // The list becomes
// 425-707-9790, 425-707-9791, 425-707-9792.
VariantClear(&var);

hr = ADsBuildVarArrayStr(pszPhones, dwNumber, &var);


hr = pADs->PutEx(ADS_PROPERTY_DELETE, CComBSTR("otherHomePhone"), var);
hr = pADs->SetInfo(); // The list becomes 425-707-9792.

pszPhones[0] = L"425-707-9793";
pszPhones[1] = L"425-707-9794";
hr = ADsBuildVarArrayStr(pszPhones, dwNumber, &var);
hr = pADs->PutEx(ADS_PROPERTY_UPDATE, CComBSTR("otherHomePhone"), var);
hr = pADs->SetInfo(); // The list becomes 425-707-9793, 425-707-9794.

VariantClear(&var);
V_VT(&var)=VT_NULL;
hr = pADs->PutEx(ADS_PROPERTY_CLEAR, CComBSTR("otherHomePhone"), var);
hr = pADs->SetInfo(); // The list is empty.

VariantClear(&var);
pADs->Release();
}

hr = CoUninitialize();

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Iads

IADs::Get

IADs::GetEx
IADs::P ut

Cache de Propriedades

Comentários
Esta página foi útil?  Yes  No
Método IADs::SetInfo (iads.h)
Artigo24/08/2023

O método IADs::SetInfo salva os valores de propriedade armazenados em cache do


objeto ADSI no repositório de diretórios subjacente.

Sintaxe
C++

HRESULT SetInfo();

Valor retornado
Esse método dá suporte aos valores retornados padrão, incluindo S_OK para uma
operação bem-sucedida. Para obter mais informações, consulte Códigos de erro ADSI.

Comentários
É importante enfatizar as diferenças entre os métodos IADs::P ut e IADs::SetInfo . O
primeiro define (ou modifica) valores de uma determinada propriedade no cache de
propriedades, enquanto o último propaga as alterações do cache de propriedades para
o repositório de diretórios subjacente. Portanto, todas as alterações de valor de
propriedade feitas por IADs::P ut serão perdidas se IADs::GetInfo (ou IADs::GetInfoEx)
for invocada antes que IADs::SetInfo seja chamado.

Como IADs::SetInfo envia dados entre redes, minimize o uso desse método. Isso reduz
o número de viagens que um cliente faz ao servidor. Por exemplo, você deve confirmar
todas ou a maioria das alterações nas propriedades do cache para o repositório
persistente em um lote.

Essa diretriz pertence apenas à relação de IADs::SetInfo com o método IADs::P ut , que
difere da relação com o método IADs::P utEx .

O exemplo de código a seguir ilustra a relação recomendada entre IADs::P ut e


IADs::SetInfo.

VB
Dim obj as IADs

obj.Put(prop1,val1)
obj.Put(prop2.val2)
obj.Put(prop3.val3)
obj.SetInfo

O exemplo de código a seguir ilustra o que não é recomendado entre IADs::P ut e


IADs::SetInfo.

VB

obj.Put(prop1,val1)
obj.SetInfo
obj.Put(prop2.val2)
obj.SetInfo
obj.Put(prop3.val3)
obj.SetInfo

Quando usado com IADs::P utEx, IADs::SetInfo passa as solicitações operacionais


especificadas por códigos de controle, como ADS_PROPERTY_UPDATE ou
ADS_PROPERTY_CLEAR, para o repositório de diretórios subjacente.

Exemplos
O exemplo de código do Visual Basic a seguir usa o método IADs::SetInfo para salvar o
valor da propriedade de um usuário no diretório subjacente.

VB

Dim x as IADs
On Error GoTo Cleanup

Set x = GetObject("LDAP://CN=Administrator,CN=Users,DC=Fabrikam,DC=com")
'
' Update values in the cache.
'
x.Put "sn", "Smith"
x.Put "givenName", "Jeff"
x.Put "street", "1 Tanka Place"
x.Put "l", "Sammamish"
x.Put "st", "Washington"
'
' Commit changes to the directory.
x.SetInfo

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set x = Nothing

O exemplo de código C++ a seguir atualiza os valores de propriedade no cache de


propriedades e confirma a alteração no repositório de diretórios usando IADs::SetInfo.
Para resumir, a verificação de erros é omitida.

C++

IADs *pAds NULL;


VARIANT var;
HRESULT hr = S_OK;
LPWSTR path=L"LDAP://CN=Administrator,CN=Users,DC=Fabrikam,DC=com";
hr = ADsGetObject( path, IID_IADs, (void**) pADs);

if(!(hr==S_OK)) {return hr;}

VariantInit(&var);
// Update values in the cache.
V_BSTR(&var) = SysAllocString(L"Smith");
V_VT(&var) = VT_BSTR;
hr = pADs->Put(CComBSTR("sn"), var );
VariantClear(&var);

V_BSTR(&var) = SysAllocString(L"Jeff");
V_VT(&var) = VT_BSTR;
hr = pADs->Put(CComBSTR("givenName"), var );
VariantClear(&var);

V_BSTR(&var) = SysAllocString(L"1 Tanka Place");


V_VT(&var) = VT_BSTR;
hr = pADs->Put(CComBSTR("street"), var );
VariantClear(&var);

V_BSTR(&var) = SysAllocString(L"Sammamish");
V_VT(&var) = VT_BSTR;
hr = pADs->Put(CComBSTR("l"), var );
VariantClear(&var);

V_BSTR(&var) = SysAllocString(L"Washington");
V_VT(&var) = VT_BSTR;
hr = pADs->Put(CComBSTR("st"), var );
VariantClear(&var);

// Commit changes to the directory store.


hr = pADs->SetInfo();

if(pADs)
pADs->Release();
Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Iads

IADs::GetInfo

IADs::GetInfoEx

IADs::P ut

IADs::P utEx

Comentários
Esta página foi útil?  Yes  No
Interface IADsContainer (iads.h)
Artigo24/08/2023

A interface IADsContainer permite que um objeto de contêiner ADSI crie, exclua e


gerencie objetos ADSI contidos. Objetos de contêiner representam árvores de diretório
hierárquicas, como em um sistema de arquivos, e para organizar a hierarquia de
diretório.

Você pode usar a interface IADsContainer para enumerar objetos contidos ou gerenciar
seu ciclo de vida. Um exemplo seria navegar recursivamente em uma árvore de
diretório. Ao consultar a interface IADsContainer em um objeto ADSI, você pode
determinar se o objeto tem filhos. Se não houver suporte para a interface, o objeto será
uma folha. Caso contrário, ele é um contêiner. Você pode continuar esse processo para
os objetos de contêiner recém-encontrados. Para criar, copiar ou excluir um objeto,
envie a solicitação para o objeto contêiner para executar a tarefa.

Herança
A interface IADsContainer herda da interface IDispatch . IADsContainer também tem
esses tipos de membros:

Métodos
A interface IADsContainer tem esses métodos.

IADsContainer::CopyHere

O método IADsContainer::CopyHere cria uma cópia do objeto de diretório especificado neste


contêiner.

IADsContainer::Create

Configura uma solicitação para criar um objeto de diretório da classe de esquema especificada e
um determinado nome no contêiner.

IADsContainer::D elete

Exclui um objeto de diretório especificado desse contêiner.

IADsContainer::get__NewEnum
Recupera um objeto enumerador para o contêiner.

IADsContainer::GetObject

Recupera uma interface para um objeto de diretório no contêiner.

IADsContainer::MoveHere

Move um objeto especificado para o contêiner que implementa essa interface.

Comentários
Para determinar se um objeto é um contêiner, use a propriedade IADsClass.Container do
objeto .

Ao associar a um objeto de contêiner usando seu GUID (ou SID), você só pode executar
operações específicas no objeto contêiner. Essas operações incluem o exame dos
atributos de objeto e a enumeração dos filhos imediatos do objeto. Essas operações são
mostradas no exemplo de código a seguir.

VB

Dim con As IADsContainer


Dim obj As IADs
Set con = GetObject("LDAP://svr01/<GUID=xxxx>")
con.Filter = Array("user")
For Each item In con
debug.print item.Name " & " of " & item.Class
Next

Todas as outras operações, ou seja, GetObject, Create, Delete, CopyHere e MoveHere


não têm suporte na representação GUID do contêiner. Por exemplo, a última linha do
exemplo de código a seguir resultará em um erro.

VB

Dim con As IADsContainer


Dim obj As IADs
Set con = GetObject("LDAP://svr01/<GUID=xxxx>")
Set obj = con.GetObject("user", "CN=Jeff Smith")

A associação, usando GUID (ou SID), destina-se a baixa sobrecarga e, portanto,


associações rápidas, que geralmente são usadas para introspecção de objeto.
Para chamar esses métodos do contêiner associado com seu GUID (ou SID), reassociado
ao objeto usando seu nome diferenciado.

VB

Dim conGUID, conDN As IADsContainer


Dim obj As IADs
Set conGUID = GetObject("LDAP://svr/<GUID=xxxx>")
Set conDN=GetObject("LDAP://svr/" & conGUID.Get("distinguishedName"))
Set obj = conDN.GetObject("user", "CN=Jeff Smith")

Para obter mais informações sobre a representação do GUID do objeto, consulte


IADs.GUID.

Exemplos

O exemplo de código a seguir determina se um objeto ADSI é um contêiner.

VB

Dim obj As IADs


Dim cls As IADsClass
On Error GoTo Cleanup

Set obj = GetObject("WinNT://myComputer,computer")


Set cls = GetObject(obj.Schema)
If (cls.Container = TRUE) Then
MsgBox "The object is a container."
Else
MsgBox "The object is a leaf."
End If

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set obj = Nothing
Set cls = Nothing

O exemplo de código a seguir determina se um objeto ADSI é um contêiner.

C++

IADs *pADs = NULL;


IADsClass *pCls = NULL;
HRESULT hr = S_OK;
BSTR bstr;

hr = ADsGetObject(L"WinNT://myComputer,computer", IID_IADs, (void**)&pADs);


if(FAILED(hr)){return;}

pADs->get_Schema(&bstr);
hr = ADsGetObject(bstr, IID_IADsClass, (void**)&pCls);
pADs->Release();
SysFreeString(bstr);

if(FAILED(hr)){return;}

VARIANT_BOOL isContainer;
pCls->get_Container(&isContainer);

if(isContainer)
printf("Object is a container.\n");
else
printf("Object is not a container.\n");

pCls->Release();

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Criando e excluindo objetos

IADs::get_GUID

IADsClass::get_Container

IADsNamespaces

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos da propriedade IADsContainer
Artigo • 13/06/2023

Os métodos de propriedade da interface IADsContainer obtêm ou definem as


propriedades descritas na tabela a seguir. Para obter mais informações e uma discussão
geral sobre métodos de propriedade, consulte Métodos de propriedade de interface.

Propriedades
Count

Recupera o número de itens no contêiner. Quando Filter é definido, Count retorna


apenas o número de itens filtrados.

Tipo de acesso: Somente leitura

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_Count(
[out] LONG* plCount
);

Filter

Recupera ou define o filtro usado para selecionar classes de objeto em uma


determinada enumeração. Essa é uma matriz variante, cujo elemento é o nome de uma
classe de esquema. Se Filter não estiver definido como vazio, todos os objetos de todas
as classes serão recuperados pelo enumerador .

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT

syntax

// C++ method syntax


HRESULT get_Filter(
[out] VARIANT* pvFilter
);
HRESULT put_Filter(
[in] VARIANT vFilter
);
Dicas

Uma matriz variante de cadeias de caracteres BSTR . Cada elemento identifica o nome
de uma propriedade encontrada na definição de esquema. O parâmetro vHints permite
que o cliente indique quais atributos carregar para cada objeto enumerado. Esses dados
podem ser usados para otimizar o acesso à rede. A implementação exata, no entanto, é
específica do provedor e atualmente não é usada pelo provedor WinNT.

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT

syntax

// C++ method syntax


HRESULT get_Hints(
[out] VARIANT* pvHints
);
HRESULT put_Hints(
[in] VARIANT vHints
);

Comentários
Os processos de enumeração em IADsContainer::get__NewEnum e
IADsContainer::get_Count são executados nos objetos contidos no cache. Quando um
contêiner contém um grande número de objetos, o desempenho pode ser afetado. Para
melhorar o desempenho, desative o cache, configure um tamanho de página
apropriado e use a interface IDirectorySearch . Por esse motivo, não há suporte para a
propriedade get_Count no provedor LDAP da Microsoft.

Exemplos
O exemplo de código do Visual Basic a seguir mostra como os métodos de propriedade
de IADsContainer podem ser usados.

VB

Dim cont As IADsContainer


Dim usr As IADsUser

On Error GoTo Cleanup

Set cont = GetObject("LDAP://OU=Sales, DC=Fabrikam, DC=COM")


cont.Hints = Array("adminDescription") ' Load this attribute. Optional.
Debug.Print cont.Get("adminDescription")

' Filter users.


cont.Filter = Array("user")

For Each usr In cont


Debug.Print usr.Name
Next

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set cont = Nothing
Set usr = Nothing

O exemplo de código C++ a seguir mostra como os métodos de propriedade de


IADsContainer podem ser usados. Para resumir, a verificação de erros é omitida.

C++

IADsContainer *pCont;
IADs *pChild;
IADs *pADs;

HRESULT hr = ADsGetObject(L"LDAP://OU=Sales,DC=Fabrikam,DC=COM",
IID_IADsContainer,
(void**)&pCont);

if(FAILED(hr)){goto Cleanup;}

LPWSTR pszArray[] = { L"adminDescription" };


DWORD dwNumber = sizeof(pszArray)/sizeof(LPWSTR);
hr = ADsBuildVarArrayStr( pszArray, dwNumber, &var);
if(FAILED(hr)){goto Cleanup;}

hr = pCont->put_Hints( var );
if(FAILED(hr)){goto Cleanup;}

VariantClear(&var);

hr = pCont->QueryInterface(IID_IADs, (void**)pADs);
if(FAILED(hr)){goto Cleanup;}

hr = pADs->Get(CComBSTR("adminDescription"), var);

LPWSTR pszUsers = {L"user"};


dwNumber = sizeof(pszUsers)/sizeof(LPWSTR);
hr = ADsBuildVarArrayStr(pszUsers, dwNumber, &var);
hr = pCont->put_Filter( var );
VariantClear(&var);
// Enumerate user objects in the container.
IEnumVARIANT *pEnum = NULL;
hr = ADsBuildEnumerator(pCont, &pEnum);
pCont->Release(); // Not required when users are enumerated.

ULONG lFetch;
VariantClear(&var);
while (SUCCEEDED(ADsEnumerateNext(pEnum, 1, &var, &lFetch)) &&
lFetch==1) {
hr = V_DISPATCH(&var)->QueryInterface(IID_IADs, (void**)&pChild)
if(SUCCEEDED(hr)) {
BSTR bstrName;
pChild->get_Name(&bstrName);
printf(" %S\n", bstrName);
SysFreeString(bstrName);
pChild->Release();
}
VariantClear(&var);
}
Cleanup:
if(pADs)
pADs->Release();

if(pCont)
pCont->Release();

if(pChild)
pChild->Release();

VariantClear(&var);

Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsContainer é definido como 001677D0-FD16-11CE-ABC4-


02608C9E7553

Confira também
IADsContainer

Idirectorysearch

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Método IADsContainer::CopyHere
(iads.h)
Artigo24/08/2023

O método IADsContainer::CopyHere cria uma cópia do objeto de diretório especificado


neste contêiner.

Sintaxe
C++

HRESULT CopyHere(
[in] BSTR SourceName,
[in] BSTR NewName,
[out] IDispatch **ppObject
);

Parâmetros
[in] SourceName

O ADsPath do objeto a ser copiado.

[in] NewName

Nome opcional do novo objeto dentro do contêiner. Se um novo nome não for
especificado para o objeto , defina como NULL; o novo objeto terá o mesmo nome que
o objeto de origem.

[out] ppObject

Ponteiro indireto para a interface IADs no objeto copiado.

Valor retornado
Esse método dá suporte aos valores retornados padrão, incluindo S_OK para uma
operação bem-sucedida. Para obter mais informações e informações de código de erro,
consulte Códigos de erro ADSI.
Comentários
O contêiner de destino deve estar no mesmo serviço de diretório que o contêiner de
origem. Um objeto não pode ser copiado em uma implementação de serviço de
diretório.

Os provedores fornecidos com ADSI retornam a mensagem de erro E_NOTIMPL .

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Iads

IADsContainer

IADsContainer::MoveHere

Comentários
Esta página foi útil?  Yes  No
Método IADsContainer::Create (iads.h)
Artigo24/08/2023

O método IADsContainer::Create configura uma solicitação para criar um objeto de


diretório da classe de esquema especificada e um determinado nome no contêiner. O
objeto não é persistente até que IADs::SetInfo seja chamado no novo objeto. Isso
permite definir propriedades obrigatórias no novo objeto.

Sintaxe
C++

HRESULT Create(
[in] BSTR ClassName,
[in] BSTR RelativeName,
[out] IDispatch **ppObject
);

Parâmetros
[in] ClassName

Nome do objeto de classe de esquema a ser criado. O nome é o retornado do método


de propriedade IADs::get_Schema .

[in] RelativeName

Nome relativo do objeto, como é conhecido no diretório subjacente e idêntico ao


recuperado por meio do método de propriedade IADs::get_Name .

[out] ppObject

Ponteiro indireto para a interface IDispatch no objeto recém-criado.

Valor retornado
Esse método dá suporte aos valores retornados padrão, incluindo S_OK para uma
operação bem-sucedida. Para obter mais informações sobre códigos de erro, consulte
Códigos de erro ADSI.
Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
IADsContainer

IADsContainer::D elete

IDispatch

Comentários
Esta página foi útil?  Yes  No
Método IADsContainer::D elete (iads.h)
Artigo24/08/2023

O método IADsContainer::D elete exclui um objeto de diretório especificado desse


contêiner.

Sintaxe
C++

HRESULT Delete(
[in] BSTR bstrClassName,
[in] BSTR bstrRelativeName
);

Parâmetros
[in] bstrClassName

O objeto de classe de esquema a ser excluído. O nome é retornado do método


IADs::get_Class . Além disso, NULL é uma opção válida para esse parâmetro. Fornecer
NULL para esse parâmetro é a única maneira de lidar com classes de esquema extintas.
Se uma instância foi criada antes da classe ser extinta, a única maneira de excluir a
instância da classe extinta é chamar IADsContainer::D elete e fornecer NULL para esse
parâmetro.

[in] bstrRelativeName

Nome do objeto como ele é conhecido no diretório subjacente e idêntico ao nome


recuperado com o método IADs::get_Name .

Valor retornado
Esse método dá suporte aos valores retornados padrão, incluindo S_OK para uma
operação bem-sucedida. Para obter mais informações sobre códigos de erro, consulte
Códigos de erro ADSI.

Comentários
O objeto a ser excluído deve ser um objeto folha ou um subcontêiner sem filhos. Para
excluir um contêiner e seus filhos, ou seja, uma subárvore, use IADsDeleteOps::D
eleteObject.

O objeto especificado é removido imediatamente depois de chamar IADsContainer::D


elete e chamar IADs::SetInfo no objeto de contêiner é desnecessário.

Ao usar o método IADsContainer::D elete para excluir um objeto em aplicativos C/C++,


libere os ponteiros de interface para esse objeto também. Isso ocorre porque o método
remove o objeto do diretório subjacente imediatamente, mas deixa intactos quaisquer
ponteiros de interface mantidos, na memória, pelo aplicativo, para o objeto excluído. Se
não for liberado, poderá ocorrer confusão porque você pode chamar IADs::Get e IADs::P
ut no objeto excluído sem erro, mas receberá um erro ao chamar IADs::SetInfo ou
IADs::GetInfo no objeto excluído.

Exemplos

O exemplo de código a seguir exclui um objeto de usuário do contêiner no Active


Directory.

VB

Dim cont as IADsContainer


On Error GoTo Cleanup

Set cont = GetObject("LDAP://OU=Sales,DC=Fabrikam,DC=com")


cont.Delete "user", "CN=JeffSmith"

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set cont = Nothing

O exemplo de código a seguir exclui um objeto de usuário do contêiner no provedor


WinNT.

VB

Dim cont as IADsContainer


On Error GoTo Cleanup

Set cont = GetObject("WinNT://Fabrikam")


cont.Delete "user", "jeffsmith"

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set cont = Nothing

O exemplo de código a seguir exclui um usuário usando IADsContainer::D elete.

C++

HRESULT hr = S_OK;
IADsContainer *pCont=NULL;

CoInitialize(NULL);

hr = ADsGetObject(L"WinNT://myMachine",
IID_IADsContainer,
(void**) &pCont);
if ( !SUCCEEDED(hr) )
{
return hr;
}

hr = pCont->Delete(CComBSTR("user"), CComBSTR("JeffSmith"));
pCont->Release();

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

IADs::Get

IADs::GetInfo
IADs::P ut

IADs::SetInfo

IADs::get_Class

IADs::get_Name

IADsContainer

IADsContainer::Create

IADsDeleteOps::D eleteObject

Comentários
Esta página foi útil?  Yes  No
Método IADsContainer::get__NewEnum
(iads.h)
Artigo24/08/2023

O método IADsContainer::get__NewEnum Recupera um objeto enumerador para o


contêiner. O objeto enumerador implementa a interface IEnumVARIANT para enumerar
os filhos do objeto contêiner.

Sintaxe
C++

HRESULT get__NewEnum(
[out] IUnknown **retval
);

Parâmetros
[out] retval

Ponteiro para um ponteiro IUnknown que recebe o objeto enumerador. O chamador


deve liberar essa interface quando ela não for mais necessária.

Valor retornado
Esse método dá suporte aos valores retornados padrão, incluindo S_OK para uma
operação bem-sucedida. Para obter mais informações sobre códigos de erro, consulte
Códigos de erro ADSI.

Comentários
Há dois caracteres de sublinhado ("__") no nome da função entre "get" e "NewEnum".

No Visual Basic, use o ForEach... instrução para invocar o método


IADsContainer::get__NewEnum implicitamente.

Em C/C++, use as funções auxiliares ADsBuildEnumerator, ADsEnumerateNext e


AdsFreeEnumerator .
Exemplos
O exemplo de código a seguir mostra como enumerar objetos filho em um contêiner.

VB

Dim cont As IADsContainer


On Error GoTo Cleanup

Set cont = GetObject("LDAP://OU=Sales,DC=Fabrikam,DC=com")


For Each obj In cont
Debug.Print obj.Name
Next

Cleanup:
If(Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set cont = Nothing

O exemplo de código a seguir mostra como enumerar o objeto contido em um


contêiner.

C++

IEnumVARIANT *pEnum = NULL;


IADsContainer *pCont = NULL;
LPUNKNOWN pUnk = NULL;
VARIANT var;
IDispatch *pDisp = NULL;
ulong lFetch;
IADs *pADs = NULL;

// In this sample, skip error checking.


ADsGetObject(L"LDAP://OU=Sales,DC=Fabrikam,DC=COM",
IID_IADsContainer, (void**) &pCont);
pCont->get__NewEnum(&pUnk);
pCont->Release();

pUnk->QueryInterface(IID_IEnumVARIANT, (void**) &pEnum);


pUnk->Release();

// Enumerate.
HRESULT hr = pEnum->Next(1, &var, &lFetch);
while(SUCCEEDED(hr) && lFetch > 0)
{
if (lFetch == 1)
{
BSTR bstr;

pDisp = V_DISPATCH(&var);
pDisp->QueryInterface(IID_IADs, (void**)&pADs);
pDisp->Release();
hr = pADs->get_Name(&bstr);
if(SUCCEEDED(hr))
{
SysFreeString(bstr);
}

pADs->Release();
}

VariantClear(&var);
hr = pEnum->Next(1, &var, &lFetch);
};

pEnum->Release();

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
ADsBuildEnumerator

ADsEnumerateNext

AdsFreeEnumerator

IADsContainer

IEnumVARIANT

IUnknown

Comentários
Esta página foi útil?  Yes  No
Método IADsContainer::GetObject
(iads.h)
Artigo24/08/2023

O método IADsContainer::GetObject recupera uma interface para um objeto de


diretório no contêiner.

Sintaxe
C++

HRESULT GetObject(
[in] BSTR ClassName,
[in] BSTR RelativeName,
[out] IDispatch **ppObject
);

Parâmetros
[in] ClassName

Um BSTR que especifica o nome da classe de objeto a partir do objeto a ser recuperado.
Se esse parâmetro for NULL, o provedor retornará o primeiro item encontrado no
contêiner.

[in] RelativeName

Um BSTR que especifica o nome diferenciado relativo do objeto a ser recuperado.

[out] ppObject

Um ponteiro para um ponteiro para a interface IDispatch no objeto especificado.

Valor retornado
Esse método dá suporte a valores retornados padrão, incluindo S_OK para uma
operação bem-sucedida. Para obter mais informações sobre códigos de erro, consulte
Códigos de erro ADSI.
Comentários
Para o provedor LDAP, o parâmetro bstrRelativeName deve conter o prefixo de nome,
como "CN=Jeff Smith". O parâmetro bstrRelativeName também pode conter mais de um
nível de nome, como "CN=Jeff Smith,OU=Sales".

Em C++, quando GetObject for bem-sucedido, o chamador deverá consultar a interface


IDispatch para a interface desejada usando o método QueryInterface .

O parâmetro bstrClassName pode ser um nome de classe válido ou NULL. Se o nome da


classe não for válido, incluindo quando ele contiver um espaço em branco, esse método
gerará um erro de E_ADS_UNKNOWN_OBJECT .

Exemplos

O exemplo de código a seguir recupera um objeto de usuário de um objeto de


contêiner.

VB

Dim cont As IADsContainer


Dim usr As IADsUser
Set cont = GetObject("LDAP://OU=Sales,DC=Fabrikam,DC=com")
Set usr = cont.GetObject("user", "CN=jeffsmith")

Isso é equivalente a:

VB

Dim usr As IADsUser


Set usr=GetObject("LDAP://CN=jeffsmith,OU=Sales,DC=Fabrikam,DC=com")

O exemplo de código a seguir recupera um objeto de usuário de um objeto de


contêiner.

C++

HRESULT hr = S_OK;
CoInitialize(NULL);

IADsContainer *pCont = NULL;

hr = ADsGetObject(L"LDAP://DC=windows2000,DC=mytest,DC=fabrikam,DC=com",
IID_IADsContainer,
(void**) &pCont );
if(FAILED(hr))
{
goto Cleanup;
}

///////////////////////////////////////////////////////////////////////
// Retrieve the child from the container.
// Be aware that in the LDAP provider you can navigate multiple levels.
///////////////////////////////////////////////////////////////////////
IDispatch *pDisp = NULL;
IADs *pADs = NULL;
hr = pCont->GetObject(CComBSTR("user"), CComBSTR("CN=Jeff Smith,OU=DSys"),
&pDisp);
pCont->Release();
if(FAILED(hr))
{
goto Cleanup;
}

hr = pDisp->QueryInterface(IID_IADs, (void**)&pADs);
pDisp->Release();
if(FAILED(hr))
{
goto Cleanup;
}

// Perform an operation with pADs.


pADs->Release();

Cleanup:
if(pCont)
pCont->Release();

if(pDisp)
pDisp->Release();

if(pADs)
pADs->Release();

CoUninitialize();

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows


Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

ADsGetObject

Iads

IADs::get_Class

IADs::get_Name

IADsContainer

IDispatch

Comentários
Esta página foi útil?  Yes  No
Método IADsContainer::MoveHere
(iads.h)
Artigo24/08/2023

O método IADsContainer::MoveHere move um objeto especificado para o contêiner


que implementa essa interface. O método pode ser usado para renomear um objeto .

Sintaxe
C++

HRESULT MoveHere(
[in] BSTR SourceName,
[in] BSTR NewName,
[out] IDispatch **ppObject
);

Parâmetros
[in] SourceName

A cadeia de caracteres Unicode terminada em nulo que especifica o ADsPath do objeto


a ser movido.

[in] NewName

A cadeia de caracteres Unicode terminada em nulo que especifica o nome relativo do


novo objeto dentro do contêiner. Isso pode ser NULL, caso em que o objeto é movido.
Se não for NULL, o objeto será renomeado adequadamente no processo.

[out] ppObject

Ponteiro para um ponteiro para a interface IDispatch no objeto movido.

Valor retornado
Esse método dá suporte a valores retornados padrão, incluindo S_OK, para uma
operação bem-sucedida. Para obter mais informações sobre códigos de erro, consulte
Códigos de erro ADSI.
Comentários
No Active Directory, você pode mover um objeto dentro do mesmo domínio ou de
domínios diferentes na mesma floresta de diretório. Para a movimentação entre
domínios, as seguintes restrições se aplicam:

O domínio de destino deve estar no modo nativo.


Os objetos a serem movidos devem ser um objeto folha ou um contêiner vazio.
O NTLM (NT LAN Manager) não pode executar a autenticação; use a autenticação
ou delegação Kerberos. Lembre-se de que, se a autenticação Kerberos não for
usada, a senha será transmitida em texto não criptografado pela rede. Para evitar
isso, use a delegação com autenticação segura.
Você não pode mover entidades de segurança (por exemplo, usuário, grupo,
computador e assim por diante) pertencentes a um grupo global. Quando uma
entidade de segurança é movida, um novo SID é criado para o objeto no destino.
No entanto, seu SID antigo da origem, armazenado no atributo sIDHistory , é
preservado, bem como a senha do objeto.

Nota Use o utilitário Movetree.exe para mover uma subárvore entre domínios
diferentes. Para mover objetos de um domínio de origem para um domínio de
destino usando a ferramenta de linha de comando Movetree, você deve se
conectar ao controlador de domínio que contém a função RID master do domínio
de origem. Se o master RID não estiver disponível, os objetos não poderão ser
movidos para outros domínios. Se você tentar mover um objeto de um domínio
para outro usando a ferramenta Movetree.exe e especificar um controlador de
domínio de origem que não seja o master RID, uma mensagem de erro não
específica "Falha de movetree".

Nota Ao usar a função ADsOpenObject para associar a um objeto ADSI, você deve
usar o sinalizador ADS_USE_DELEGATION do ADS_AUTHENTICATION_ENUM no
parâmetro dwReserved dessa função para criar movimentações entre domínios
com IADsContainer::MoveHere. A função ADsOpenObject é equivalente ao
método IADsOpenDSObject::OpenDsObject . Da mesma forma, usando o método
OpenDsObject para associar a um objeto ADSI, o parâmetro InReserved desse
método deve conter o sinalizador ADS_USE_DELEGATION do
ADS_AUTHENTICATION_ENUM para fazer movimentos entre domínios com
IADsContainer::MoveHere.
O exemplo de código a seguir move o usuário , "jeffsmith" do domínio
"South.Fabrikam.Com" para o domínio "North.Fabrikam.Com". Primeiro, ele obtém um
ponteiro IADsContainer para o contêiner de destino e, em seguida, a chamada
MoveHere especifica o caminho do objeto a ser movido.

VB

Set ou = GetObject("LDAP://server1/OU=Support,DC=North,DC=Fabrikam,DC=COM")
ou.MoveHere("LDAP://server2/CN=jeffsmith,OU=Sales,DC=South,DC=Fabrikam,DC=Co
m", vbNullString)

Um ADsPath sem servidor pode ser usado para a origem ou o destino ou ambos.

O método IADsContainer::MoveHere pode ser usado para renomear um objeto dentro


do mesmo contêiner ou para mover um objeto entre contêineres diferentes. Mover um
objeto retém o RDN do objeto, enquanto renomear um objeto altera o RDN.

Por exemplo, o exemplo de código a seguir executa a ação renomear.

VB

set cont = GetObject("LDAP://dc=dom,dc=com")


set newobj = cont.MoveHere("LDAP://cn=Jeff Smith,dc=dom,dc=com", "cn=Denise
Smith")

O exemplo de código a seguir executa a movimentação.

VB

set cont = GetObject("LDAP://dc=dom,dc=com")


set newobj = cont.MoveHere("LDAP://cn=jeffsmith,ou=sales,dc=dom,dc=com",
"cn=jeffsmith")

Em aplicativos do Visual Basic, você pode passar vbNullString como o segundo


parâmetro ao mover um objeto de um contêiner para outro.

VB

Set newobj = cont.MoveHere("LDAP://cn=jeffsmith,ou=sale,dc=dom,dc=com",


vbNullString)

No entanto, você não pode fazer o mesmo com o VBScript. Isso ocorre porque o
VBScript mapeia vbNullString para uma cadeia de caracteres vazia em vez de para uma
cadeia de caracteres nula, assim como o Visual Basic. Você deve usar o RDN
explicitamente, conforme mostrado no exemplo anterior.
Nota O provedor WinNT dá suporte a IADsContainer::MoveHere, mas somente
para renomear grupos de usuários & em um domínio.

Exemplos
O exemplo de código a seguir mostra como usar esse método para renomear um
objeto .

VB

Dim cont As IADsContainer


Dim usr As IADsUser

On Error GoTo Cleanup


' Rename an object.
Set cont = GetObject("LDAP://OU=Sales, DC=Fabrikam,DC=com")
Set usr = cont.MoveHere("LDAP://CN=jeffsmith,OU=Sales, DC=Fabrikam,DC=com",
"CN=jayhenningsen")

' Move an object.


cont.MoveHere("LDAP://CN=denisesmith,OU=Engineer,DC=Fabrikam,DC=com",
vbNullString)

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set cont = Nothing
Set usr = Nothing

O exemplo de código a seguir move um objeto de usuário usando o método


IADsContainer::MoveHere .

C++

/////////////////////////////////////////////
// First, bind to the destination container.
////////////////////////////////////////////
HRESULT hr;
IADsContainer *pCont=NULL;
CoInitialize(NULL);
hr = ADsGetObject(
L"LDAP://OU=MCS,DC=windows2000,DC=mytest,DC=fabrikam,DC=com",
IID_IADsContainer,
(void**) &pCont );
if ( !SUCCEEDED(hr) )
{
goto Cleanup;
}

//////////////////////////////////////////////////
// Second, move the object to the bound container.
//////////////////////////////////////////////////
IDispatch *pDisp=NULL;

hr = pCont->MoveHere(CComBSTR("LDAP://CN=Jeff
Smith,OU=DSys,DC=windows2000,DC=mytest,DC=fabrikam,DC=com"), NULL, &pDisp );
pCont->Release();

if (SUCCEEDED(hr) )
{
// You can perform another operation here, such as updating attributes.
pDisp->Release();
}

Cleanup:
if(pCont)
pCont->Release();

if(pDisp)
pDisp->Release();

CoUninitialize();

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

ADS_AUTHENTICATION_ENUM
ADsOpenObject

IADsContainer

IADsContainer::CopyHere

IADsOpenDSObject::OpenDsObject

IDispatch

Comentários
Esta página foi útil?  Yes  No
Interface IADsNamespaces (iads.h)
Artigo14/03/2023

A interface IADsNamespaces é implementada pelo provedor de ADs e é usada para


gerenciar objetos de namespace. Um objeto namespace é um contêiner de nível
superior específico do provedor e corresponde ao nó raiz de uma árvore de diretório. O
objeto namespaces ADSI serve como um ponto de entrada no diretório subjacente e
permite que os administradores de serviço de diretório enumerem os objetos de
namespace atualmente instalados.

Essa interface dá suporte a dois métodos de propriedade para obter e definir a


propriedade DefaultContainer que contém o caminho para um objeto de contêiner. O
contêiner padrão é o nó base do qual a navegação da árvore de diretório prossegue.
Referências de qualquer objeto filho podem ser feitas em relação a esse contêiner
padrão. A propriedade DefaultContainer torna mais eficiente e conveniente para um
cliente referenciar repetidamente um objeto contido.

Obtenha um ponteiro para a interface IADsNamespaces ao associar ao objeto usando a


cadeia de caracteres "ADs:":

VB

Dim ns As IADsNamespaces
Set ns = GetObject("ADs:")

Os clientes que não são de Automação podem usar a função auxiliar ADsGetObject .

C++

IADsNamespaces *pNs;
hr = ADsGetObject(L"ADs:", IID_IADsNamespaces, (void**)&pNs);

Além da interface IADsNamespaces , o objeto namespaces ADSI também implementa a


interface IADsContainer .

Herança
A interface IADsNamespaces herda da interface IADs.

Requisitos
Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
ADsGetObject

Iads

IADsContainer

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos de propriedade
IADsNamespaces
Artigo • 13/06/2023

Os métodos de propriedade da interface IADsNamespaces obtêm e definem as


propriedades descritas na tabela a seguir. Para obter mais informações, consulte
Métodos de propriedade de interface.

Propriedades
DefaultContainer

A propriedade DefaultContainer identifica um objeto de contêiner base ao qual você


pode associar e usar como ponto de partida ao navegar. Esses dados são armazenados
e recuperados do valor do Registro a seguir.

HKEY_CURRENT_USER
Software
Microsoft
ADs
DefaultContainer

ADSI define a propriedade DefaultContainer para fornecer uma maneira rápida de obter
um ponteiro para um objeto de contêiner ADSI definido anteriormente.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_DefaultContainer(
[out] BSTR* pbstrDefault
);
HRESULT put_DefaultContainer(
[in] BSTR bstrDefault
);

Comentários
Os provedores devem fornecer essa propriedade por usuário. O contêiner padrão é
definido imediatamente após a invocação de IADsNamespaces::p ut_DefaultContainer.
Não é necessário chamar IADs.SetInfo . Na verdade, o objeto namespaces fornecido
pelo sistema retorna E_NOTIMPL para o método IADs.SetInfo chamado neste objeto.
Quando um contêiner é o objeto namespaces, uma operação de enumeração sempre
resulta em uma lista de objetos de namespace específicos do provedor. Quando
IADsContainer.GetObject é usado para obter um objeto namespace, o parâmetro
bstrClass é ignorado. Isso ocorre porque o contêiner, ou seja, o objeto namespaces,
contém apenas um tipo de objeto, ou seja, objetos de namespace específicos do
provedor.

Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsNamespaces é definido como 28B96BA0-B330-11CF-A9AD-


00AA006BC149

Confira também
IADsContainer.GetObject

IADsNamespaces

Métodos de propriedade interface

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interface IADsOpenDSObject (iads.h)
Artigo24/08/2023

A interface IADsOpenDSObject foi projetada para fornecer um contexto de segurança


para associação a um objeto no repositório de diretórios subjacente. Ele fornece um
meio para especificar credenciais de um cliente. Use essa interface para associar a um
objeto ADSI quando precisar fornecer um conjunto de credenciais para autenticação em
qualquer serviço de diretório.

O ADSI mantém o contexto de segurança em seu cache. Assim, em toda a conexão


dentro de um processo, depois de autenticadas, as credenciais de usuário fornecidas
são aplicadas a todas as ações executadas nesse objeto e em seus filhos. Esse modelo
de cache de credencial também se aplica à associação a objetos diferentes, desde que a
associação ocorra dentro da mesma conexão e processo.

Chamar o método OpenDSObject dessa interface produz o identificador de cache. A


liberação desse identificador de cache também libera o contexto de segurança.

Herança
A interface IADsOpenDSObject herda da interface IDispatch . IADsOpenDSObject
também tem estes tipos de membros:

Métodos
A interface IADsOpenDSObject tem esses métodos.

IADsOpenDSObject::OpenDSObject

Associa a um objeto ADSI, usando as credenciais fornecidas, e recupera um ponteiro IDispatch


para o objeto especificado.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008


Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
IADsClass

IADsOpenDSObject::OpenDSObject

IDispatch

Comentários
Esta página foi útil?  Yes  No
Método
IADsOpenDSObject::OpenDSObject
(iads.h)
Artigo24/08/2023

O método IADsOpenDSObject::OpenDSObject é associado a um objeto ADSI, usando


as credenciais fornecidas, e recupera um ponteiro IDispatch para o objeto especificado.

Importante Não é recomendável que você use esse método com o Provedor
WinNT. Para obter mais informações, consulte o artigo do KB 218497, Problemas
de autenticação de usuário com o provedor WinNT de interfaces de serviço do
Active Directory .

Sintaxe
C++

HRESULT OpenDSObject(
[in] BSTR lpszDNName,
[in] BSTR lpszUserName,
[in] BSTR lpszPassword,
[in] long lnReserved,
[out] IDispatch **ppOleDsObj
);

Parâmetros
[in] lpszDNName

A cadeia de caracteres Unicode terminada em nulo que especifica o ADsPath do objeto


ADSI. Para obter mais informações e exemplos de cadeias de caracteres de associação
para esse parâmetro, consulte LDAP ADsPath. Ao usar o provedor LDAP com um
ADsPath que inclui um nome de servidor específico, o parâmetro lnReserved deve incluir
o sinalizador ADS_SERVER_BIND .

[in] lpszUserName
A cadeia de caracteres Unicode terminada em nulo que especifica o nome de usuário a
ser usado para proteger a permissão do servidor de namespace. Para obter mais
informações, consulte a seção Comentários a seguir.

[in] lpszPassword

A cadeia de caracteres Unicode terminada em nulo que especifica a senha a ser usada
para obter permissão do servidor de namespace.

[in] lnReserved

Sinalizadores de autenticação usados para definir as opções de associação. Para obter


mais informações, consulte ADS_AUTHENTICATION_ENUM.

[out] ppOleDsObj

Ponteiro para um ponteiro para uma interface IDispatch no objeto solicitado.

Valor retornado
Esse método dá suporte aos valores de retorno padrão, incluindo S_OK quando a
interface IDispatch foi recuperada com êxito usando essas credenciais.

Para obter mais informações, consulte Códigos de erro ADSI.

Comentários
Esse método não deve ser usado apenas para validar as credenciais do usuário.

Quando lnReserved é definido, o comportamento de OpenDSObject depende do


provedor ao qual ele se conecta. Namespaces de alta segurança podem ignorar esses
sinalizadores e sempre exigir autenticação.

O método IADsOpenDSObject::OpenDSObject mantém as credenciais de usuário


autenticadas e criptografadas no cache. As credenciais armazenadas em cache podem
ser usadas em operações subsequentes para associação a outros objetos de diretório.
Os aplicativos cliente ADSI não devem armazenar em cache as credenciais fornecidas
pelo usuário. Em vez disso, eles devem contar com a infraestrutura ADSI para executar o
cache. Para usar as credenciais armazenadas em cache, lpszPassword e lpszUserName
devem permanecer inalterados em todas as chamadas subsequentes de OpenDSObject.
O exemplo de código a seguir mostra essa operação.

VB
Dim dso As IADsOpenDSObject
Dim obj1, obj2 As IADs
Dim szUsername As String
Dim szPassword As String

Set dso = GetObject("LDAP:")

' Insert code securely.

' Supply full credentials to initiate a server connection.


Set obj1 = dso.OpenDSObject( _
"LDAP://server1/CN=Dept1,DC=Fabrikam,DC=com", _
szUsername, _
szPassword, _
ADS_SECURE_AUTHENTICATION + ADS_SERVER_BIND)

' Perform an operation with the bound object, obj1


MsgBox obj1.Class

' Bind to another object with the cached user credential.


Set obj2 = dso.OpenDSObject( _
"LDAP://server1/CN=Dept2,DC=Fabrikam,DC=com", _
szUsername, _
szPassword, _
ADS_SECURE_AUTHENTICATION + ADS_SERVER_BIND)

MsgBox obj2.Class

As credenciais passadas para a função IADsOpenDSObject::OpenDSObject são usadas


apenas com o objeto específico associado a e não afetam o contexto de segurança do
thread de chamada. Isso significa que, no exemplo de código a seguir, a chamada para
IADsOpenDSObject::OpenDSObject usará credenciais diferentes da chamada para
GetObject.

VB

Dim dso As IADsOpenDSObject


Dim obj1, obj2 As IADs
Dim szUsername As String
Dim szPassword As String

Set dso = GetObject("LDAP:")

' Insert code securely.

' Bind using full credentials.


Set obj1 = dso.OpenDSObject( _
"LDAP://server1/CN=Dept1,DC=Fabrikam,DC=com", _
szUsername, _
szPassword, _
ADS_SECURE_AUTHENTICATION + ADS_SERVER_BIND)

' Bind to another object with the default credentials.


Set obj2 = GetObject("LDAP://server1/CN=Dept2,DC=Fabrikam,DC=com")

Com uma associação sem servidor, o nome do servidor, "server1", não é declarado
explicitamente. Em vez disso, o servidor padrão é usado. Somente o provedor LDAP dá
suporte à associação sem servidor. Para usar esse recurso, o computador cliente deve
estar em um domínio do Active Directory. Para tentar uma associação sem servidor de
um computador, você deve associar como um usuário de domínio.

Para que o cache de credenciais funcione corretamente, é importante manter uma


referência de objeto pendente para manter o identificador de cache. No exemplo acima,
uma tentativa de abrir "obj2" após a liberação de "obj1" resultará em uma falha de
autenticação.

O método IADsOpenDSObject usa as credenciais padrão quando lpszUserName e


lpszPassword são definidos como NULL.

Se a autenticação Kerberos for necessária para a conclusão bem-sucedida de uma


solicitação de diretório específica usando o provedor LDAP, a cadeia de caracteres de
associação lpszDNName deverá usar um ADsPath sem servidor, como "LDAP://CN=Jeff
Smith,CN=admin,DC=Fabrikam,DC=com", ou deve usar um ADsPath com um nome de
servidor DNS totalmente qualificado, como
"LDAP://central3.corp.Fabrikam.com/CN=Jeff Smith, CN=admin,DC=Fabrikam,DC=com".
A associação ao servidor usando um nome NETBIOS simples ou um nome DNS curto,
por exemplo, usando o nome curto "central3" em vez de "central3.corp.Fabrikam.com",
pode ou não gerar autenticação Kerberos.

A função auxiliar ADsOpenObject oferece os mesmos recursos que o método


IADsOpenDSObject::OpenDSObject .

Com o provedor LDAP para Active Directory, você pode passar lpszUserName como uma
das seguintes cadeias de caracteres:

O nome de uma conta de usuário, como "jeffsmith". Para usar um nome de usuário
por si só, você deve definir apenas o sinalizador ADS_SECURE_AUTHENTICATION
no parâmetro lnReserved .
O caminho do usuário de uma versão anterior do Windows, como
"Fabrikam\jeffsmith".
Nome diferenciado, como "CN=Jeff Smith,OU=Sales,DC=Fabrikam,DC=Com". Para
usar um DN, o parâmetro lnReserved deve ser zero ou deve incluir o sinalizador
ADS_USE_SSL
Nome UPN , como "jeffsmith@Fabrikam.com". Para usar um UPN, você deve
atribuir o valor UPN apropriado para o atributo userPrincipalName do objeto de
usuário de destino.

Exemplos
O exemplo de código a seguir mostra como usar IADsOpenDSObject para abrir o objeto
de usuário "Administrador" em "Fabrikam" com Autenticação Segura por meio do
provedor LDAP.

VB

Dim dso As IADsOpenDSObject


Dim domain As IADsDomain
Dim szUsername As String
Dim szPassword As String

On Error GoTo Cleanup

' Insert code to securely retrieve the user name and password.

Set dso = GetObject("LDAP:")


Set domain = dso.OpenDSObject("LDAP://Fabrikam", szUsername, _
szPassword, _
ADS_SECURE_AUTHENTICATION)

Cleanup:
If (Err.Number <> 0 ) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set dso = Nothing
Set domain = Nothing

O exemplo de código a seguir usa IADsOpenDSObject para abrir um objeto do Active


Directory por meio do provedor LDAP.

C++

IADsOpenDSObject *pDSO = NULL;


HRESULT hr = S_OK;

hr = ADsGetObject(L"LDAP:", IID_IADsOpenDSObject, (void**) &pDSO);


if (SUCCEEDED(hr))
{
IDispatch *pDisp;
hr = pDSO->OpenDSObject(CComBSTR("LDAP://DC=Fabrikam, DC=com"),
CComBSTR("jeffsmith@Fabrikam.com"),
CComBSTR("passwordhere"),
ADS_SECURE_AUTHENTICATION,
&pDisp);
pDSO->Release();
if (SUCCEEDED(hr))
{
IADs *pADs;
hr = pDisp->QueryInterface(IID_IADs, (void**) &pADs);
pDisp->Release();
if (SUCCEEDED(hr))
{
// Perform an object manipulation here.
pADs->Release();
}
}
}

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

ADS_AUTHENTICATION_ENUM

ADsOpenObject

Associação

Getobject

IADsOpenDSObject

IDispatch

LDAP ADsPath

WNetAddConnetion2
Comentários
Esta página foi útil?  Yes  No
Interfaces de esquema
Artigo • 12/06/2023

O contêiner de esquema contém um conjunto de definições de esquema anexadas a


parte da árvore de namespace do provedor. Normalmente, cada instância de um
namespace tem seu próprio esquema. Por exemplo, na figura a seguir, o provedor de
exemplo ADSI define um contêiner de esquema em cada um dos nós raiz "Seattle" e
"Toronto".

Para criar uma implementação adsi para um provedor, você precisa fornecer objetos de
gerenciamento de esquema que refletem o namespace subjacente do provedor e que
dão suporte a interfaces de esquema ADSI. Veja a seguir uma lista das interfaces de
esquema ADSI, que estão contidas no contêiner de esquema.

IADsClass representa classes de serviço de diretório.


IADsProperty representa propriedades de serviço de diretório que têm valores
únicos ou múltiplos.
IADsSyntax representa o único tipo VARIANT.

As interfaces definidas pelo ADSI podem dar suporte a propriedades e sintaxes


específicas para seu provedor. Os provedores podem optar por estender uma definição
ADSI usando os métodos que criam e acessam propriedades, por exemplo, você pode
usar os métodos da interface IADs , como Get, GetEx, Put e PutEx. Os provedores
também podem dar suporte a propriedades adicionais por meio de interfaces
adicionais. Para obter uma lista completa de interfaces ADSI, consulte Interfaces ADSI.

Um componente do provedor ADSI com um namespace complexo pode permitir que


vários esquemas existam em uma instância de namespace, cada um em uma parte
diferente da árvore. No entanto, a propriedade IADs::Schema de um objeto sempre
nomeia sua própria definição de esquema.
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interface IADsClass (iads.h)
Artigo24/08/2023

A interface IADsClass foi projetada para gerenciar objetos de classe de esquema que
fornecem definições de classe para qualquer objeto ADSI. Outras interfaces de
gerenciamento de esquema incluem IADsProperty para definições de atributo e
IADsSyntax para sintaxe de atributo.

Herança
A interface IADsClass herda de IDispatch e IADs. IADsClass também tem estes tipos de
membros:

Métodos
A interface IADsClass tem esses métodos.

IADsClass::Qualifiers

Retorna uma coleção de objetos ADSI que descrevem qualificadores adicionais para essa classe
de esquema.

Comentários
Os objetos de esquema são organizados no contêiner de esquema de um determinado
diretório. Para acessar a classe de esquema de um objeto, use a propriedade Schema do
objeto (ou seja, chame o método de propriedade IADs::get_Schema ) para obter a
cadeia de caracteres ADsPath e use essa cadeia de caracteres para associar ao objeto de
classe de esquema.

Exemplos

O exemplo de código a seguir mostra como implementar a interface IADsClass .

VB

Dim obj As IADs


Dim cls As IADsClass
On Error GoTo Cleanup

Set obj = GetObject("WinNT://myMachine,computer")


Set cls = GetObject(obj.Schema)

' Inspecting mandatory and optional properties.


For Each p In cls.MandatoryProperties
MsgBox "Must-have: " & p
Next
For Each p In cls.OptionalProperties
MsgBox "May-have: " & p
Next

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set obj = Nothing
Set cls = Nothing

O exemplo de código a seguir mostra como implementar a interface IADsClass .

C++

HRESULT hr = S_OK;
IADsClass *pCls = NULL;
IADs *pADs;
BSTR bstrSchema;
VARIANT var;

hr = CoInitialize(NULL);
hr = ADsGetObject(L"WinNT://myComputer,computer",
IID_IADs,
(void**)&pADs);
if (FAILED(hr)) { goto Cleanup;}

hr = pADs->get_Schema(&bstrSchema);
pADs->Release();
if(FAILED(hr)) { goto Cleanup; }

hr = ADsGetObject(bstrSchema, IID_IADsClass, (void**)&pCls);


if(FAILED(hr)) { goto Cleanup; }

VariantInit(&var);
pCls->get_MandatoryProperties(&var);
hr = printVarArray(var);

VariantClear(&var);
pCls->get_OptionalProperties(&var);
hr = printVarArray(var);

Cleanup:
if(pCls)
pCls->Release();

if(pADs)
pADs->Release();

SysFreeString(bstrSchema);
VariantClear(&var);
CoUninitialize();
return hr;

O exemplo de código a seguir mostra como implementar a função printVarArray .

C++

HRESULT printVarArray(VARIANT var)


{
LONG lstart, lend;
VARIANT varItem;
HRESULT hr;
SAFEARRAY *sa = V_ARRAY( &var );
hr = SafeArrayGetLBound( sa, 1, &lstart );
hr = SafeArrayGetUBound( sa, 1, &lend );
VariantInit(&varItem);
for ( long idx=lstart; idx <= lend; idx++ ) {
hr = SafeArrayGetElement( sa, &idx, &varItem );
printf(" %S \n", V_BSTR(&varItem));
VariantClear(&varItem);
}
printf("\n");
return S_OK;
}

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Iads
IADsContainer

IADsProperty

IADsSyntax

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos de propriedade IADsClass
Artigo • 13/06/2023

Os métodos de propriedade da interface IADsClass obtêm ou definem as propriedades


a seguir. Para obter mais informações, consulte Métodos de propriedade de interface.

Propriedades
Resumo

Valor booliano que indica se essa classe é Abstrata ou não abstrata. Quando TRUE, essa
classe é uma classe Abstract e não pode ser instanciada diretamente no serviço de
diretório. Classes abstratas só podem ser usadas como super classes.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BOOLEAN

syntax

// C++ method syntax


HRESULT get_Abstract(
[out] BOOLEAN* pbAbstract
);
HRESULT put_Abstract(
[in] BOOLEAN bAbstract
);

AuxDerivedFrom

Matriz de cadeias de caracteres ADsPath que indicam as classes super auxiliares das
quais essa classe deriva.

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT

syntax

// C++ method syntax


HRESULT get_AuxDerivedFrom(
[out] VARIANT* pvAuxDerivedFrom
);
HRESULT put_AuxDerivedFrom(
[in] VARIANT vAuxDerivedFrom
);
Auxiliar

Valor booliano que indica se essa classe é auxiliar ou não. Quando TRUE, essa classe é
uma classe Auxiliar e não pode ser instanciada diretamente no serviço de diretório.
Classes auxiliares só podem ser usadas como super classes de outras classes auxiliares
ou como uma fonte de propriedades adicionais em classes estruturais.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BOOLEAN

syntax

// C++ method syntax


HRESULT get_Auxiliary(
[out] BOOLEAN* pbAuxiliary
);
HRESULT put_Auxiliary(
[in] BOOLEAN bAuxiliary
);

CLSID

CLSID opcional específico do provedor que identifica o objeto COM que implementa
essa classe.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_CLSID(
[out] BSTR* pbstrCLSID
);
HRESULT put_CLSID(
[in] BSTR bstrCLSID
);

Contêiner

Valor booliano que indica se essa classe pode ser um contêiner de outras classes de
objeto. Se esse valor for TRUE, você poderá chamar o método get_Container para obter
uma matriz das classes de objeto que essa classe pode conter.
Tipo de acesso: leitura/gravação

Tipo de dados de script: BOOLEAN

syntax

// C++ method syntax


HRESULT get_Container(
[out] BOOLEAN* pbContainer
);
HRESULT put_Container(
[in] BOOLEAN bContainer
);

Contenção

Uma matriz BSTR na qual cada elemento é o nome de uma classe de objeto que essa
classe pode conter.

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT

syntax

// C++ method syntax


HRESULT get_Containment(
[out] VARIANT* pvContainment
);
HRESULT put_Containment(
[in] VARIANT vContainment
);

DerivedFrom

Matriz de cadeias de caracteres ADsPath que indicam de quais classes essa classe foi
derivada.

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT

syntax

// C++ method syntax


HRESULT get_DerivedFrom(
[out] VARIANT* pvDerivedFrom
);
HRESULT put_DerivedFrom(
[in] VARIANT vDerivedFrom
);

HelpFileContext

ID de contexto dentro de HelpFileName em que informações específicas para essa


classe podem ser encontradas.

Tipo de acesso: leitura/gravação

Tipo de dados de script: long

syntax

// C++ method syntax


HRESULT get_HelpFileContext(
[out] long* plHelpContext
);
HRESULT put_HelpFileContext(
[in] long lHelpContext
);

HelpFileName

Nome de um arquivo de ajuda que contém mais informações sobre objetos dessa
classe.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_HelpFileName(
[out] BSTR* pbstrHelpFileName
);
HRESULT put_HelpFileName(
[in] BSTR bstrHelpFileName
);

MandatoryProperties

SAFEARRAY de VARIANTs que lista as propriedades que devem ser definidas para que
essa classe seja gravada no armazenamento. Se a classe contiver apenas uma
propriedade, get_MandatoryProperties retornará um BSTR.

Tipo de acesso: leitura/gravação


Tipo de dados de script: VARIANT

syntax

// C++ method syntax


HRESULT get_MandatoryProperties(
[out] VARIANT* pvarMandatoryProperties
);
HRESULT put_MandatoryProperties(
[in] VARIANT varMandatoryProperties
);

NamingProperties

SAFEARRAY de BSTRs que lista as propriedades usadas para nomear atributos dessa
classe de esquema.

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT

syntax

// C++ method syntax


HRESULT get_NamingProperties(
[out] VARIANT* pvarNamingProperties
);
HRESULT put_NamingProperties(
[in] VARIANT varNamingProperties
);

OID

Identificador de objeto específico do provedor que define essa classe. Isso é fornecido
para permitir a extensão de esquema, usando o Active Directory, em serviços de
diretório que exigem OIDs específicos do provedor para classes.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_OID(
[out] BSTR* pbstrOID
);
HRESULT put_OID(
[in] BSTR bstrOID
);

OptionalProperties

SAFEARRAY de VARIANTs que lista as propriedades opcionais para essa classe de


esquema. Se a classe contiver apenas uma propriedade, get_OptionalProperties
retornará um BSTR.

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT

syntax

// C++ method syntax


HRESULT get_OptionalProperties(
[out] VARIANT* pvarOptionalProperties
);
HRESULT put_OptionalProperties(
[in] VARIANT varOptionalProperties
);

PossibleSuperiors

Matriz de cadeias de caracteres ADsPath que indicam as classes de esquema que


podem conter instâncias dessa classe.

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT

syntax

// C++ method syntax


HRESULT get_PossibleSuperiors(
[out] VARIANT* pvSuperiors
);
HRESULT put_PossibleSuperiors(
[in] VARIANT vSuperiors
);

PrimaryInterface

GUID de identificador específico do provedor opcional que associa uma interface a


objetos dessa classe de esquema. Por exemplo, a classe "User" que dá suporte a
IADsUser e PrimaryInterface é identificada por IID_IADsUser. Isso deve estar no
formato de cadeia de caracteres padrão de um GUID, conforme definido por COM. Esse
GUID é o valor que aparece na propriedade IADs::get_GUID em instâncias dessa classe
para provedores que implementam essa propriedade. Identificar uma classe de
esquema por IID da interface primária do código de classe permite o uso de
QueryInterface em tempo de execução para determinar se um objeto é da classe
desejada.

Tipo de acesso: Somente leitura

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_PrimaryInterface(
[out] BSTR* pbstrGUID
);

Exemplos
O exemplo de código a seguir mostra como usar a interface IADsClass para determinar
se um objeto pode ser um contêiner e, nesse caso, lista os nomes de qualquer objeto
contido.

VB

Dim ads As IADs


Dim cls As IADsClass

On Error GoTo Cleanup

Set ads = GetObject("WinNT://myComputer,computer")


Set cls = GetObject(ads.Schema)
if cls.Container = True Then
MsgBox "This object contains the following children:"
For Each o In cls.Containment
MsgBox o
Next
End If

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set ads = Nothing
Set cls = Nothing
O exemplo de código a seguir mostra como usar a interface IADsClass para determinar
se um objeto pode ser um contêiner e, nesse caso, lista os nomes de qualquer objeto
contido.

C++

HRESULT hr = S_OK;
IADsClass *pCls = NULL;
IADs *pADs = NULL;
BSTR bstrSchema;
VARIANT var;

hr = CoInitialize(NULL);
hr = ADsGetObject(L"WinNT://myComputer,computer",
IID_IADs,
(void**)&pADs);
if (FAILED(hr)) {goto Cleanup;}

hr = pADs->get_Schema(&bstrSchema);
pADs->Release();
if(FAILED(hr)) {goto Cleanup;}

hr = ADsGetObject(bstrSchema, IID_IADsClass, (void**)&pCls);


if(FAILED(hr)) {goto Cleanup;}

VariantInit(&var);
VARIANT_BOOL bCont;
pCls->get_Container(&bCont);
if(bCont != false) {
VariantClear(&var);
pCls->get_Containment(&var);
hr = printVarArray(var);
}

Cleanup:
if(pADs)
pADs->Release();

if(pCls)
pCls->Release();

SysFreeString(bstrSchema);
CoUninitialize();

Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte
Requisito Valor

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsClass é definido como C8F93DD0-4AE0-11CF-9E73-


00AA004A5691

Confira também
IADsClass

IADsClass::Qualifiers

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Método IADsClass::Qualifiers (iads.h)
Artigo24/08/2023

O método IADsClass::Qualifiers é um método opcional que retorna uma coleção de


objetos ADSI que descrevem qualificadores adicionais para essa classe de esquema.

Sintaxe
C++

HRESULT Qualifiers(
[out] IADsCollection **ppQualifiers
);

Parâmetros
[out] ppQualifiers

Endereço de uma variável de ponteiro IADsCollection que recebe o ponteiro de


interface para o objeto de coleção ADSI que representa limites adicionais para essa
classe de esquema.

Valor retornado
Esse método dá suporte aos valores retornados padrão, bem como aos seguintes.

Para obter mais informações e outros valores retornados, consulte Códigos de erro
ADSI.

Comentários
Os objetos qualificados são específicos do provedor. Quando há suporte, esse método
pode ser usado para obter dados de esquema estendidos.

Atualmente, esse método não é compatível com nenhum dos provedores da Microsoft.

Exemplos
O exemplo de código a seguir mostra como usar esse método.
VB

Dim ads As IADs


Dim cls As IADsClass
On Error GoTo Cleanup

Set ads = GetObject("WinNT://myComputer, computer")


Set cls = GetObject(ads.Schema)

' Show the user where to find additional class data.


ListBox.additem "Additional class information can be found from:"
For Each q In cls.Qualifiers
listBox.additem q.Name
Next

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set ads = Nothing
Set cls = Nothing

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
IADsClass

IADsProperty::Qualifiers

Comentários
Esta página foi útil?  Yes  No
Interface IADsProperty (iads.h)
Artigo14/03/2023

A interface IADsProperty foi projetada para gerenciar uma única definição de atributo
para um objeto de classe de esquema. Uma definição de atributo especifica os valores
mínimo e máximo de uma propriedade, sua sintaxe e se a propriedade dá suporte a
vários valores. Outras interfaces envolvidas no gerenciamento de esquema incluem
IADsClass e IADsSyntax.

A interface IADsProperty expõe métodos para descrever uma propriedade por nome,
sintaxe, intervalos de valores e quaisquer outros atributos definidos. Uma propriedade
pode ter vários nomes associados a ela, mas os provedores devem garantir que cada
nome seja exclusivo.

Use a interface IADsProperty para determinar em tempo de execução a definição de


atributo de uma propriedade compatível com um objeto de serviço de diretório.

Para determinar a definição de atributo em tempo de execução

1. Associar ao objeto de classe de esquema do objeto ADSI.


2. Enumerar atributos obrigatórios ou opcionais acessíveis do objeto de classe de
esquema. Ignore esta etapa se você souber que o objeto dá suporte ao atributo de
seu interesse.
3. Associe ao contêiner de esquema do objeto de classe de esquema obtido na
primeira etapa.
4. Recupere o objeto de definição de atributo da propriedade de interesse do
contêiner de esquema.
5. Examine a definição de atributo da propriedade . Talvez você também precise
inspecionar o objeto de sintaxe.

Herança
A interface IADsProperty herda de IDispatch e IADs. IADsProperty também tem estes
tipos de membros:

Métodos
A interface IADsProperty tem esses métodos.
IADsProperty::Qualifiers

Retorna uma coleção de objetos ADSI que descrevem qualificadores adicionais dessa
propriedade.

Comentários
Os métodos de interface IADsProperty podem adicionar novos atributos e objetos de
propriedade a uma implementação específica do provedor.

Exemplos
O exemplo de código a seguir mostra o procedimento acima para aplicar a interface
IADsProperty para determinar definições de atributo de uma propriedade.

VB

Dim obj As IADs


Dim cl As IADsClass
Dim pr As IADsProperty
Dim sy As IADsSyntax
Dim sc As IADsContainer

On Error GoTo Cleanup

' Step 1
Set obj = GetObject("WinNT://myMachine,computer")
Set cl = GetObject(obj.Schema)

' Step 2
' Skip it, assuming the "Owner" attribute is supported by obj.
' For the computer object in this example, it is indeed one of
' the supported optional properties.

' Step 3
Set sc = GetObject(cl.Parent)

' Step 4
Set pr = sc.GetObject("Property","Owner")

' Step 5
MsgBox "Attribute: " & pr.Name
MsgBox "Syntax: " & pr.Syntax
If pr.Multivalued = True Then
MsgBox "The Owner attribute has multiple values."
Else
MsgBox "The Owner attribute has a single value."
End If

' To further examine the syntax


Set sy = GetObject(sc.AdsPath & "/" & pr.Syntax)
MsgBox "Syntax object: " & sy.Name & " of OleAutoDataType: " _
& sy.OleAutoDataType

Cleanup:
If (Err.Number <> 0 ) Then
MsgBox("An error has occurred. " & Err.Number)
End If

Set obj = Nothing


Set cl = Nothing
Set pr = Nothing
Set sy = Nothing
Set sc = Nothing

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Iads

IADsClass

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos de propriedade IADsProperty
Artigo • 03/06/2023

Os métodos de propriedade da interface IADsProperty leem e gravam as propriedades


descritas na tabela a seguir. Para obter mais informações sobre métodos de
propriedade, consulte Métodos de Propriedade de Interface.

Propriedades
MaxRange

Limite superior de valores.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_MaxRange(
[out] LONG* lnMaxRange
);
HRESULT put_MaxRange(
[in] LONG lnMaxRange
);

MinRange

Limite inferior de valores.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_MinRange(
[out] LONG* lnMinRange
);
HRESULT put_MinRange(
[in] LONG lnMinRange
);
Multivalorado

Se a propriedade dá suporte a valores únicos ou múltiplos.

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT_BOOL

syntax

// C++ method syntax


HRESULT get_MultiValued(
[out] VARIANT_BOOL* fMultivalued
);
HRESULT put_MultiValued(
[in] VARIANT_BOOL fMultivalued
);

OID

Identificador de objeto específico do diretório.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_OID(
[out] BSTR* bstrOID
);
HRESULT put_OID(
[out] BSTR* bstrOID
);

Sintaxe

Caminho relativo do objeto de sintaxe.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Syntax(
[out] BSTR* bstrSyntax
);
HRESULT put_Syntax(
[in] BSTR* bstrSyntax
);

Exemplos
O exemplo de código a seguir examina o atributo OperatingSystem de um computador
em uma rede por meio do provedor WinNT.

VB

Dim obj As IADs


Dim cl As IADsClass
Dim pr As IADsProperty
Dim sc As IADsContainer

On Error GoTo Cleanup

Set obj = GetObject("WinNT://myMachine,computer")


Set cl = GetObject(obj.Schema)
Set sc = GetObject(cl.Parent)
Set pr = sc.GetObject("Property","OperatingSystem")

MsgBox "Attribute: " & pr.Name


MsgBox "Syntax: " & pr.Syntax
MsgBox "MaxRange: " & pr.MaxRange
MsgBox "MinRange: " & pr.MinRange
MsgBox "Multivalued:" & pr.Multivalued

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set obj = Nothing
Set cl = Nothing
Set pr = Nothing
Set sc = Nothing

O exemplo de código a seguir examina o atributo OperatingSystem de um computador


em uma rede por meio do provedor WinNT. Para fins de brevidade, a verificação de
erros é omitida.

C++

IADs *pADs = NULL;


IADsClass *pCls = NULL;
IADsProperty* pProp = NULL;
IADsContainer *pCont = NULL;
long lval;
short bval;
HRESULT hr = CoInitialize(NULL);

hr = ADsGetObject(L"WinNT://myMachine,computer",
IID_IADs, (void**)&pADs);
if(FAILED(hr))
goto Cleanup;

BSTR bstr;
hr = pADs->get_Schema(&bstr);
if(FAILED(hr))
goto Cleanup;

hr = ADsGetObject(bstr, IID_IADsClass, (void**)&pCls);


hr = pCls->get_Parent(&bstr);
if(FAILED(hr))
goto Cleanup;

hr = ADsGetObject(bstr, IID_IADsContainer, (void**)&pCont);


if(FAILED(hr))
goto Cleanup;
SysFreeString(bstr);

hr = pCont->GetObject(CComBSTR("Property"), CComBSTR("OperatingSystem"),
(IDispatch**)&pProp);
if(FAILED(hr))
goto Cleanup;

hr = pProp->get_Name(&bstr);
if(FAILED(hr))
goto Cleanup;
printf(" Name : %S\n",bstr);
SysFreeString(bstr);

hr = pProp->get_Syntax(&bstr);
if(FAILED(hr))
goto Cleanup;
printf(" Syntax : %S\n",bstr);
SysFreeString(bstr);

hr = pProp->get_MaxRange(&lval);
if(FAILED(hr))
goto Cleanup;
printf(" MaxRange : %d\n",lval);
SysFreeString(bstr);

hr = pProp->get_MinRange(&lval);
if(FAILED(hr))
goto Cleanup;
printf(" MinRange : %d\n", lval);
SysFreeString(bstr);

hr = pProp->get_Multivalued(&bval);
if(FAILED(hr))
goto Cleanup;
printf(" MultiValued : %b\n",bval);
SysFreeString(bstr);

Cleanup:
if(pADs)
pADs->Release();

if(pCls)
pCls->Release();

if(pCont)
pCont->Release();

if(pProp)
pProp->Release();

CoUninitialize();

Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsProperty é definido como C8F93DD3-4AE0-11CF-9E73-


00AA004A5691

Confira também
IADsClass

IADsProperty

IADsSyntax

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Método IADsProperty::Qualifiers (iads.h)
Artigo24/08/2023

O método IADsProperty::Qualifiers é um método opcional que retorna uma coleção de


objetos ADSI que descrevem qualificadores adicionais dessa propriedade.

Sintaxe
C++

HRESULT Qualifiers(
[out] IADsCollection **ppQualifiers
);

Parâmetros
[out] ppQualifiers

Ponteiro indireto para a interface IADsCollection no objeto da coleção ADSI que


representa limites adicionais para essa propriedade.

Valor retornado
Esse método dá suporte aos valores retornados padrão E_FAIL e E_UNEXPECTED, bem
como o seguinte:

Comentários
Os objetos qualificador são específicos do provedor. Quando há suporte, esse método
pode ser usado para obter dados de esquema estendidos.

Atualmente, esse método não tem suporte de nenhum dos provedores fornecidos pela
Microsoft.

Requisitos

Cliente mínimo com suporte Windows Vista


Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
IADsClass::Qualifiers

IADsCollection

IADsProperty

Comentários
Esta página foi útil?  Yes  No
Interface IADsSyntax (iads.h)
Artigo24/08/2023

A interface IADsSyntax especifica métodos para identificar e modificar os tipos de


dados de Automação disponíveis usados para representar seus dados. ADSI define um
conjunto padrão de objetos de sintaxe que podem ser usados uniformemente em várias
implementações de serviço de diretório.

Use a interface IADsSyntax para processar os valores de propriedade de qualquer


instância do objeto de classe de esquema ADSI.

Herança
A interface IADsSyntax herda de IDispatch e IADs. A IADsSyntax também tem estes
tipos de membros:

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Iads

IADsClass

IADsProperty

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos da propriedade IADsSyntax
Artigo • 12/06/2023

Os métodos de propriedade da interface IADsSyntax obtêm ou definem as


propriedades listadas na tabela a seguir. Para obter mais informações sobre métodos de
propriedade, consulte Métodos de propriedade de interface.

Propriedades
OleAutoDataType

Recupera e define um LONG que contém o valor da constante VT_xxx para o tipo de
dados automação que representa essa sintaxe.

O Active Directory dá suporte às seguintes constantes VT_xxx para o tipo de dados


automação que representa essa sintaxe:

VT_BOOL BOOL
VT_BSTR BSTR
VT_BSTRT BSTRT
VT_CY MOEDA
VT_DATE Data
VT_EMPTYNULL
VT_ERROR Não válido
VT_I2 curto
VT_I4 longo
VT_R4 real
VT_R8 duplo
VT_UI1 BYTE

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_OleAutoDataType(
[out] LONG* plAutoDataType
);
HRESULT put_OleAutoDataType(
[in] LONG lAutoDataType
);
Comentários
Uma matriz de bytes não assinados, VT_UI1|VT_ARRAY pode significar que o provedor
mapeou uma sintaxe que não pode ser mapeada para um tipo virtual de Automação.

Exemplos
O exemplo de código a seguir examina a sintaxe do atributo OperatingSystemVersion
de um computador em uma rede por meio do provedor WinNT. A sintaxe do resultado
é uma cadeia de caracteres.

VB

Dim obj As IADs


Dim cl As IADsClass
Dim pr As IADsProperty
Dim sy As IADsSyntax
Dim sc As IADsContainer
On Error GoTo Cleanup

Set obj = GetObject("WinNT://myMachine,computer")


Set cl = GetObject(obj.Schema)
Set sc = GetObject(cl.Parent)
Set pr = sc.GetObject("Property","OperatingSystemVersion")
Set sy = GetObject(sc.ADsPath & "/" & pr.Syntax)

MsgBox "Automation data types: " & sy.OleAutoDataType

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set obj = Nothing
Set cl = Nothing
Set pr = Nothing
Set sy = Nothing
Set sc = Nothing

O exemplo de código a seguir examina a sintaxe do atributo OperatingSystemVersion


de um computador em uma rede por meio do provedor WinNT. A sintaxe do resultado
é uma cadeia de caracteres. Para resumir, a verificação de erros é omitida.

C++

#include <stdio.h>
#include <activeds.h>
#include <atlbase.h>
IADs *pObj = NULL;
IADsClass *pCls = NULL;
IADsProperty *pProp = NULL;
IADsSyntax *pSyn = NULL;
IADsContainer *pCont = NULL;

HRESULT hr = ADsGetObject(L"WinNT://myMachine,computer",
IID_IADs,
(void**)&pObj);
if(FAILED(hr)){goto Cleanup;}
VARIANT var;
VariantInit(&var);
CComBSTR sbstr;

pObj->get_Schema(&sbstr);
printf("Object schema: %S\n",sbstr);

hr = ADsGetObject(sbstr, IID_IADsClass,(void**)&pCls);
if(FAILED(hr)){goto Cleanup;}

pCls->get_Parent(&sbstr);
printf("Object class's container: %S\n", sbstr);

hr = ADsGetObject(sbstr, IID_IADsContainer, (void**)&pCont);


if(FAILED(hr)){goto Cleanup;}
pCont->QueryInterface(IID_IADs,(void**)&pObj);
pObj->get_ADsPath(&sbstr);
printf("Container's AdsPath: %S\n",sbstr);

IDispatch *pDisp;
hr = pCont->GetObject(CComBSTR("Property"),
CComBSTR("OperatingSystemVersion"),
(IDispatch**)&pDisp);
if(FAILED(hr)){goto Cleanup;}

hr = pDisp->QueryInterface(IID_IADsProperty, (void**)&pProp);
if(FAILED(hr)){goto Cleanup;}

hr = pProp->get_Syntax(&sbstr);
if(FAILED(hr)){goto Cleanup;}
printf("Property Syntax: %S\n",sbstr);

printf("ADsPath of the syntax object %S\n",sbstr);

hr = ADsGetObject(sbstr, IID_IADsSyntax, (void**)&pSyn);


if(FAILED(hr)){goto Cleanup;}

long lType;
pSyn->get_OleAutoDataType(&lType);
printf("Property syntax's OleAutoDataType: %d\n", lType);

Cleanup:
if(pObj)
pObj->Release();
if(pProp)
pProp->Release();

if(pCls)
pCls->Release();

if(pSyn)
pSyn->Release();

if(pCont)
pCont->Release();

Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsSyntax é definido como C8F93DD2-4AE0-11CF-9E73-


00AA004A5691

Confira também
IADsClass

IADsProperty

IADsSyntax

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interfaces de cache de propriedade
Artigo • 03/06/2023

As interfaces de cache de propriedade foram projetadas para funcionar com


propriedades no cache. Eles consistem nas seguintes interfaces:

IADsPropertyEntry
IADsPropertyList
IADsPropertyValue
IADsPropertyValue2

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interface IADsPropertyEntry (iads.h)
Artigo14/03/2023

A interface IADsPropertyEntry é usada para gerenciar uma entrada de propriedade no


cache de propriedades. Uma entrada de propriedade contém um valor (ou valores) de
um atributo conforme definido no esquema. Ele é identificado pelo nome do atributo
correspondente. Um objeto de entrada de propriedade permite que um usuário
especifique como seus valores devem ser manipulados. Exemplos dessas operações
incluem "atualizar", "modificar" e "excluir".

Várias entradas de propriedade são gerenciadas por uma lista de propriedades. Para
acessar uma entrada de propriedade, chame o método Item ou GetPropertyItem na
interface IADsPropertyList .

Use os métodos de propriedade de IADsPropertyEntry para examinar e manipular


propriedades individuais. Antes de chamar os métodos dessa interface, você deve
chamar IADs::GetInfo ou IADs::GetInfoEx explicitamente para carregar os valores de
propriedade atribuídos do objeto no cache. Depois de chamar os métodos dessas
interfaces, você deve chamar IADs::SetInfo para salvar as alterações no repositório
persistente do diretório subjacente.

Herança
A interface IADsPropertyEntry herda da interface IDispatch.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
IADs::GetInfo
IADs::GetInfoEx

IADs::SetInfo

Métodos de propriedade IADsPropertyEntry

IADsPropertyList

IADsPropertyList::GetPropertyItem

IADsPropertyList::Item

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos da propriedade
IADsPropertyEntry
Artigo • 13/06/2023

Os métodos de propriedade da interface IADsPropertyEntry fornecem acesso às


propriedades a seguir. Para obter mais informações sobre métodos de propriedade,
consulte Métodos de propriedade de interface.

Propriedades
ADsType

O tipo de dados da propriedade Name . Os valores do tipo de dados são definidos na


enumeração ADSTYPEENUM .

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_ADsType(
[out] LONG* plADsType
);
HRESULT put_ADsType(
[in] LONG lADsType
);

ControlCode

Uma constante que especifica a operação a ser executada na propriedade nomeada. O


valor é definido na enumeração ADS_PROPERTY_OPERATION_ENUM .

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_ControlCode(
[out] LONG* pControlCode
);
HRESULT put_ControlCode(
[in] LONG lnControlCode
);

Nome

Nome da entrada da propriedade. Esse nome deve corresponder ao nome de um


atributo, conforme definido no esquema.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Name(
[out] BSTR* pbstrName
);
HRESULT put_Name(
[in] BSTR bstrName
);

Valores

Uma matriz VARIANT . Cada elemento nessa matriz representa um valor da propriedade
nomeada. Esses valores de propriedade são representados por objetos ADSI que
implementam as interfaces IADsPropertyValue e IADsPropertyValue2 . Portanto, a
matriz VARIANT contém uma matriz de ponteiros para a interface IDispatch nos objetos
ADSI que implementam as interfaces IADsPropertyValue e IADsPropertyValue2 .

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT

syntax

// C++ method syntax


HRESULT get_Values(
[out] VARIANT* pvValues
);
HRESULT put_Values(
[in] VARIANT vValues
);

Comentários
Cada método de propriedade dá suporte aos valores de retorno HRESULT padrão,
incluindo S_OK. Para obter mais informações sobre outros valores retornados, consulte
Códigos de erro ADSI.

Exemplos
O exemplo de código a seguir mostra como recuperar uma propriedade nomeada do
cache e criar uma nova entrada de propriedade.

VB

Dim propList As IADsPropertyList


Dim propEntry As IADsPropertyEntry
Dim propVal As IADsPropertyValue

On Error GoTo Cleanup

'------------------------------------------------------------
'----- Getting IADsPropertyEntry ----------------------------
'------------------------------------------------------------

' Create the property list object.


Set propList = GetObject("LDAP://dc01/DC=Fabrikam,DC=com")
propList.GetInfo

' Get a named property entry object.


Set propEntry = propList.GetPropertyItem("dc", ADSTYPE_CASE_IGNORE_STRING)

' Insert code to do something with propEntry


Set propEntry = Nothing

'------------------------------------------------------------
'---- Setting IADsPropertyEntry -----------------------------
'------------------------------------------------------------

' Create a property value object.


Set propVal = New PropertyValue

'---- Property Value -----


propVal.CaseIgnoreString = "Fabrikam, Inc - Seattle, WA"
propVal.ADsType = ADSTYPE_CASE_IGNORE_STRING

'---- Create a new Property Entry ----


Set propEntry = New PropertyEntry
propEntry.Name = "adminDescription"
propEntry.Values = Array(propVal)
propEntry.ControlCode = ADS_PROPERTY_UPDATE
propEntry.ADsType = ADS_CASE_IGNORE_STRING

' ---- Put the newly created property entry to the cache ----
propList.PutPropertyItem (propEntry)

' Commit the entry to the directory store.


propList.SetInfo

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set propList = Nothing
Set propEntry = Nothing
Set propVal = Nothing

O exemplo de código a seguir mostra como obter uma propriedade nomeada de um


cache.

C++

#include <activeds.h>
#include <stdio.h>

IADsPropertyList *pList = NULL;


IADsPropertyEntry *pEntry = NULL;
IADs *pObj = NULL;
VARIANT var;
long valType = ADSTYPE_CASE_IGNORE_STRING;

VariantInit(&var);

// Bind to directory object.


HRESULT hr = ADsGetObject(L"LDAP://dc01/DC=Fabrikam,DC=com",
IID_IADsPropertyList,
(void**)&pList);
if(FAILED(hr)){return;}

// Initialize the property cache.


hr = pList->QueryInterface(IID_IADs,(void**)&pObj);
if(FAILED(hr)){goto Cleanup;}
pObj->GetInfo();
pObj->Release();

// Get a property entry.


hr = pList->GetPropertyItem(CComBSTR("description"), valType, &var);
pList->Release();
if(FAILED(hr)){goto Cleanup;}
hr = V_DISPATCH(&var)->QueryInterface(IID_IADsPropertyEntry,
(void**)&pEntry);
VariantClear(&var);
if(FAILED(hr)){goto Cleanup;}

// Get the name and the type of the property entry.


BSTR nm = NULL;
hr = pEntry->get_Name(&nm);
printf("Property name = %S\n",nm);
VariantClear(&var);
long at;
hr = pEntry->get_ADsType(&at);
printf("Property type = %d\n",a);

Cleanup:
if(nm)
SysFreeString(nm);

if(pList)
pList->Release();

if(pEntry)
pEntry->Release();

if(pObj)
pObj->Release();

VariantClear(&var);

Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsPropertyEntry é definido como 05792C8E-941F-11D0-8529-


00C04FD8D503

Confira também
ADS_PROPERTY_OPERATION_ENUM

Códigos de erro ADSI

ADSTYPEENUM

IADsPropertyEntry
IADsPropertyValue

IADsPropertyValue2

IDispatch

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interface IADsPropertyList (iads.h)
Artigo14/03/2023

A interface IADsPropertyList é usada para modificar, ler e atualizar uma lista de


entradas de propriedade no cache de propriedades de um objeto. Ele serve para
enumerar, modificar e limpar as entradas de propriedade contidas. Use o método de
enumeração dessa interface para identificar propriedades inicializadas. Isso é diferente
de usar o esquema para determinar todos os atributos possíveis que um objeto ADSI
pode ter e quais propriedades foram definidas.

Chame os métodos da interface IADsPropertyList para examinar e manipular a lista de


propriedades no cliente. Antes de chamar os métodos dessa interface, você deve
chamar IADs::GetInfo ou IADs::GetInfoEx explicitamente para carregar os valores de
propriedade atribuídos do objeto no cache. Depois de chamar os métodos dessa
interface, você deve chamar IADs::SetInfo para salvar as alterações no repositório
persistente do diretório subjacente.

Para obter a lista de propriedades de um objeto ADSI, associe-se à interface


IADsPropertyList . Você deve chamar o método GetInfo antes de chamar outros
métodos do objeto de lista de propriedades, se o cache de propriedades não tiver sido
inicializado.

Herança
A interface IADsPropertyList herda da interface IDispatch . IADsPropertyList também
tem estes tipos de membros:

Métodos
A interface IADsPropertyList tem esses métodos.

IADsPropertyList::GetPropertyItem

Recupera o item que corresponde ao nome da lista.

IADsPropertyList::Item

O método IADsPropertyList::Item recupera o item de propriedade especificado da lista.


IADsPropertyList::Next

O método IADsPropertyList::Next obtém o próximo item na lista de propriedades. O item


retornado é um objeto Property Entry.

IADsPropertyList::P urgePropertyList

Exclui todos os itens da lista de propriedades.

IADsPropertyList::P utPropertyItem

Atualizações os valores de um item na lista de propriedades.

IADsPropertyList::Reset

Redefine a lista para o primeiro item.

IADsPropertyList::ResetPropertyItem

Remove o item especificado da lista; ou seja, do cache.

IADsPropertyList::Skip

Ignora um número especificado de itens, contando da posição atual do cursor, na lista de


propriedades.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
IADs::GetInfo

IADs::GetInfoEx

IADs::SetInfo
Métodos de propriedade IADsPropertyList

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos de propriedade
IADsPropertyList
Artigo • 12/06/2023

Os métodos de propriedade da interface IADsPropertyList leem as propriedades


descritas na tabela a seguir. Para obter mais informações, consulte Métodos de
propriedade de interface.

Propriedades
PropertyCount

O número de itens na lista de propriedades.

Tipo de acesso: Somente leitura

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_PropertyCount(
[out] LONG* plCount
);

Exemplos
O exemplo de código a seguir mostra como determinar o número de itens em uma lista
de propriedades.

VB

Dim propList As IADsPropertyList


Dim count As Long

On Error GoTo Cleanup

Set propList = GetObject("LDAP://dc01/DC=Fabrikam,DC=com")

propList.GetInfo
count = propList.PropertyCount
Debug.Print "Number of Properties Found: " & count

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If

Set propList = Nothing

O exemplo de código a seguir mostra como determinar o número de itens em uma lista
de propriedades.

C++

int GetPropertyCacheCount(LPWSTR adsPath)


{
IADsPropertyList *pList;
IADs *pObj;
HRESULT hr = S_OK;

if(!adsPath)
{
_tprintf(TEXT("Invalid ADsPath."));
return -1;
}

HRESULT hr = ADsGetObject(adsPath,
IID_IADsPropertyList,
(void**)&pList);
// Initialize the property cache.
hr = pList->QueryInterface(IID_IADs,(void**)&pObj);
pObj->GetInfo();
pObj->Release();

// Get the property count.


hr = pList->get_PropertyCount(&count);
pList->Release();

// Return the property count if it succeeded, otherwise


// return -1.

if(SUCCEEDED(hr))
{
return count;
}
else
{
return -1;
}

Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsPropertyList é definido como C6F602B6-8F69-11D0-8528-


00C04FD8D503

Confira também
IADsPropertyList

Métodos de propriedade de interface

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Método
IADsPropertyList::GetPropertyItem
(iads.h)
Artigo24/08/2023

O método IADsPropertyList::GetPropertyItem recupera o item que corresponde ao


nome da lista.

Sintaxe
C++

HRESULT GetPropertyItem(
[in] BSTR bstrName,
[in] LONG lnADsType,
[in, out] VARIANT *pVariant
);

Parâmetros
[in] bstrName

Contém o nome da propriedade solicitada.

[in] lnADsType

Contém um dos valores de enumeração ADSTYPEENUM que determina o tipo de dados


a ser usado na interpretação da propriedade solicitada. Se o tipo for desconhecido, esse
parâmetro poderá ser definido como ADSTYPE_UNKNOWN. Para servidores sem
esquema, o usuário deve especificar o tipo.

[in, out] pVariant

Endereço de uma variável VARIANT alocada pelo chamador. No retorno , VARIANT


contém o ponteiro da interface IDispatch do objeto que implementa a interface
IADsPropertyEntry para o atributo recuperado.

Qualquer memória alocada para esse parâmetro deve ser liberada com a função
VariantClear quando os dados não forem mais necessários.
Valor retornado
Esse método dá suporte aos valores de retorno HRESULT padrão, incluindo S_OK. Se o
item de propriedade solicitado não for encontrado, o método retornará
ADS_PROPERTY_NOT_FOUND. Para obter mais informações e outros valores
retornados, consulte Códigos de erro ADSI.

Comentários
A propriedade do objeto IADsPropertyValue retornado por esse método que pode ser
usado dependerá do tipo especificado em lnADsType. A tabela a seguir mapeia o tipo
de dados para a propriedade IADsPropertyEntry apropriada.

Valor lnADsType Propriedade IADsPropertyValue a ser usada

ADSTYPE_INVALID Não disponível.

ADSTYPE_DN_STRING DNString

ADSTYPE_CASE_EXACT_STRING CaseExactString

ADSTYPE_CASE_IGNORE_STRING CaseIgnoreString

ADSTYPE_PRINTABLE_STRING PrintableString

ADSTYPE_NUMERIC_STRING NumericString

ADSTYPE_BOOLEAN Booliano

ADSTYPE_INTEGER Inteiro

ADSTYPE_OCTET_STRING OctetString

ADSTYPE_UTC_TIME UTCTime

ADSTYPE_LARGE_INTEGER LargeInteger

ADSTYPE_PROV_SPECIFIC Usar IADsPropertyValue2::GetObjectProperty (VT_ARRAY


| VT_UI1).

ADSTYPE_OBJECT_CLASS Não disponível.

ADSTYPE_CASEIGNORE_LIST Use IADsPropertyValue2::GetObjectProperty


(IADsCaseIgnoreList).

ADSTYPE_OCTET_LIST Use IADsPropertyValue2::GetObjectProperty


(IADsOctetList).

ADSTYPE_PATH Use IADsPropertyValue2::GetObjectProperty (IADsPath).


ADSTYPE_POSTALADDRESS Use IADsPropertyValue2::GetObjectProperty
(IADsPostalAddress).

ADSTYPE_TIMESTAMP Use IADsPropertyValue2::GetObjectProperty


(IADsTimestamp).

ADSTYPE_BACKLINK Use IADsPropertyValue2::GetObjectProperty


(IADsBackLink).

ADSTYPE_TYPEDNAME Use IADsPropertyValue2::GetObjectProperty


(IADsTypedName).

ADSTYPE_HOLD Use IADsPropertyValue2::GetObjectProperty (IADsHold).

ADSTYPE_NETADDRESS Use IADsPropertyValue2::GetObjectProperty


(IADsNetAddress).

ADSTYPE_REPLICAPOINTER Use IADsPropertyValue2::GetObjectProperty


(IADsReplicaPointer).

ADSTYPE_FAXNUMBER Use IADsPropertyValue2::GetObjectProperty


(IADsFaxNumber).

ADSTYPE_EMAIL Use IADsPropertyValue2::GetObjectProperty (IADsEmail).

ADSTYPE_NT_SECURITY_DESCRIPTOR SecurityDescriptor

ADSTYPE_UNKNOWN Não disponível.

ADSTYPE_DN_WITH_BINARY Use IADsPropertyValue2::GetObjectProperty


(IADsDNWithBinary).

ADSTYPE_DN_WITH_STRING Use IADsPropertyValue2::GetObjectProperty


(IADsDNWithString).

Exemplos

O exemplo de código a seguir mostra como recuperar uma entrada de propriedade


usando o método GetPropertyItem .

VB

Const ADSTYPE_CASE_IGNORE_STRING = 3
Dim propList As IADsPropertyList
Dim propEntry As IADsPropertyEntry
Dim propVal As IADsPropertyValue

Set propList = GetObject("LDAP://dc01/DC=Fabrikam,DC=com")


propList.GetInfo
Set propEntry = propList.GetPropertyItem("dc", ADSTYPE_CASE_IGNORE_STRING)

For Each v In propEntry.Values


Set propVal = v

' Use the CaseIgnoreString property because the


ADSTYPE_CASE_IGNORE_STRING
' type was requested in GetPropertyItem.
Debug.Print propVal.CaseIgnoreString
Next

Set propList = Nothing


Set propEntry = Nothing
Set propVal = Nothing

O exemplo de código a seguir mostra como recuperar uma entrada de propriedade


usando o método GetPropertyItem . Ele pressupõe que a interface IADsPropertyList foi
recuperada corretamente. Para obter mais informações sobre como carregar o cache de
propriedades, consulte a função de exemplo GetPropertyCache em IADsPropertyList.

C++

#include <activeds.h>
#include <stdio.h>

/////////////////////////////////////////////////////////
// Function to retrieve a specified property entry
// using the IADsPropertyList::GetPropertyItem method.
/////////////////////////////////////////////////////////
IADsPropertyEntry *GetPropertyItem(
IADsPropertyList *pList,
BSTR entryName,
long entryType)
{
IADsPropertyEntry *pEntry;
VARIANT var;
VariantInit(&var);

if(!pList || !entryName)
{
_tprintf("Invalid argument...");
return NULL;
}

// Get a property entry.


hr = pList->GetPropertyItem(entryName, entryType, &var);
hr = V_DISPATCH(&var)->QueryInterface(IID_IADsPropertyEntry,
(void**)&pEntry);
VariantClear(&var);
return pEntry;
}

///////////////////////////////////////////////////////
// Examine a property entry.
///////////////////////////////////////////////////////
IADsPropertyList *pList = NULL;
IADsPropertyEntry *pEntry = NULL;

pList = GetPropertyCache(L"LDAP://dc01/DC=Fabrikam,DC=COM");

if(pList)
{
pEntry = GetPropertyItem(pList, L"dc", ADSTYPE_CASE_IGNORE_STRING);
}

if(pEntry)
{
BSTR nm;
HRESULT hr = pEntry->get_Name(&nm);
if(SUCCEEDED(hr))
{
printf("Property name = %S\n",nm);
SysFreeString(nm);
}
}

if(pList)
pList->Release();
if(pEntry)
pEntry->Release();

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI
ADSTYPEENUM

IADsPropertyList

Métodos de propriedade IADsPropertyList

IDispatch

Variantclear

Comentários
Esta página foi útil?  Yes  No
Método IADsPropertyList::Item (iads.h)
Artigo24/08/2023

O método IADsPropertyList::Item recupera o item de propriedade especificado da lista.

Sintaxe
C++

HRESULT Item(
[in] VARIANT varIndex,
[in, out] VARIANT *pVariant
);

Parâmetros
[in] varIndex

A VARIANT que contém o índice ou o nome da propriedade a ser recuperada.

[in, out] pVariant

Endereço de uma variável VARIANT alocada pelo chamador. No retorno, o VARIANT


contém o ponteiro IDispatch para o objeto que implementa a interface
IADsPropertyEntry para o atributo recuperado.

Valor retornado
Esse método dá suporte aos valores de retorno HRESULT padrão, incluindo S_OK. Para
obter mais informações e outros valores retornados, consulte Códigos de erro ADSI.

Comentários
Você deve limpar pVariant usando VariantClear quando o valor retornado pelo método
Item não for mais necessário.

Exemplos
O exemplo de código a seguir mostra como enumerar todas as entradas com o método
Item .

VB

Dim propList As IADsPropertyList


Dim propEntry As IADsPropertyEntry
Dim count As Long

On Error GoTo Cleanup

Set propList = GetObject("LDAP://dc02/DC=Fabrikam,DC=com")

propList.GetInfo
count = propList.PropertyCount
Debug.Print "No of Property Found: " & count

'==== Getting the property list item with Name ==================


Set propEntry = propList.Item("uSNCreated")
Debug.Print propEntry.Name
Debug.Print propEntry.ADsType

' to examine property entries by name and type


For i = 0 To count - 1
'==== Getting the property list item with Number =============
Set propEntry = propList.Item(i)
Debug.Print propEntry.Name
Debug.Print propEntry.ADsType
Next

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If

Set propList = Nothing


Set propEntry = Nothing

O exemplo de código a seguir mostra como recuperar a propriedade Owner de um


computador usando o método IADsPropertyList::Item . Para obter mais informações
sobre a função GetPropertyCache e um exemplo de código, consulte IADsPropertyList.

C++

////////////////////////////////////////
// function: PropertyItem
// input: PropertyList,
// name of the item
// output: Property entry
// uses: IADsPropertyList::Item
////////////////////////////////////////
IADsPropertyEntry *PropertyItem(
IADsPropertyList *pList,
LPWSTR item)
{
IADsPropertyEntry *pEntry;
VARIANT varEntry, varItem;

if(!pList || !item)
{
_tprintf(TEXT("Invalid parameter..."));
return NULL;
}

VariantInit(&varItem);
VariantInit(&varEntry);

// get a property entry


V_BSTR(&varItem)= SysAllocString(item);
V_VT(&varItem)=VT_BSTR;
HRESULT hr = pList->Item(varItem ,&varEntry);
hr = V_DISPATCH(&var)->QueryInterface(
IID_IADsPropertyEntry,
(void**)&pEntry);
VariantClear(&varItem);
VariantClear(&varEntry);
return pEntry;
}

///////////////////////////////////////
// examine a property entry
///////////////////////////////////////
IADsPropertyList *pList;
pList=GetPropertyCache(L"WinNT://myComputer,computer");

IADsPropertyEntry *pEntry;
pEntry = PropertyItem(pList, L"Owner");

if(pEntry)
{
HRESULT hr;
BSTR bstr;
long ln;

hr = pEntry->get_Name(&bstr);
if(SUCCEEDED(hr))
{
SysFreeString(bstr);
}
printf(" Name : %S\n", bstr);

pEntry->get_ADsType(&ln);
if(SUCCEEDED(hr))
{
printf(" Type : %d\n", ln);
}

pEntry->get_ControlCode(&ln);
if(SUCCEEDED(hr))
{
printf(" Code %d\n",ln);
}
}

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

IADsPropertyEntry

IADsPropertyList

Métodos de propriedade IADsPropertyList

IDispatch

Comentários
Esta página foi útil?  Yes  No
Método IADsPropertyList::Next (iads.h)
Artigo24/08/2023

O método IADsPropertyList::Next obtém o próximo item na lista de propriedades. O


item retornado é um objeto Property Entry.

Sintaxe
C++

HRESULT Next(
[out] VARIANT *pVariant
);

Parâmetros
[out] pVariant

Endereço de uma variável alocada pelo chamador que contém o valor do próximo item
na lista de propriedades. O valor retornado de VT_DISPATCH refere-se a um ponteiro de
interface IDispatch para um objeto que implementa a interface IADsPropertyEntry .

Valor retornado
Esse método dá suporte aos valores HRESULT padrão, incluindo S_OK se o item for
obtido. Quando o último item na lista for retornado, o valor retornado será diferente
dependendo de qual provedor é usado. Os seguintes códigos são usados para indicar
que o último item na lista foi obtido:

Para obter mais informações e outros valores retornados, consulte Códigos de erro
ADSI.

Comentários
Você deve limpar pVariant usando VariantClear quando o valor retornado pelo método
Next não for mais necessário.

Exemplos
O exemplo de código a seguir mostra como percorrer uma lista de propriedades usando
o método Next .

VB

Dim propList As IADsPropertyList


Dim v as Variant
Dim propVal As IADsPropertyValue

On Error Resume Next

Set propList = GetObject("LDAP://dc01/DC=Fabrikam,DC=com")

propList.GetInfo
Set v = propList.Next()
While (Not (IsNull(v)) And Err.Number = 0)
Set propEnty = v
Debug.Print v.Name
Debug.Print v.AdsType

Set v = propList.Next
Wend

O exemplo de código C++ a seguir mostra como trabalhar o método


IADsPropertyList::Next .

C++

////////////////////////////////////
// Function used to retrieve an entry using the
// IADsPropertyList::Next method.

// name: GetNextEntry
// input: IADsPropertyList*
// return: IADsPropertyEntry
// uses: IADsPropertyList::Next
/////////////////////////////////////////////////////////
IADsPropertyEntry* GetNextEntry(IADsPropertyList* pList)
{
VARIANT var;
VariantInit(&var);
IADsPropertyEntry *pEntry;

if(!pList)
{
_tprintf("An error has occurred.");
return NULL;
}

HRESULT hr = pList->Next(&var);
hr = V_DISPATCH(&var)->QueryInterface(IID_IADsPropertyEntry,
(void**)&pEntry);
VariantClear(&var);
return pEntry;
}

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

IADsPropertyEntry

IADsPropertyList

Métodos de propriedade IADsPropertyList

IDispatch

Comentários
Esta página foi útil?  Yes  No
Método IADsPropertyList::P
urgePropertyList (iads.h)
Artigo24/08/2023

O método IADsPropertyList::P urgePropertyList exclui todos os itens da lista de


propriedades.

Sintaxe
C++

HRESULT PurgePropertyList();

Valor retornado
Esse método dá suporte aos valores de retorno HRESULT padrão, incluindo S_OK. Para
obter mais informações e outros valores retornados, consulte Códigos de erro ADSI.

Comentários
Quando o método PurgePropertyList é chamado, todos os itens são removidos do
cache. Assim, chamar GetPropertyItem depois disso gerará um erro. Lembre-se de que
PurgePropertyList afeta apenas o conteúdo do cache e não afeta as propriedades no
objeto real no diretório; ou seja, chamar SetInfo depois de chamar PurgePropertyList
não exclui as propriedades no objeto de diretório.

Exemplos
O exemplo de código a seguir mostra como implementar IADsPropertyList::P
urgePropertyList.

VB

Dim propList As IADsPropertyList

On Error GoTo Cleanup

Set propList = GetObject("LDAP://dc03/DC=Fabrikam,DC=com")


propList.GetInfo
propList.PurgePropertyList

'- None of GetPropertyItem should work, because the list is purged.


'- The following line should generate error.
Set propEntry = propList.GetPropertyItem("adminDescription",
ADSTYPE_CASE_IGNORE_STRING)

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If

Set propList = Nothing

O exemplo de código a seguir mostra o efeito produzido por uma chamada para
IADsPropertyList::P urgePropertyList. Para obter mais informações sobre a função
GetPropertyCache e um exemplo de código, consulte IADsPropertyList.

C++

IADsPropertyList *GetPropertyCache(LPWSTR);

void TestPurgePropertyList()
{
IADsPropertyList *pList;
pList=GetPropertyCache(L"WinNT://myComputer,computer");

long count;

if(pList)
{
pList->get_PropertyCount(&count);
printf("Number of properties before purging: %d\n",count);

count = -1;
pList->PurgePropertyList();
pList->get_PropertyCount(&count);
printf("Number of properties after purging: %d\n",count);
}
}

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008


Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

IADsPropertyList

Métodos de propriedade IADsPropertyList

IADsPropertyList::GetPropertyItem

Comentários
Esta página foi útil?  Yes  No
Método IADsPropertyList::P
utPropertyItem (iads.h)
Artigo24/08/2023

O método IADsPropertyList::P utPropertyItem atualiza os valores de um item na lista


de propriedades.

Sintaxe
C++

HRESULT PutPropertyItem(
[in] VARIANT varData
);

Parâmetros
[in] varData

Novos valores de propriedade a serem colocados no cache de propriedades. Isso deve


conter o ponteiro IDispatch para o objeto que implementa IADsPropertyEntry que
contêm os valores de propriedade modificados.

Valor retornado
Esse método dá suporte aos valores de retorno HRESULT padrão, incluindo S_OK. Para
obter mais informações e outros valores retornados, consulte Códigos de erro ADSI.

Comentários
O IADsPropertyEntry::p ut_ControlCode deve ser definido como a operação de
modificação/adição/exclusão desejada usando o valor de
ADS_PROPERTY_OPERATION_ENUM adequado. Depois que PutPropertyItem tiver sido
chamado, você deverá chamar IADs::SetInfo para persistir quaisquer alterações no
repositório de diretórios. Os valores de propriedade não são confirmados até que o
método IADs::SetInfo seja chamado.
Exemplos
O exemplo de código a seguir mostra como adicionar uma nova entrada a uma lista de
propriedades usando PutPropertyItem.

VB

Dim propList As IADsPropertyList


Dim propVal As IADsPropertyValue
Dim propEntry As IADsPropertyEntry
On Error GoTo Cleanup

Set propList = GetObject("LDAP://DC=Fabrikam,DC=com")


Set propVal = New PropertyValue

'--- Property Value-----


propVal.CaseIgnoreString = "Fabrikam, Inc - Seattle, WA"
propVal.ADsType = ADSTYPE_CASE_IGNORE_STRING

'--- Property Entry ----


Set propEntry = New PropertyEntry
propEntry.Name = "adminDescription"
propEntry.Values = Array(propVal)
propEntry.ControlCode = ADS_PROPERTY_UPDATE
propEntry.ADsType = ADSTYPE_CASE_IGNORE_STRING

' --- Property List----


propList.PutPropertyItem (propEntry)

' query the IADs interface on the propList object


Dim IADsObj As IADs
Set IADsObj=propList

' Commit changes of the property list to the directory store.


IADsObj.SetInfo

Cleanup:
If(Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If

Set propList = Nothing


Set propVal = Nothing
Set propEntry = Nothing
Set IADsObj = Nothing

O exemplo de código a seguir adiciona uma nova entrada a uma lista de propriedades
usando IADsPropertyList::P utPropertyItem.

C++
// forward declaration of a helper function
HRESULT ADsBuildVarArrayDisp(IDispatch ** ppObjs,
DWORD dwObjs,
VARIANT * pVar
)

int main()
{
HRESULT hr = CoInitialize(NULL);

IADsPropertyList *pList;
hr = ADsOpenObject(L"LDAP://dc=Fabrikam,dc=com",
L"Administrator",
L"",
ADS_SECURE_AUTHENTICATION,
IID_IADsPropertyList,
(void**)&pList);

if(hr!=S_OK)
{
_tprintf(TEXT("An error has occurred."));
return;
}

// create a property value object


IADsPropertyValue *pVal;
hr = CoCreateInstance(CLSID_PropertyValue,
NULL,
CLSCTX_INPROC_SERVER,
IID_IADsPropertyValue,
(void**)&pVal);
if(hr!=S_OK)
{
_tprintf(TEXT("An error has occurred."));
pList->Release();
return;
}

hr = pVal->put_CaseIgnoreString(CComBSTR("Fabrikam, Inc - Seattle, WA"));

hr = pVal->put_ADsType(ADSTYPE_CASE_IGNORE_STRING);

// put the propertyValue object into a variant array for


// assignment to a propertyEntry object
IDispatch *pDisp;
hr = pVal->QueryInterface(IID_IDispatch,(void**)&pDisp);
hr = pVal->Release();

VARIANT vVals;
VariantInit(&vVals);
hr = ADsBuildVarArrayDisp(&pDisp,1,&vVals); //code given below.
pDisp->Release();

if(hr!=S_OK)
{
_tprintf(TEXT("An error has occurred."));
pList->Release();
return;
}

// Create a propertyEntry object


IADsPropertyEntry *pEntry;
hr = CoCreateInstance(CLSID_PropertyEntry,
NULL,
CLSCTX_INPROC_SERVER,
IID_IADsPropertyEntry,
(void**)&pEntry);

hr = pEntry->put_Name(CComBSTR("adminDescription"));
hr = pEntry->put_ControlCode(ADS_PROPERTY_UPDATE);
hr = pEntry->put_ADsType(ADSTYPE_CASE_IGNORE_STRING);
hr = pEntry->put_Values(vVals);
VariantClear(&vVals);

// Convert pEntry to pDisp for use in pList.PutPropertyItem


hr = pEntry->QueryInterface(IID_IDispatch,(void**)&pDisp);
pEntry->Release();

VARIANT vEntry;
VariantInit(&vEntry);
V_DISPATCH(&vEntry)=pDisp;
V_VT(&vEntry)= VT_DISPATCH;
hr = pList->PutPropertyItem(vEntry);
VariantClear(&vEntry);

IADs *pObj;
hr = pList->QueryInterface(IID_IADs,(void**)&pObj);
pObj->SetInfo();
pObj->Release();

pList->Release();

CoUninitialize();
return 0;
}

////////////////
// Helper function to build a variant array of IDispatch objects.
///////////////
HRESULT ADsBuildVarArrayDisp(
IDispatch ** ppObjs,
DWORD dwObjs,
VARIANT * pVar
)
{

VARIANT v;
SAFEARRAYBOUND sabNewArray;
DWORD i;
SAFEARRAY *psa = NULL;
HRESULT hr = E_FAIL;

if((!IDispatch) || (dwObjs<=0))
{
return E_INVALIDARG;
}

sabNewArray.cElements = dwObjs;
sabNewArray.lLbound = 0;
psa = SafeArrayCreate(VT_VARIANT, 1, &sabNewArray);

if (!pVar) {
hr = E_ADS_BAD_PARAMETER;
goto Fail;
}
VariantInit(pVar);

if (!psa) {
goto Fail;
}

for (i = 0; i < dwObjs; i++) {


VariantInit(&v);
V_VT(&v) = VT_DISPATCH;
V_DISPATCH(&v) = *(ppObjs + i);
hr = SafeArrayPutElement(psa,
(long FAR *)&i,
&v
);
if (FAILED(hr)) {
goto Fail;
}
}

V_VT(pVar) = VT_VARIANT | VT_ARRAY;


V_ARRAY(pVar) = psa;

return(ResultFromScode(S_OK));

Fail:
if (psa) {
SafeArrayDestroy(psa);
}

return(E_FAIL);
}

Requisitos
Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

IADs::SetInfo

IADsPropertyList

Métodos de propriedade IADsPropertyList

IDispatch

Comentários
Esta página foi útil?  Yes  No
Método IADsPropertyList::Reset (iads.h)
Artigo24/08/2023

O método IADsPropertyList::Reset redefine a lista para o primeiro item.

Sintaxe
C++

HRESULT Reset();

Valor retornado
Esse método dá suporte aos valores HRESULT padrão, incluindo S_OK. Para obter mais
informações e outros valores retornados, consulte Códigos de erro ADSI.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

IADsPropertyList

Métodos de propriedade IADsPropertyList

IADsPropertyList::Next
Comentários
Esta página foi útil?  Yes  No
Método
IADsPropertyList::ResetPropertyItem
(iads.h)
Artigo24/08/2023

O método IADsPropertyList::ResetPropertyItem remove o item especificado da lista; ou


seja, do cache. Você pode especificar o item a ser removido pelo nome (como uma
cadeia de caracteres) ou por índice (como um inteiro).

Sintaxe
C++

HRESULT ResetPropertyItem(
[in] VARIANT varEntry
);

Parâmetros
[in] varEntry

Entrada a ser redefinida.

Valor retornado
Esse método dá suporte aos valores de retorno HRESULT padrão, incluindo S_OK. Para
obter mais informações e outros valores retornados, consulte Códigos de erro ADSI.

Comentários
ResetPropertyItem afeta apenas o conteúdo do cache e não afeta as propriedades no
objeto real no diretório; que está chamando SetInfo depois de chamar
ResetPropertyItem não exclui as propriedades no objeto de diretório.

Exemplos
O exemplo de código a seguir mostra como implementar ResetPropertyItem.
VB

Dim propList As IADsPropertyList

On Error GoTo Cleanup

Set propList = GetObject("LDAP://DC=Fabrikam,DC=com")

'--- Now modify the cache using PutPropertyItem


Set propVal = New PropertyValue
'--- Property Value-----
propVal.CaseIgnoreString = "Fabrikam"
propVal.ADsType = ADSTYPE_CASE_IGNORE_STRING

'--- Property Entry ----


Set propEntry = New PropertyEntry
propEntry.Name = "adminDescription"
propEntry.Values = Array(propVal)
propEntry.ControlCode = ADS_PROPERTY_UPDATE
propEntry.ADsType = ADS_CASE_IGNORE_STRING

' --- Property List----


propList.PutPropertyItem (propEntry)

' Commit to the directory. Without this, the changes take place only in the
cache.
propList.SetInfo

propList.GetInfo
Debug.Print " Number of Properties = " & propList.PropertyCount
propList.ResetPropertyItem "adminDescription"

' the property count should have been reduced by one.


Debug.Print "Number of properties = " & propList.PropertyCount

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set propList = Nothing
Set propVal = Nothing
Set propEntry = Nothing

O exemplo de código a seguir mostra o efeito produzido por uma chamada para
IADsPropertyList::ResetPropertyItem. Para obter mais informações e a listagem da
função GetPropertyCache , consulte IADsPropertyList. Para obter mais informações e a
listagem das funções GetNextEntry e PropertyItem , consulte IADsPropertyList::Next e
IADsPropertyList::Item , respectivamente.

C++
IADsPropertyList *GetPropertyCache(LPWSTR);
IADsPropertyEntry *GetNextEntry(IADsPropertyList *);
IADsPropertyEntry *PropertyItem(IADsPropertyList *,LPWSTR);

void ResetItem(IADsPropertyList *pList, LPWSTR item)


{
VARIANT var;
VariantInit(&var);

if(!pList)
{
item = NULL;
return;
}

V_BSTR(&var)=SysAllocString(item);
V_VT(&var)=VT_BSTR;

pList->ResetPropertyItem(var);
VariantClear(&var);
}

void TestResetItem()
{
IADsPropertyEntry *pEntry = NULL;
IADsPropertyList *pList = NULL;
long count;
BSTR bstr;
HRESULT hr;

pList = GetPropertyCache(L"WinNT://myComputer,computer");

hr = pList->get_PropertyCount(&count);
if(SUCCEEDED(hr))
{
printf(" Count before item reset : %d\n",count);
}

printf("Walking up the property list before item reset: \n");


for (int i=0; i<count; i++)
{
pEntry = GetNextEntry(pList);
hr = pEntry->get_Name(&bstr);
if(SUCCEEDED(hr))
{
printf(" Name : %S\n",bstr);
SysFreeString(bstr);
}
}

pList->Reset(); // Move the cursor to the beginning of the list.

ResetItem(pList, L"Owner");
hr = pList->get_PropertyCount(&count);
if(SUCCEEDED(hr))
{
printf(" Count after item reset : %d\n",count);
}

printf("Walking up the property list after item reset: \n");

for (i=0; i<count; i++)


{
pEntry = GetNextEntry(pList);
hr = pEntry->get_Name(&bstr);
if(SUCCEEDED(hr))
{
printf(" Name : %S\n",bstr);
SysFreeString(bstr);
}
}

pEntry->Release();
pList->Release();
}

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

IADsPropertyList

Métodos de propriedade IADsPropertyList

IADsPropertyList::Item

IADsPropertyList::Next
Comentários
Esta página foi útil?  Yes  No
Método IADsPropertyList::Skip (iads.h)
Artigo24/08/2023

O método IADsPropertyList::Skip ignora um número especificado de itens, contando da


posição atual do cursor, na lista de propriedades.

Sintaxe
C++

HRESULT Skip(
[in] long cElements
);

Parâmetros
[in] cElements

Número de elementos a serem ignorados.

Valor retornado
Esse método dá suporte aos valores de retorno HRESULT padrão, incluindo S_OK. Para
obter mais informações e outros valores retornados, consulte Códigos de erro ADSI.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

IADsPropertyList

Métodos de propriedade IADsPropertyList

IADsPropertyList::Next

Comentários
Esta página foi útil?  Yes  No
Interface IADsPropertyValue (iads.h)
Artigo14/03/2023

A interface IADsPropertyValue é usada para representar o valor de um objeto


IADsPropertyEntry em um tipo de dados predefinido. Essa interface expõe várias
propriedades para obter valores de dados no formato de dados correspondente.

A propriedade IADsPropertyEntry.Values contém uma matriz de objetos


IADsPropertyValue . Cada um dos objetos IADsPropertyValue contém um único valor
do objeto IADsPropertyEntry . Para obter mais informações e um exemplo de código
para criar entradas e valores de propriedade totalmente novos, consulte
IADsPropertyList.PutPropertyItem.

Ao obter valores em um formato não fornecido por uma das propriedades dessa
interface, use a interface IADsPropertyValue2 .

Antes de chamar os métodos dessas interfaces, chame IADs.GetInfo ou IADs.GetInfoEx


explicitamente para carregar os valores atribuídos do objeto no cache, se o cache não
tiver sido inicializado. Depois de modificar as propriedades dessa interface, chame
IADs.SetInfo para salvar as alterações no repositório persistente do diretório subjacente.

Herança
A interface IADsPropertyValue herda da interface IDispatch . IADsPropertyValue
também tem estes tipos de membros:

Métodos
A interface IADsPropertyValue tem esses métodos.

IADsPropertyValue::Clear

Limpa os valores atuais do objeto de valor da propriedade.

Requisitos

Cliente mínimo com suporte Windows Vista


Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
IADs::GetInfo

IADs::GetInfoEx

IADs::SetInfo

IADsPropertyEntry

Métodos de propriedade IADsPropertyValue

IADsPropertyValue2

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos da propriedade
IADsPropertyValue
Artigo • 13/06/2023

Os métodos de propriedade da interface IADsPropertyValue fornecem acesso às


propriedades descritas na tabela a seguir. Para obter mais informações, consulte
Métodos de propriedade de interface.

Propriedades
ADsType

O tipo de dados do valor da propriedade, obtido da enumeração ADSTYPEENUM , da


propriedade value.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_ADsType(
[out] LONG* ADsType
);
HRESULT put_ADsType(
[in] LONG ADsType
);

Booliano

$True.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_Boolean(
[out] LONG* lnBoolean
);
HRESULT put_Boolean(
[in] LONG lnBoolean
);

CaseExactString

Cadeia de caracteres a ser interpretada. Diferenciam maiúsculas de minúsculas.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_CaseExactString(
[out] BSTR* bstrCaseExactString
);
HRESULT put_CaseExactString(
[in] BSTR bstrCaseExactString
);

CaseIgnoreString

Cadeia de caracteres a ser interpretada. Não diferencia maiúsculas de minúsculas.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_CaseIgnoreString(
[out] BSTR* bstrCaseIgnoreString
);
HRESULT put_CaseIgnoreString(
[in] BSTR bstrCaseIgnoreString
);

DNString

Cadeia de caracteres que identifica o nome diferenciado (caminho) de um objeto de


valor de serviço de diretório.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR


syntax

// C++ method syntax


HRESULT get_DNString(
[out] BSTR* bstrDNString
);
HRESULT put_DNString(
[in] BSTR bstrDNString
);

Inteiro

Valor inteiro.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_Integer(
[out] LONG* lnInteger
);
HRESULT put_Integer(
[in] LONG lnInteger
);

LargeInteger

Ponteiro para a interface IDispatch do objeto que implementa IADsLargeInteger para


esse valor.

Tipo de acesso: leitura/gravação

Tipo de dados de script: IDispatch

syntax

// C++ method syntax


HRESULT get_LargeInteger(
[out] IDispatch** ppLargeInteger
);
HRESULT put_LargeInteger(
[in] IDispatch* pLargeInteger
);

NumericString
Texto a ser interpretado. Tipo numérico.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_NumericString(
[out] BSTR* bstrNumericString
);
HRESULT put_NumericString(
[in] BSTR bstrNumericString
);

OctetString

Matriz variante de caracteres de um byte.

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT

syntax

// C++ method syntax


HRESULT get_OctetString(
[in] VARIANT* vOctetString
);
HRESULT put_OctetString(
[in] VARIANT* vOctetString
);

PrintableString

Exibir ou imprimir cadeia de caracteres.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_PrintableString(
[out] BSTR* bstrPrintableString
);
HRESULT put_PrintableString(
[in] BSTR bstrPrintableString
);

SecurityDescriptor

Ponteiro para a interface IDispatch do objeto que implementa IADsSecurityDescriptor


para esse valor.

Tipo de acesso: leitura/gravação

Tipo de dados de script: IDispatch

syntax

// C++ method syntax


HRESULT get_SecurityDescriptor(
[out] IDispatch** ppSecurityDescriptor
);
HRESULT put_SecurityDescriptor(
[in] IDispatch* pSecurityDescriptor
);

UTCTime

Uma data do tipo VT_DATE expresso no formato UTC (Tempo Universal Coordenado).

Tipo de acesso: leitura/gravação

Tipo de dados de script: DATE

syntax

// C++ method syntax


HRESULT get_UTCTime(
[out] DATE* daUTCTime
);
HRESULT put_UTCTime(
[in] DATE daUTCTime
);

Comentários
As propriedades IADsPropertyValue definirão ou recuperarão apenas um valor de
propriedade do tipo especificado. Por exemplo, a propriedade CaseIgnoreString em um
atributo do tipo ADSTYPE_DN_STRING, como o atributo distinguishedName , resultará
em um erro. A propriedade CaseIgnoreString só funcionará em atributos do tipo
ADS_CASE_IGNORE_STRING. A tabela a seguir mapeia o valor ADSTYPEENUM para a
propriedade IADsPropertyValue correspondente que pode ser usada para acessar esse
tipo de atributo. Se um valor ADSTYPEENUM não estiver listado nesta tabela, ele não
estará disponível na interface IADsPropertyValue . A interface IADsPropertyValue2 deve
ser usada para obter dados em outros formatos.

Valor ADSTYPEENUM Propriedade IADsPropertyValue

ADSTYPE_DN_STRING DNString

ADSTYPE_CASE_EXACT_STRING CaseExactString

ADSTYPE_CASE_IGNORE_STRING CaseIgnoreString

ADSTYPE_PRINTABLE_STRING PrintableString

ADSTYPE_NUMERIC_STRING NumericString

ADSTYPE_BOOLEAN Booliano

ADSTYPE_INTEGER Inteiro

ADSTYPE_OCTET_STRING OctetString

ADSTYPE_UTC_TIME UTCTime

ADSTYPE_LARGE_INTEGER LargeInteger

ADSTYPE_NT_SECURITY_DESCRIPTOR SecurityDescriptor

Exemplos
O exemplo de código a seguir mostra como recuperar uma propriedade da lista de
propriedades.

VB

Dim propList As IADsPropertyList


Dim propEntry As IADsPropertyEntry
Dim propVal As IADsPropertyValue

On Error GoTo Cleanup

' Retrieve the property list.


Set propList = GetObject("LDAP://dc01/DC=Fabrikam,DC=com")
propList.GetInfo

' Retrieve a property entry. If you are certain of the property type,
' replace ADSTYPE_UNKNOWN with the actual property type.
Set propEntry = propList.GetPropertyItem("description", ADSTYPE_UNKNOWN)

' Print the property entry values.


For Each v In propEntry.Values
Set propVal = v
Select Case propVal.ADsType
Case ADSTYPE_CASE_EXACT_STRING
Debug.Print propVal.CaseExactString
Case ADSTYPE_CASE_IGNORE_STRING
Debug.Print propVal.CaseIgnoreString
Case Else
Debug.Print "Unable to handle a property of type: " &
propVal.ADsType
End Select

Next

Cleanup:
If (Err.Number<>0) Then
Debug.Print "An error has occurred. " & Err.Number
End If
Set propList = Nothing
Set propEntry = Nothing
Set propVal = Nothing

O código a seguir mostra como usar IADsPropertyValue::get_CaseIgnoreString para


recuperar o valor da propriedade description de uma lista de propriedades.

C++

#include <activeds.h>
#include <stdio.h>

IADsPropertyList *pList = NULL;


IADsPropertyEntry *pEntry = NULL;
IADsPropertyValue *pVal = NULL;
IADs *pObj = NULL;
VARIANT var, varItem;
BSTR valStr;
IEnumVARIANT *pEnum = NULL;
LONG lstart = 0;
LONG lend = 0;
LONG lADsType = ADSTYPE_UNKNOWN;

VariantInit(&var);
VariantInit(&varItem);

// Bind to the directory object.


HRESULT hr = ADsGetObject(L"LDAP://dc01/DC=Fabrikam,DC=com",
IID_IADsPropertyList,
(void**)&pList);

if(FAILED(hr)){goto Cleanup;}
// Initialize the property cache.
hr = pList->QueryInterface(IID_IADs,(void**)&pObj);
if(FAILED(hr)){goto Cleanup;}

pObj->GetInfo();
pObj->Release();

// Retrieve the property entry.


hr = pList->GetPropertyItem(CComBSTR("description"),
ADSTYPE_CASE_IGNORE_STRING, &var);
pList->Release();
if(FAILED(hr)){goto Cleanup;}

hr = V_DISPATCH(&var)->QueryInterface(IID_IADsPropertyEntry,
(void**)&pEntry);
VariantClear(&var);
if(FAILED(hr)){goto Cleanup;}

// Retrieve the value array of the property entry.


hr = pEntry->get_Values(&var);
if(FAILED(hr)){goto Cleanup;}

SAFEARRAY *sa = V_ARRAY( &var );

// Retrieve the lower and upper bound. Iterate and print the values.
hr = SafeArrayGetLBound( sa, 1, &lstart );
hr = SafeArrayGetUBound( sa, 1, &lend );
printf(" Property value(s) = ");
for ( long idx=lstart; idx < lend+1; idx++ ) {
hr = SafeArrayGetElement( sa, &idx, &varItem );
hr = V_DISPATCH(&varItem)->QueryInterface(IID_IADsPropertyValue,
(void**)&pVal);
if(FAILED(hr)){goto Cleanup;}

pVal->get_ADsType(&lADsType);

switch(lADsType)
{
case ADSTYPE_CASE_IGNORE_STRING:
{
hr = pVal->get_CaseIgnoreString(&valStr);
break;
}
case ADSTYPE_CASE_EXACT_STRING:
{
hr = pVal->get_CaseExactString(&valStr);
break;
}
default:
{
valStr = SysAllocString(L"Unable to handle a property of this
type");
break;
}
}

if(FAILED(hr)){goto Cleanup;}
printf(" %S ", valStr);
SysFreeString(valStr);
VariantClear(&varItem);
}
printf("\n");

Cleanup:
if(pList)
pList = NULL;

if(pEntry)
pEntry = NULL;

if(pVal)
pVal = NULL;

if(pObj)
pObj = NULL;

if(pEnum)
pEnum = NULL;

SysFreeString(valStr);
VariantClear(&varItem);
VariantClear(&var);

Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsPropertyValue é definido como 79FA9AD0-A97C-11D0-8534-


00C04FD8D503

Confira também
IADsPropertyValue
ADSTYPEENUM

IADsPropertyEntry

IADsPropertyList

IADsPropertyValue2

IADsSecurityDescriptor

IDispatch

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Método IADsPropertyValue::Clear
(iads.h)
Artigo24/08/2023

O método IADsPropertyValue::Clear limpa os valores atuais do objeto de valor da


propriedade.

Sintaxe
C++

HRESULT Clear();

Valor retornado
Esse método dá suporte aos valores de retorno HRESULT padrão, incluindo S_OK. Para
obter mais informações e outros valores retornados, consulte Códigos de erro ADSI.

Comentários
Nenhum

Exemplos

O exemplo de código a seguir mostra como usar IADsPropertyValue::Clear para limpar


o valor da propriedade "description" de uma lista de propriedades.

VB

Dim propList As IADsPropertyList


Dim propEntry As IADsPropertyEntry
Dim propVal As IADsPropertyValue

On Error GoTo Cleanup

' Get the property list.


Set propList = GetObject("LDAP://dc01/DC=Fabrikam,DC=com")
propList.GetInfo

' Get a property entry. If you know the exact type of the property,
' replace ADSTYPE_UNKNOWN with that type.
Set propEntry = propList.GetPropertyItem("description", ADSTYPE_UNKNOWN)

' Clear all the values of the property entry.


For Each v In propEntry.Values
Set propVal = v
propVal.Clear
Next

propList.SetInfo

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If

Set propList = Nothing


Set propEntry = Nothing
Set propVal = Nothing

O exemplo de código a seguir mostra como usar IADsPropertyValue::Clear para limpar


o valor da propriedade "description" de uma lista de propriedades.

C++

#include <activeds.h>
#include <stdio.h>

IADsPropertyList *pList = NULL;


IADsPropertyEntry *pEntry = NULL;
IADsPropertyValue *pVal = NULL;
IADs *pObj = NULL;
VARIANT var, varItem;
BSTR valStr;
IEnumVARIANT *pEnum = NULL;
LONG lstart, lend;

VariantInit(&var);
VariantInit(&varItem);

// Bind to the directory object.


HRESULT hr = ADsGetObject(L"LDAP://dc01/DC=Fabrikam,DC=com",
IID_IADsPropertyList,
(void**)&pList);
if(FAILED(hr)){goto Cleanup;}

// Initialize the property cache.


hr = pList->QueryInterface(IID_IADs,(void**)&pObj);
if(FAILED(hr)){goto Cleanup;}

pObj->GetInfo();
pObj->Release();
// Get a property entry.
hr = pList->GetPropertyItem(CComBSTR("description"), ADSTYPE_UNKNOWN, &var);
if(FAILED(hr)){goto Cleanup;}

pList->Release();
hr = V_DISPATCH(&var)->QueryInterface(IID_IADsPropertyEntry,
(void**)&pEntry);
if(FAILED(hr)){goto Cleanup;}
VariantClear(&var);

// Get the value array of the property entry.


hr = pEntry->get_Values(&var);
if(FAILED(hr)){goto Cleanup;}
SAFEARRAY *sa = V_ARRAY( &var );

// Get the lower and upper bound, iterate, and print the values.
hr = SafeArrayGetLBound( sa, 1, &lstart );
hr = SafeArrayGetUBound( sa, 1, &lend );
printf(" Property value(s) = ");
for ( long idx=lstart; idx < lend+1; idx++ ) {
hr = SafeArrayGetElement( sa, &idx, &varItem );
hr = V_DISPATCH(&varItem)->QueryInterface(IID_IADsPropertyValue,
(void**)&pVal);
VariantClear(&varItem);
hr = pVal->Clear();
if(FAILED(hr)){goto Cleanup;}
}

pList->SetInfo();

Cleanup:
if(pList)
pList->Release();

if(pEntry)
pEntry->Release();

if(pVal)
pVal->Release();

if(pObj)
pObj->Release();

if(pEnum)
pEnum->Release();

if(valStr)
SysFreeString(valStr);

VariantClear(&var);
VariantClear(&varItem);
Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

IADsPropertyValue

Métodos da propriedade IADsPropertyValue

Comentários
Esta página foi útil?  Yes  No
Interface IADsPropertyValue2 (iads.h)
Artigo14/03/2023

A interface IADsPropertyValue2 é usada para representar o valor de um objeto


IADsPropertyEntry em qualquer formato de dados, incluindo tipos de dados novos ou
definidos pelo cliente. Essa interface também é útil para lidar com valores de atributo
para vários serviços de diretório.

A propriedade IADsPropertyEntry.Values contém uma matriz de objetos


IADsPropertyValue2 . Cada um dos objetos IADsPropertyValue contém um único valor
do objeto IADsPropertyEntry . Para obter mais informações e um exemplo de código
para criar entradas e valores de propriedade totalmente novos, consulte
IADsPropertyList.PutPropertyItem.

Antes de chamar os métodos dessas interfaces, você deve chamar IADs.GetInfo ou


IADs.GetInfoEx explicitamente para carregar os valores atribuídos do objeto no cache, se
o cache não tiver sido inicializado. Depois de modificar os valores do objeto, você deve
chamar IADs.SetInfo para salvar as alterações no repositório persistente do diretório
subjacente.

Essa interface é mais versátil do que a IADsPropertyValue porque essa interface pode ser
usada para obter qualquer tipo de dados. A interface IADsPropertyValue só pode ser
usada para obter um número limitado de tipos de dados.

Herança
A interface IADsPropertyValue2 herda da interface IDispatch . IADsPropertyValue2
também tem estes tipos de membros:

Métodos
A interface IADsPropertyValue2 tem esses métodos.

IADsPropertyValue2::GetObjectProperty

Recupera um valor de atributo.

IADsPropertyValue2::P utObjectProperty

Define um valor de atributo.


Comentários
A tabela a seguir lista os valores de parâmetro lnADsType nos métodos
GetObjectProperty e PutObjectProperty para o tipo de dados pvProp correspondente.

Valor lnADsType Tipo de dados pvProp

ADSTYPE_INVALID Não disponível.

ADSTYPE_DN_STRING VT_BSTR

ADSTYPE_CASE_EXACT_STRING VT_BSTR

ADSTYPE_CASE_IGNORE_STRING VT_BSTR

ADSTYPE_PRINTABLE_STRING VT_BSTR

ADSTYPE_NUMERIC_STRING VT_BSTR

ADSTYPE_BOOLEAN VT_BOOL

ADSTYPE_INTEGER VT_I4

ADSTYPE_OCTET_STRING VT_ARRAY | VT_UI4

ADSTYPE_UTC_TIME VT_DATE

ADSTYPE_LARGE_INTEGER VT_DISPATCH (IADsLargeInteger)

ADSTYPE_PROV_SPECIFIC VT_ARRAY | VT_UI1

ADSTYPE_OBJECT_CLASS Não disponível.

ADSTYPE_CASEIGNORE_LIST VT_DISPATCH (IADsCaseIgnoreList)

ADSTYPE_OCTET_LIST VT_DISPATCH (IADsOctetList)

ADSTYPE_PATH VT_DISPATCH (IADsPath)

ADSTYPE_POSTALADDRESS VT_DISPATCH (IADsPostalAddress)

ADSTYPE_TIMESTAMP VT_DISPATCH (IADsTimestamp)

ADSTYPE_BACKLINK VT_DISPATCH (IADsBackLink)

ADSTYPE_TYPEDNAME VT_DISPATCH (IADsTypedName)

ADSTYPE_HOLD VT_DISPATCH (IADsHold)

ADSTYPE_NETADDRESS VT_DISPATCH (IADsNetAddress)

ADSTYPE_REPLICAPOINTER VT_DISPATCH (IADsReplicaPointer)


ADSTYPE_FAXNUMBER VT_DISPATCH (IADsFaxNumber)

ADSTYPE_EMAIL VT_DISPATCH (IADsEmail)

ADSTYPE_NT_SECURITY_DESCRIPTOR VT_DISPATCH (IADsSecurityDescriptor)

ADSTYPE_UNKNOWN Não disponível.

ADSTYPE_DN_WITH_BINARY VT_DISPATCH (IADsDNWithBinary)

ADSTYPE_DN_WITH_STRING VT_DISPATCH (IADsDNWithString)

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
IADsPropertyEntry

IADsPropertyList

IADsPropertyValue

IDispatch

Comentários
Esta página foi útil?  Yes  No
Método
IADsPropertyValue2::GetObjectProperty
(iads.h)
Artigo24/08/2023

O método IADsPropertyValue2::GetObjectProperty recupera um valor de atributo.

Sintaxe
C++

HRESULT GetObjectProperty(
[in, out] long *lnADsType,
[out] VARIANT *pvProp
);

Parâmetros
[in, out] lnADsType

Ponteiro para uma variável que, na entrada, contém um dos valores ADSTYPEENUM que
especifica o formato de dados que o valor deve ser retornado.

Se o tipo de dados não for conhecido, defina-o como ADSTYPE_UNKNOWN. Nesse


caso, esse método obterá o valor do atributo no tipo de dados padrão e definirá essa
variável como o valor ADSTYPEENUM correspondente. Se qualquer outro valor
ADSTYPEENUM for especificado, ADSI retornará o valor do atributo somente se o tipo
de dados corresponder ao formato do valor.

[out] pvProp

Ponteiro para um VARIANT que recebe o valor do atributo solicitado. O tipo variante
desses dados dependerá do valor retornado em lnADsType. Para obter mais informações
e uma lista dos valores lnADsType e tipos de variante pvProp correspondentes, consulte
IADsPropertyValue2.

Valor retornado
Retorna S_OK se tiver êxito ou um dos códigos de erro a seguir.
Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

ADSTYPEENUM

IADsPropertyValue

IADsPropertyValue2

Comentários
Esta página foi útil?  Yes  No
Método IADsPropertyValue2::P
utObjectProperty (iads.h)
Artigo24/08/2023

O método IADsPropertyValue2::P utObjectProperty define um valor de atributo.

Sintaxe
C++

HRESULT PutObjectProperty(
[in] long lnADsType,
[in] VARIANT vProp
);

Parâmetros
[in] lnADsType

Contém um dos valores ADSTYPEENUM que especifica o formato de dados do conjunto


de valores. Esse valor deve corresponder ao tipo de variante pvProp . Para obter mais
informações e uma lista dos valores lnADsType e tipos de variante pvProp
correspondentes, consulte IADsPropertyValue2.

[in] vProp

Ponteiro para um VARIANT que contém o novo valor de atributo. O tipo variante desses
dados deve corresponder ao valor em lnADsType. Para obter mais informações e uma
lista dos valores lnADsType e tipos de variante pvProp correspondentes, consulte
IADsPropertyValue2.

Valor retornado
Retorna S_OK se tiver êxito ou um código de erro caso contrário. Veja a seguir os
códigos de erro mais comuns.

Requisitos
Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

ADSTYPEENUM

IADsPropertyValue

IADsPropertyValue2

Comentários
Esta página foi útil?  Yes  No
ADSI (Interfaces de Objeto Persistente)
Artigo • 03/06/2023

Esta seção descreve as seguintes interfaces de objeto persistentes:

IADsCollection
IADsComputer
IADsDomain
IADsFileService
IADsFileShare
IADsGroup
IADsLocality
IADsMembers
IADsO
IADsOU
IADsPrintjob
IADsPrintQueue
IADsService
Iadsuser

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interface IADsCollection (iads.h)
Artigo14/03/2023

A interface IADsCollection é uma interface dupla que permite que seu objeto ADSI de
hospedagem defina e gerencie um conjunto arbitrário de elementos de dados
nomeados para um serviço de diretório. As coleções diferem de matrizes de elementos
em que itens individuais podem ser adicionados ou excluídos sem reordenar toda a
matriz.

Objetos de coleção podem representar um ou mais itens que correspondem a dados


voláteis, como processos ou sessões de comunicação ativas, bem como dados
persistentes, como entidades físicas para um serviço de diretório. Por exemplo, um
objeto de coleção pode representar uma lista de trabalhos de impressão em uma fila ou
uma lista de sessões ativas conectadas a um servidor. Embora um objeto de coleção
possa representar conjuntos de dados arbitrários, todos os elementos em uma coleção
devem ser do mesmo tipo. Os dados são de tipos Variant .

O ADSI também expõe as interfaces IADsMembers e IADsContainer para manipular dois


casos especiais de objetos de coleção. IADsMembers é usado para uma coleção de
objetos que compartilham uma associação comum. Um exemplo desses objetos são
usuários que pertencem a um grupo. IADsContainer aplica-se a um objeto ADSI que
contém outros objetos. Um exemplo disso é uma árvore de diretório ou uma topologia
de rede.

Herança
A interface IADsCollection herda da interface IDispatch . IADsCollection também tem
esses tipos de membros:

Métodos
A interface IADsCollection tem esses métodos.

IADsCollection::Add

Adiciona um item nomeado à coleção.

IADsCollection::get__NewEnum

O método IADsCollection::get__NewEnum obtém um objeto enumerador dependente que


implementa IEnumVARIANT para este objeto de coleção ADSI. Lembre-se de que há dois
caracteres de sublinhado no nome da função (get__NewEnum).

IADsCollection::GetObject

Recupera um item da coleção.

IADsCollection::Remove

O método IADsCollection::Remove remove o item nomeado deste objeto de coleção ADSI.

Comentários
Dos provedores de sistema ADSI, somente o provedor WinNT dá suporte a essa
interface para lidar com sessões de serviço de arquivos ativas, recursos e trabalhos de
impressão.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
IADsContainer

IADsMembers

IDispatch

Comentários
Esta página foi útil?  Yes  No
Método IADsCollection::Add (iads.h)
Artigo24/08/2023

O método IADsCollection::Add adiciona um item nomeado à coleção.

Sintaxe
C++

HRESULT Add(
[in] BSTR bstrName,
[in] VARIANT vItem
);

Parâmetros
[in] bstrName

O valor BSTR que especifica o nome do item. IADsCollection::GetObject e


IADsCollection::Remove referenciam o item por esse nome.

[in] vItem

Valor do item. Quando o item é um objeto, esse parâmetro contém o ponteiro da


interface IDispatch no objeto .

Valor retornado
Esse método dá suporte aos valores retornados padrão, bem como aos seguintes.

Para obter mais informações e outros valores retornados, consulte Códigos de erro
ADSI.

Comentários
Coleções de um serviço de diretório também podem consistir em um conjunto de
objetos imutáveis.

Esse método não tem suporte em nenhum dos provedores de sistema ADSI.
Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

Provedores de sistema ADSI

IADsCollection

IADsCollection::GetObject

IADsCollection::Remove

IDispatch

Comentários
Esta página foi útil?  Yes  No
Método IADsCollection::get__NewEnum
(iads.h)
Artigo24/08/2023

O método IADsCollection::get__NewEnum obtém um objeto enumerador dependente


que implementa IEnumVARIANT para esse objeto de coleção ADSI. Lembre-se de que
há dois caracteres de sublinhado no nome da função (get__NewEnum).

Sintaxe
C++

HRESULT get__NewEnum(
[out] IUnknown **ppEnumerator
);

Parâmetros
[out] ppEnumerator

Ponteiro para um ponteiro para a interface IUnknown no objeto enumerador dessa


coleção.

Valor retornado
Esse método dá suporte aos valores retornados padrão, incluindo S_OK, E_FAIL ou
E_NOTIMPL. Para obter mais informações e outros valores retornados, consulte Códigos
de erro ADSI.

Comentários
Quando um servidor dá suporte à pesquisa paginada e o cliente especifica o limite de
página maior que o máximo de resultados de pesquisa permitidos no servidor, o
método IADsCollection::get__NewEnum retorna erros das seguintes maneiras:

Se o servidor retornar um erro sem resultados, a função retornará apenas o erro.


Se o servidor retornar resultados parciais com ou sem um erro, por exemplo, o
máximo de resultados de pesquisa permitidos no servidor, a função retornará os
resultados parciais do servidor para o usuário.
Se o servidor retornar todos os resultados com ou sem um erro, por exemplo, o
máximo de resultados de pesquisa em cada página e todos os resultados por meio
de várias páginas, a função retornará todos os resultados do servidor para o
usuário.

Exemplos
O para cada... Em... A próxima instrução no exemplo de código do Visual Basic a seguir
invoca get__NewEnum método implicitamente.

VB

Dim fso As IADsFileServiceOperations


On Error GoTo Cleanup

Set fso = GetObject("WinNT://myComputer/Fabrikam01")

Dim coll As IADsCollection


Set coll = fso.Sessions

' The following statement invokes IADsCollection::get__NewEnum.


For Each session In coll
MsgBox "Session name: " & session.Name
Next session

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred... " & Err.Number)
End If
Set fso = Nothing

O exemplo de código C++ a seguir mostra como IADsCollection::get__NewEnum é


usado para enumerar sessões de serviço de arquivo ativo.

C++

HRESULT EnumCollection(IADsCollection *);

HRESULT GetACollectionOfSessions()
{
LPWSTR adspath = L"WinNT://myComputer/LanmanServer";
HRESULT hr = S_OK;
IADsCollection *pColl = NULL;

// Bind to file service operations.


IADsFileServiceOperations *pFso = NULL;
hr = ADsGetObject(adspath,
IID_IADsFileServiceOperations,
(void**)&pFso);
if(FAILED(hr)) {goto Cleanup;}

// Get the pointer to the collection.


hr = pFso->Sessions(&pColl);
if(FAILED(hr)) {goto Cleanup;}

hr = EnumCollection(pColl);

Cleanup:
if(pColl) pColl->Release();
if(pFso) pFso->Release();

return hr;
}

HRESULT EnumCollection(IADsCollection *pColl)


{
IUnknown *pUnk=NULL;
HRESULT hr = S_OK;
// Get the Enumerator object on the collection object.
hr = pColl->get__NewEnum(&pUnk);
if(FAILED(hr)) {goto Cleanup;}

IEnumVARIANT *pEnum;
hr = pUnk->QueryInterface(IID_IEnumVARIANT,(void**)&pEnum);
if(FAILED(hr)) {goto Cleanup;}

// Enumerate the collection.


BSTR bstr = NULL;
VARIANT var;
IADs *pADs = NULL;
ULONG lFetch;
IDispatch *pDisp = NULL;

VariantInit(&var);
hr = pEnum->Next(1, &var, &lFetch);
while(hr == S_OK)
{
if (lFetch == 1)
{
pDisp = V_DISPATCH(&var);
pDisp->QueryInterface(IID_IADs, (void**)&pADs);
pADs->get_Name(&bstr);
printf("Session name: %S\n",bstr);
SysFreeString(bstr);
pADs->Release();
}
VariantClear(&var);
pDisp->Release();
pDisp = NULL;
hr = pEnum->Next(1, &var, &lFetch);
};
Cleanup:
if(pDisp) pDisp->Release();
if(pUnk) pUnk->Release();
if(pColl) pColl->Release();
if(pEnum) pEnum->Release();
return hr;
}

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

IADsCollection

IEnumVARIANT

IUnknown

Comentários
Esta página foi útil?  Yes  No
Método IADsCollection::GetObject
(iads.h)
Artigo24/08/2023

O método IADsCollection::GetObject recupera um item da coleção.

Sintaxe
C++

HRESULT GetObject(
[in] BSTR bstrName,
[in] VARIANT *pvItem
);

Parâmetros
[in] bstrName

A cadeia de caracteres Unicode terminada em nulo que especifica o nome do item. Esse
é o mesmo nome passado para IADsCollection::Add quando o item é adicionado à
coleção.

[in] pvItem

Valor atual do item. Para um objeto , isso corresponde ao ponteiro da interface


IDispatch no objeto .

Valor retornado
Esse método dá suporte aos valores retornados padrão, incluindo S_OK. Para obter mais
informações e outros valores retornados, consulte Códigos de erro ADSI.

Comentários
Se você souber o nome de uma sessão na coleção Sessions , chame o método
IADsCollection::GetObject explicitamente para recuperar o objeto de sessão.
Exemplos
O exemplo de código do Visual Basic a seguir mostra como recuperar um objeto de
sessão nomeado de uma coleção de sessões de serviço de arquivo ativas.

VB

Dim fso As IADsFileServiceOperations


Dim ses As IADsSession
Dim coll As IADsCollection
Dim mySessionName As String

Set fso = GetObject("WinNT://myComputer/FabrikamServer")


Set coll = fso.Sessions

' Insert code to set mySessionName to the name of mySession.

' The following statement invokes IADsCollection::GetObject.


Set ses = coll.GetObject(mySessionName)

O exemplo de código C++ a seguir mostra como recuperar um objeto de sessão


nomeado de uma coleção de sessões de serviço de arquivo ativas.

C++

HRESULT GetASessionObjectFromCollection(BSTR mySession)


{
LPWSTR adspath = L"WinNT://myComputer/FabrikamServer";
IUnknown *pUnk=NULL;
HRESULT hr = S_OK;
IADsCollection *pColl = NULL;
IADsFileServiceOperations *pFso = NULL;
IADs *pADsObj = NULL;
VARIANT varObj;
BSTR bstrObj = NULL;

VariantInit(&varObj);
hr = ADsGetObject(adspath,
IID_IADsFileServiceOperations,
(void**)&pFso);
if(FAILED(hr)) {goto Cleanup;}

hr = pFso->Sessions(&pColl);
if(FAILED(hr)) {goto Cleanup;}

hr = pColl->GetObject(mySession, &varObj);
V_DISPATCH(&varObj)->QueryInterface(IID_IADs,(void**)&pADsObj);
hr = pADsObj->get_Class(&bstrObj);
printf("Class of the object obtained from GetObject: %S\n",
bstrObj);
Cleanup:
if(bstrObj) SysFreeString(bstrObj);
if(pFso) pFso->Release();
VariantClear(&varObj);
if(pADsObj) pADsObj->Release();
if(pColl) pColl->Release();

return hr;
}

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

IADsCollection

IADsCollection::Add

IDispatch

IEnumVARIANT

Comentários
Esta página foi útil?  Yes  No
Método IADsCollection::Remove (iads.h)
Artigo24/08/2023

O método IADsCollection::Remove remove o item nomeado deste objeto de coleção


ADSI.

Sintaxe
C++

HRESULT Remove(
[in] BSTR bstrItemToBeRemoved
);

Parâmetros
[in] bstrItemToBeRemoved

A cadeia de caracteres Unicode terminada em nulo que especifica o nome do item


conforme especificado por IADsCollection::Add.

Valor retornado
Esse método dá suporte aos valores retornados padrão, incluindo S_OK. Para obter mais
informações e outros valores retornados, consulte Códigos de erro ADSI.

Comentários
Coleções de um serviço de diretório também podem consistir em um conjunto de
objetos imutáveis.

Coleções que não dão suporte à remoção direta de itens são necessárias para retornar
E_NOTIMPL.

Exemplos

O exemplo de código do Visual Basic a seguir mostra como remover um objeto de


sessão nomeado de uma coleção de sessões de serviço de arquivo ativas.
VB

Dim fso As IADsFileServiceOperations


Dim ses As IADsSession
Dim coll As IADsCollection
Dim mySessionName As String

On Error GoTo Cleanup

Set fso = GetObject("WinNT://myComputer/FabrikamServer")


Set coll = fso.Sessions

' Insert code to set mySessionName to the name of the mySession


' session object.

' The following statement invokes IADsCollection::Remove.


coll.Remove mySessionName

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set fso = Nothing
Set ses = Nothing
Set coll = Nothing

O exemplo de código C++ a seguir mostra como remover um objeto de sessão


nomeado de uma coleção de sessões de serviço de arquivo ativas.

C++

HRESULT RemoveASessionObjectFromCollection()
{
LPWSTR adspath = L"WinNT://myComputer/FabrikamServer";
HRESULT hr = S_OK;
IADsCollection *pColl = NULL;
IADsFileServiceOperations *pFso = NULL;

hr = ADsGetObject(adspath,IID_IADsFileServiceOperations,(void**)&pFso);
if(FAILED(hr)) {goto Cleanup;}

hr = pFso->Sessions(&pColl);
if(FAILED(hr)) {goto Cleanup;}

hr = pColl->Remove(CComBSTR("MySession"));

Cleanup
if(pFso) pFso->Release();
if(pColl) pColl->Release();
return hr;
}

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

IADsCollection

IADsCollection::Add

Comentários
Esta página foi útil?  Yes  No
Interface IADsComputer (iads.h)
Artigo24/08/2023

A interface IADsComputer é uma interface dupla que herda de IADs. Ele foi projetado
para representar e gerenciar um computador, como um servidor, um cliente, uma
estação de trabalho e assim por diante, em uma rede. Você pode manipular as
propriedades dessa interface para acessar dados sobre um computador. Os dados
incluem o sistema operacional, a make e o modelo, o processador, o identificador do
computador, seus endereços de rede e assim por diante.

Nota A interface IADsComputer não é implementada pelo provedor ADSI LDAP.


Para obter mais informações, consulte AdsI Objects of LDAP.

Herança
A interface IADsComputer herda de IDispatch e IADs. IADsComputer também tem estes
tipos de membros:

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Iads

Métodos da propriedade IADsComputer

IDispatch
Comentários
Esta página foi útil?  Yes  No
Métodos da propriedade IADsComputer
Artigo • 13/06/2023

Os métodos de interface IADsComputer leem e gravam as propriedades descritas neste


tópico. Para obter mais informações, consulte Métodos de propriedade de interface.

Propriedades
ComputerID

O identificador global exclusivo atribuído a cada computador.

Tipo de acesso: Somente leitura

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_ComputerID(
[out] BSTR* pbstrComputerID
);

Departamento

A UO (unidade organizacional), como o departamento, à qual este computador


pertence.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Department(
[out] BSTR* pbstrDepartment
);
HRESULT put_Department(
[in] BSTR bstrDepartment
);

Descrição

A descrição deste computador.


Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Description(
[out] BSTR* pbstrDescription
);
HRESULT put_Description(
[in] BSTR bstrDescription
);

Divisão

A divisão, dentro de uma organização, à qual este computador pertence.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Division(
[out] BSTR* pbstrDivision
);
HRESULT put_Division(
[in] BSTR bstrDivision
);

Localidade

O local físico atribuído deste computador.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Location(
[out] BSTR* pbstrLocation
);
HRESULT put_Location(
[in] BSTR bstrLocation
);
MemorySize

O tamanho, em megabytes, da memória de acesso aleatório para este computador.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_MemorySize(
[out] BSTR* pbstrMemorySize
);
HRESULT put_MemorySize(
[in] BSTR bstrMemorySize
);

Modelo

A criação e o modelo deste computador.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Model(
[out] BSTR* pbstrModel
);
HRESULT put_Model(
[in] BSTR bstrModel
);

NetAddresses

Uma matriz de campos NetAddress que representam os endereços pelos quais este
computador pode ser acessado. NetAddress é um BSTR específico do provedor
composto por duas subcadeias de caracteres separadas por dois-pontos (:). A subcadeia
de caracteres esquerda indica o tipo de endereço e a subcadeia de caracteres direita é
uma representação de cadeia de caracteres de um endereço desse tipo. Por exemplo,
endereços TCP/IP são do formato: IP:100.201.301.45. Os endereços de tipo IPX são do
formato: IPX:10.123456.80.

Tipo de acesso: leitura/gravação


Tipo de dados de script: VARIANT

syntax

// C++ method syntax


HRESULT get_NetAddresses(
[out] VARIANT* pvNetAddresses
);
HRESULT put_NetAddresses(
[in] VARIANT vNetAddresses
);

OperatingSystem

O sistema operacional usado neste computador.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_OperatingSystem(
[out] BSTR* pbstrOperatingSystem
);
HRESULT put_OperatingSystem(
[in] BSTR bstrOperatingSystem
);

OperatingSystemVersion

A versão do sistema operacional usada neste computador.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_OperatingSystemVersion(
[out] BSTR* pbstrOperatingSystemVersion
);
HRESULT put_OperatingSystemVersion(
[in] BSTR bstrOperatingSystemVersion
);

Proprietário
A pessoa à qual este computador é atribuído. Essa pessoa também deve ter uma licença
para executar o software instalado.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Owner(
[out] BSTR* pbstrOwner
);
HRESULT put_Owner(
[in] BSTR bstrOwner
);

PrimaryUser

O nome da pessoa de contato, como um administrador, para este computador.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_PrimaryUser(
[out] BSTR* pbstrPrimaryUser
);
HRESULT put_PrimaryUser(
[in] BSTR bstrPrimaryUser
);

Processador

O tipo de processador.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Processor(
[out] BSTR* pbstrProcessor
);
HRESULT put_Processor(
[in] BSTR bstrProcessor
);

ProcessorCount

O número de processadores instalados.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_ProcessorCount(
[out] BSTR* pbstrProcessorCount
);
HRESULT put_ProcessorCount(
[in] BSTR bstrProcessorCount
);

Função

A função deste computador, por exemplo, estação de trabalho, servidor ou controlador


de domínio.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Role(
[out] BSTR* pbstrRole
);
HRESULT put_Role(
[in] BSTR bstrRole
);

Site

O identificador global exclusivo que identifica o site no qual este computador foi
instalado. Um site é uma região física de boa conectividade em uma rede.

Tipo de acesso: Somente leitura


Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Site(
[out] BSTR* pbstrSite
);

StorageCapacity

O tamanho, em megabytes, do disco.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_StorageCapacity(
[out] BSTR* pbstrStorageCapacity
);
HRESULT put_StorageCapacity(
[in] BSTR bstrStorageCapacity
);

Comentários
Provedores diferentes podem optar por expor propriedades diferentes de um objeto de
computador. Para obter mais informações, consulte Provedores de sistema ADSI.

Você pode descobrir quais propriedades têm suporte inspecionando as propriedades


obrigatórias e opcionais por meio de sua classe de esquema. Para obter mais
informações, consulte a interface IADsClass .

Para examinar a status de um computador ou executar a operação de desligamento em


toda a rede, você deve usar a interface IADsComputerOperations.

Exemplos
O exemplo de código do Visual Basic a seguir examina as propriedades do computador
compatíveis com o provedor ADSI WinNT.

VB
Dim obj As IADs
On Error Resume Next

Set obj = GetObject("WinNT://myMachine,computer")


If (obj.Class = "Computer") Then
MsgBox "Computer owner: " & obj.owner
MsgBox "Computer division: " & obj.Division
MsgBox "Computer operatingSystem: " & obj.OperatingSystem
MsgBox "Computer operating System Version: " &
obj.OperatingSystemVersion
MsgBox "Computer processor: " & obj.Processor
MsgBox "Computer processor Count: " & obj.ProcessorCount
End If

O exemplo de código C++ a seguir examina as propriedades do computador


compatíveis com o provedor ADSI WinNT.

C++

IADsComputer *pComp = NULL;


LPWSTR adspath = L"WinNT://jeffsmith1,computer";
HRESULT hr = S_OK;
BSTR bstr = NULL;

hr = ADsGetObject(adspath,IID_IADsComputer,(void**)&pComp);
if(FAILED(hr)) {goto Cleanup;}

hr = pComp->get_Owner(&bstr);
if(FAILED(hr)) {goto Cleanup;}

printf("Computer owner: %S\n",bstr);


SysFreeString(bstr);

hr = pComp->get_OperatingSystem(&bstr);
if(FAILED(hr)) {goto Cleanup;}
printf("Operating System: %S\n",bstr);
SysFreeString(bstr);

Cleanup:
if(pComp) pComp->Release();
if(bstr) SysFreeString(bstr);
return hr;

Requisitos
Requisito Valor
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsComputer é definido como EFE3CC70-1D9F-11CF-B1F3-


02608C9E7553

Confira também
IADsComputer

Provedores de sistema ADSI

IADsClass

IADsComputerOperations

Métodos de propriedade de interface

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interface IADsDomain (iads.h)
Artigo14/03/2023

A interface IADsDomain é uma interface dupla que herda de IADs. Ele foi projetado
para representar um domínio de rede e gerenciar contas de domínio. Use essa interface
para determinar se o domínio é realmente um Grupo de Trabalho, para especificar com
que frequência um usuário deve alterar uma senha e especificar o número máximo de
logons de senha inválidos permitidos antes que um bloqueio na conta seja definido.
Para alterar uma senha, chame o método ChangePassword em um objeto ADSI que dá
suporte a controles de senha. Por exemplo, para alterar a senha de uma conta de
usuário, chame IADsUser::ChangePassword no objeto de usuário.

Herança
A interface IADsDomain herda de IDispatch e IADs. IADsDomain também tem esses
tipos de membros:

Comentários
Para o provedor WinNT fornecido pela Microsoft, essa interface é implementada no
objeto WinNTDomain .

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Iads

Métodos de propriedade IADsDomain


IADsUser::SetPassword

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos de propriedade IADsDomain
Artigo • 03/06/2023

Os métodos de interface IADsDomain leem e gravam as propriedades descritas neste


tópico. Para obter mais informações, consulte métodos de propriedade interface.

Propriedades
AutoUnlockInterval

Indica o tempo mínimo que deve ser decorrido antes que a conta seja reencável
automaticamente.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_AutoUnlockInterval(
[out] LONG* plAutoUnlockInterval
);
HRESULT put_AutoUnlockInterval(
[in] LONG lAutoUnlockInterval
);

IsWorkgroup

Essa propriedade não é mais implementada.

Tipo de acesso: Somente leitura

Tipo de dados de script: VARIANT_BOOL

syntax

// C++ method syntax


HRESULT get_IsWorkgroup(
[out] VARIANT_BOOL* retval
);

LockoutObservationInterval
Indica a janela de tempo durante a qual a contagem de senhas incorretas é monitorada
e acumulada antes de determinar se a conta precisa ser bloqueada. Por exemplo, se o
número de tentativas de senha incorretas em uma conta exceder o limite (Máximo de
Senhas Inválidas Permitidas) durante o período de tempo especificado (Intervalo de
Observação de Bloqueio) a conta será bloqueada definindo a propriedade apropriada
no conjunto de propriedades parâmetro de logon.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_LockoutObservationInterval(
[out] LONG* plLockoutObservationInterval
);
HRESULT put_LockoutObservationInterval(
[in] LONG lLockoutObservationInterval
);

MaxBadPasswordsAllowed

Indica o número máximo de logons de senha inválidos permitidos antes de um bloqueio


de conta.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_MaxBadPasswordsAllowed(
[out] LONG* plMaxBadPasswordsAllowed
);
HRESULT put_MaxBadPasswordsAllowed(
[in] LONG lMaxBadPasswordsAllowed
);

MaxPasswordAge

Indica o intervalo de tempo máximo, em segundos, após o qual a senha deve ser
alterada pelo usuário.

Tipo de acesso: leitura/gravação


Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_MaxPasswordAge(
[out] LONG* plMaxPasswordAge
);
RESULT put_MaxPasswordAge(
[in] LONG lMaxPasswordAge
);

MinPasswordAge

Indica o intervalo de tempo mínimo, em segundos, antes que a senha possa ser
alterada.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_MinPasswordAge(
[out] LONG* plMinPasswordAge
);
HRESULT put_MinPasswordAge(
[in] LONG lMinPasswordAge
);

MinPasswordLength

Indica o número mínimo de caracteres que devem ser usados para uma senha.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_MinPasswordLength(
[out] LONG* plMinPasswordLength
);
HRESULT put_MinPasswordLength(
[in] LONG lMinPasswordLength
);
PasswordAttributes

Indica restrições em senhas, conforme definido pela lista a seguir de atributos e valores.

7 Observação

Para PASSWORD_ATTR_COMPLEX, a senha deve incluir pelo menos uma marca de


pontuação ou caractere não imprimível.

PASSWORD_ATTR_NONE (0x00000000)

PASSWORD_ATTR_MIXED_CASE (0x00000001)

PASSWORD_ATTR_COMPLEX (0x00000002)

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_PasswordAttributes(
[out] LONG* plPasswordAttributes
);
HRESULT put_PasswordAttributes(
[in] LONG lPasswordAttributes
);

PasswordHistoryLength

Indica o número de senhas anteriores salvas na lista de histórico. O usuário não pode
reutilizar uma senha na lista de histórico.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_PasswordHistoryLength(
[out] LONG* plPasswordHistoryLength
);
HRESULT put_PasswordHistoryLength(
[in] LONG lPasswordHistoryLength
);
Exemplos
O exemplo de código a seguir exibe o valor da propriedade PasswordHistoryLength .

VB

Dim dom As IADsDomain


On Error Resume Next

Set dom = GetObject("WinNT://myDomain")

debug.print "PasswordHistoryLength" & dom.PasswordHistoryLength

O exemplo de código a seguir exibe o valor da propriedade PasswordHistoryLength .

C++

LPWSTR adsPath = L"WinNT://myDomain";


LONG nPasswordHistoryLength = 0;

// Bind to the domain object.


hr = ADsGetObject(adsPath,IID_IADsDomain,(void**)&pDomain);
if(FAILED(hr)) {goto Cleanup;}

hr = pDomain->get_PasswordHistoryLength(&nPasswordHistoryLength);
if(FAILED(hr)) {goto Cleanup;}
printf("Password history length: %d",nPasswordHistoryLength);

Cleanup:
if(pDomain) pDomain->Release();

Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsDomain é definido como 00E4C220-FD16-11CE-ABC4-


02608C9E7553
Confira também
IADsDomain

Métodos de propriedade interface

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interface IADsFileService (iads.h)
Artigo24/08/2023

A interface IADsFileService é uma interface dupla que herda de IADsService. Ele foi
projetado para representar serviços de arquivo com suporte no serviço de diretório. Por
meio dessa interface, você pode descobrir e modificar o número máximo de usuários
que executam simultaneamente um serviço de arquivo.

Para acessar sessões ativas ou abrir recursos usados pelo serviço de arquivo, você deve
passar pela interface IADsFileServiceOperations para recuperar sessões ou recursos.

Para examinar a status do serviço de arquivo ou executar operações de gerenciamento


de serviço, use a interface IADsServiceOperations, que é herdada por
IADsFileServiceOperations.

Herança
A interface IADsFileService herda de IDispatch, IADs e IADsService. IADsFileService
também tem estes tipos de membros:

Comentários
No provedor WinNT, essa interface é implementada no objeto WinNTService .

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Iads

Métodos da propriedade IADsFileService


IADsFileServiceOperations

IADsService

IADsServiceOperations

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos da propriedade
IADsFileService
Artigo • 12/06/2023

Os métodos de propriedade da interface IADsFileService obtêm ou definem as


propriedades descritas na tabela a seguir. Para obter mais informações, consulte
Métodos de propriedade de interface.

Propriedades
Descrição

A descrição do serviço de arquivo.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Description(
[out] BSTR* pbstrDescription
);
HRESULT put_Description(
[in] BSTR bstrDescription
);

MaxUserCount

O número máximo de usuários permitidos no serviço a qualquer momento.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_MaxUserCount(
[out] LONG* plMaxUserCount
);
HRESULT put_MaxUserCount(
[in] LONG lMaxUserCount
);
Comentários
Você deve passar pelo serviço de arquivo para acessar compartilhamentos de arquivos,
sessões e recursos em um computador.

Exemplos
O exemplo de código a seguir grava uma descrição para e marcar o limite de usuário do
serviço de arquivo.

VB

Dim fs As IADsFileService
On Error GoTo Cleanup

' Bind to a file service object on "myComputer" in the local domain.


Set fs = GetObject("WinNT://myComputer/LanmanServer")

fs.Description = "WinNT file service."


n = fs.MaxUserCount
If n = -1 Then
MsgBox "No limit has been imposed on number of users allowed."
Else
MsgBox n & " users are allowed."
End If

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set fs = Nothing

O exemplo de código a seguir grava uma descrição para e marcar o limite de usuário
em um objeto de serviço de arquivo.

C++

HRESULT CheckFileService()
{
IADsFileService *pFs = NULL;
LPWSTR adsPath = L"WinNT://myComputer/LanmanServer";
HRESULT hr = S_OK;
long count = 0;

hr = ADsGetObject(adsPath, IID_IADsFileService, (void**)&pFs)


if(FAILED(hr)) {goto Cleanup;}
hr = pFs->put_Description(CComBSTR("WinNT File Service"));
if(FAILED(hr)) {goto Cleanup;}

hr = pFs->SetInfo();
if(FAILED(hr)) {goto Cleanup;}

hr = pFs->get_MaxUserCount(&count);
if(FAILED(hr)) {goto Cleanup;}

if(count == -1) {
printf("No limit has been imposed on the number of users.\n");
}
else {
printf("Number of allowed users are %d\n",count);
}

Cleanup:
if(pFs) pFs->Release();
return S_OK;
}

Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsFileService é definido como A89D1900-31CA-11CF-A98A-


00AA006BC149

Confira também
IADsService

IADsFileService

IADsFileServiceOperations

IADsServiceOperations
Métodos de propriedade interface

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interface IADsFileShare (iads.h)
Artigo24/08/2023

A interface IADsFileShare é uma interface dupla que herda de IADs. Ele foi projetado
para representar um compartilhamento de arquivos publicado em toda a rede. Chame
os métodos em IADsFileShare para acessar ou publicar dados sobre um ponto de
compartilhamento de arquivos.

Herança
A interface IADsFileShare herda de IDispatch e IADs. IADsFileShare também tem estes
tipos de membros:

Comentários
O IADsFileShare tem suporte apenas pelo provedor do sistema WinNT. Usando o
provedor WinNT, você também pode associar a um compartilhamento FPNW
substituindo "FPNW" por "LanmanServer" nos exemplos de código abaixo.

Para associar a um compartilhamento de arquivos, usando o provedor do sistema


WinNT, você pode associar explicitamente ao serviço de arquivo "LanmanServer" no
computador host e, em seguida, enumerar o contêiner para alcançar o
compartilhamento de arquivos de interesse ou associar diretamente ao
compartilhamento de arquivos.

Exemplos

O exemplo de código a seguir demonstra como associar ao serviço de arquivo e


enumerar o contêiner para exibir os nomes dos compartilhamentos nesse contêiner.

VB

Dim fs as IADsFileService
Dim share As IADsFileShare
On Error GoTo Cleanup

Set fs = GetObject("WinNT://aComputer/LanmanServer")

For Each share In fs


MsgBox("Share: " & share.name)
Next share
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set fs = Nothing
Set share = Nothing

O exemplo de código a seguir demonstra como associar diretamente a um


compartilhamento de arquivos.

VB

Dim fs as IADsFileShare
On Error Resume Next
Set fs = GetObject("WinNT://aComputer/LanmanServer/_file_share_name_")

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Iads

Métodos de propriedade IADsFileShare

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos da propriedade IADsFileShare
Artigo • 12/06/2023

Os métodos de propriedade da interface IADsFileshare obtêm ou definem as


propriedades descritas na tabela a seguir. Para obter mais informações, consulte
Métodos de propriedade de interface.

Propriedades
CurrentUserCount

O número de usuários conectados ao compartilhamento.

Tipo de acesso: Somente leitura

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_CurrentUserCount(
[out] LONG* plCurrentUserCount
);

Descrição

A descrição do compartilhamento de arquivos.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Description(
[out] BSTR* pbstrDescription
);
HRESULT put_Description(
[in] BSTR bstrDescription
);

HostComputer

Uma referência do ADsPath ao computador host.


Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_HostComputer(
[out] BSTR* pbstrHostComputer
);
HRESULT put_HostComputer(
[in] BSTR bstrHostComputer
);

MaxUserCount

O número máximo de usuários com permissão para acessar o compartilhamento ao


mesmo tempo.

Tipo de acesso: Somente leitura

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_MaxUserCount(
[out] LONG* plMaxUserCount
);

Caminho

O caminho do sistema de arquivos para o diretório compartilhado.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Path(
[out] BSTR* pbstrPath
);
HRESULT put_Path(
[in] BSTR bstrPath
);
Exemplos
Para acessar as propriedades dos compartilhamentos de arquivos em um computador,
primeiro você deve associar ao "LanmanServer" no computador. O exemplo de código a
seguir mostra como configurar a descrição e o número máximo de usuários permitidos
para todos os compartilhamentos de arquivos públicos no computador, chamados de
"myMachine", no domínio padrão.

VB

Dim fs As IADsFileService
Dim share As IADsFileShare
On Error GoTo Cleanup

Set fs = GetObject("WinNT://myMachine/LanmanServer")
If (fs.class = "FileService") Then
For Each share In fs
share.description = share.name & " is my working folder."
share.MaxUserCount = 10
share.SetInfo
Next share
End if

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set fs = Nothing
Set share = Nothing

O exemplo de código a seguir mostra como tornar o diretório C:\MyFolder existente um


compartilhamento de arquivos público.

VB

Dim fs As IADsFileShare
Dim cont As IADsContainer
On Error GoTo Cleanup

Set cont = GetObject("WinNT://yourDomain/yourMachineName/LanmanServer")

Set fs = cont.Create("FileShare", "Public")


Debug.Print fs.Class
fs.Path = "C:\MyFolder"
fs.SetInfo

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set cont = Nothing
Set fs = Nothing

O exemplo de código a seguir torna o diretório C:\MyFolder existente um


compartilhamento de arquivos público.

C++

IADsFileShare *pShare = NULL;


IADsContainer *pCont = NULL;
LPWSTR adsPath = L"WinNT://yourMachineName/LanmanServer";
HRESULT hr = S_OK;

hr = ADsGetObject(adsPath, IID_IADsContainer,(void**)&pCont);
if(FAILED(hr)) {goto Cleanup;}

hr = pCont->Create(CComBSTR("FileShare"), CComBSTR("Public"),
(IDispatch**)&pShare);

if(FAILED(hr)) {goto Cleanup;}

hr = pShare->put_Path(CComBSTR("c:\\public"));

if(FAILED(hr)) {goto Cleanup;}

hr = pShare->SetInfo();

Cleanup:
if(pCont) pCont->Release();
if(pShare) pShare->Release();

Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsFileShare é definido como EB6DCAF0-4B83-11CF-A995-


00AA006BC149
Confira também
IADsService

IADsFileShare

Métodos de propriedade interface

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interface IADsGroup (iads.h)
Artigo24/08/2023

A interface IADsGroup é uma interface dupla que herda de IADs. Ele gerencia dados de
associação de grupo em um serviço de diretório. Ele permite que você obtenha objetos
membro, teste se um determinado objeto pertence ao grupo e adicione, ou remova, um
objeto de ou para o grupo.

Herança
A interface IADsGroup herda de IDispatch e IADs. IADsGroup também tem estes tipos
de membros:

Métodos
A interface IADsGroup tem esses métodos.

IADsGroup::Add

Adiciona um objeto ADSI a um grupo existente.

IADsGroup::IsMember

Determina se um objeto de serviço de diretório é um membro imediato do grupo.

IADsGroup::Members

Recupera uma coleção dos membros imediatos do grupo.

IADsGroup::Remove

O método IADsGroup::Remove remove o objeto de usuário especificado desse grupo. A operação


não remove o próprio objeto de grupo mesmo quando não há nenhum membro restante no
grupo.

Requisitos

Cliente mínimo com suporte Windows Vista


Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Iads

Métodos de propriedade IADsGroup

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos de propriedade IADsGroup
Artigo • 12/06/2023

Os métodos de propriedade da interface IADsGroup leem e gravam as propriedades a


seguir. Para obter mais informações, consulte Métodos de propriedade de interface.

Propriedades
Descrição

Indica a descrição textual da associação de grupo.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Description(
[out] BSTR* pbstrDescription
);
HRESULT put_Description(
[in] BSTR bstrDescription
);

Comentários

Usando IADsGroup para recuperar descrições de grupos


internos
Os exemplos a seguir mostram como recuperar informações sobre objetos de grupo do
Windows por nome. Em um ambiente multilíngue, grupos internos às vezes são
conhecidos por nomes localizados diferentes, o que significa que eles não podem ser
recuperados diretamente usando identificadores de cadeia de caracteres, como
"WinNT://Microsoft/Administrators". Nesse caso, o usuário pode associar ao objeto SID
conhecido do grupo, recuperar o nome do grupo localizado e fornecê-lo ao método
GetObject. Para obter mais informações, consulte SIDs conhecidos.

Exemplos
O exemplo do Visual Basic a seguir mostra como associar a um objeto de grupo e exibir
a descrição do grupo.

VB

Dim grp As IADsGroup


On Error GoTo Cleanup

Set grp = GetObject("WinNT://Microsoft/Administrators")


Debug.Print grp.Description

Cleanup
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set grp = Nothing

O exemplo C++ a seguir mostra como associar a um objeto de grupo e exibir a


descrição do grupo.

C++

IADsGroup *pGroup = NULL;


HRESULT hr = S_OK;
LPWSTR adsPath = L"WinNT://localHost/Administrators";
BSTR bstr;

hr = ADsGetObject(adsPath,IID_IADsGroup,(void**)&pGroup);

if(FAILED(hr)) {goto Cleanup;}

hr = pGroup->get_Description(&bstr);
if(FAILED(hr)) {goto Cleanup;}

printf("Description: %S\n",bstr);

Cleanup:
SysFreeString(bstr);
if(pGroup)
pGroup->Release();

return hr;

Requisitos
Requisito Valor
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsGroup é definido como 27636B00-410F-11CF-B1FF-


02608C9E7553

Confira também
Iads

IADsGroup

Métodos de propriedade interface

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Método IADsGroup::Add (iads.h)
Artigo24/08/2023

O método IADsGroup::Add adiciona um objeto ADSI a um grupo existente.

Sintaxe
C++

HRESULT Add(
[in] BSTR bstrNewItem
);

Parâmetros
[in] bstrNewItem

Contém um BSTR que especifica o ADsPath do objeto a ser adicionado ao grupo. Para
obter mais informações, consulte Comentários.

Valor retornado
Veja a seguir os valores retornados mais comuns. Para obter mais informações sobre
valores retornados, consulte Códigos de erro ADSI.

Comentários
Se o provedor LDAP for usado para associar ao objeto IADsGroup , a mesma forma de
ADsPath deverá ser especificada no parâmetro bstrNewItem . Por exemplo, se o ADsPath
usado para associar ao objeto IADsGroup incluir um servidor, o ADsPath no parâmetro
bstrNewItem deverá conter o mesmo prefixo de servidor. Da mesma forma, se um
caminho sem servidor for usado para associar ao objeto IADsGroup , o parâmetro
bstrNewItem também deverá conter um caminho sem servidor. Ao usar o prefixo do
servidor, os atrasos poderão ocorrer se o grupo e o novo membro forem de domínios
diferentes, pois as solicitações podem ser enviadas para o controlador de domínio
errado e encaminhadas para um controlador de domínio do domínio correto e
repetidas lá. Ocorre uma exceção ao adicionar ou remover um membro usando um
ADsPath do GUID ou do SID (identificador de segurança). Nesse caso, um caminho sem
servidor sempre deve ser usado em bstrNewItem.
O provedor LDAP para Active Directory permite que um membro seja adicionado a um
grupo usando a forma de cadeia de caracteres do SID membro. O parâmetro
bstrNewItem pode conter uma cadeia de caracteres SID no formulário a seguir.

C++

LDAP://SID=<010500000000000515000000c6bb507afbda8b7f43170a325b040000>

Para obter mais informações sobre cadeias de caracteres SID no Active Directory,
consulte Associação a um objeto usando um SID.

O provedor WinNT para Active Directory também permite que um membro seja
adicionado a um grupo usando a forma de cadeia de caracteres do SID do membro. O
parâmetro bstrNewItem pode conter uma cadeia de caracteres SID no formulário a
seguir.

C++

WinNT://S-1-5-21-35135249072896"

Exemplos

O exemplo de código a seguir mostra como adicionar um objeto de usuário ("jeff") ao


grupo ("Administradores") no domínio "Fabrikam", usando o provedor WinNT.

VB

Dim grp As IADsGroup


Set grp = GetObject("WinNT://Fabrikam/Administrators")
grp.Add ("WinNT://Fabrikam/jeff")

O exemplo de código a seguir mostra como adicionar um objeto de usuário a um grupo


usando o provedor LDAP.

VB

Dim grp As IADsGroup


On Error GoTo Cleanup

Set grp = GetObject("LDAP://CN=Administrators, CN=Users, DC=Fabrikam,


DC=com")
grp.Add("LDAP://CN=Jeff Smith, OU=Sales,DC=Fabrikam,DC=com")

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set grp = Nothing

O exemplo de código a seguir adiciona uma conta de usuário existente ao grupo


Administradores.

C++

IADsGroup *pGroup = NULL;


HRESULT hr = S_OK;
LPWSTR adsPath = L"WinNT://Fabrikam/Administrators";
hr = ADsGetObject(adsPath,IID_IADsGroup,(void**)&pGroup);
if(FAILED(hr)) {goto Cleanup;}

// This assumes that the "WinNT://Fabrikam/jeff" user account exists


// and does not already belong to the Administrators group.

hr = pGroup->Add(_bstr_t("WinNT://Fabrikam/jeff"));
if(FAILED(hr)){goto Cleanup;}

Cleanup:
if(pGroup)
pGroup->Release();

return hr;

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

Associação a um objeto usando um SID


IADsGroup

Métodos de propriedade IADsGroup

IADsMembers

Comentários
Esta página foi útil?  Yes  No
Método IADsGroup::IsMember (iads.h)
Artigo24/08/2023

O método IADsGroup::IsMember determina se um objeto de serviço de diretório é um


membro imediato do grupo. Esse método não verifica a associação em nenhum grupo
aninhado.

Sintaxe
C++

HRESULT IsMember(
BSTR bstrMember,
[out] VARIANT_BOOL *bMember
);

Parâmetros
bstrMember

Contém o ADsPath do objeto de serviço de diretório para verificar a associação. Esse


ADsPath deve usar o mesmo provedor ADSI usado para associar ao grupo. Por exemplo,
se o grupo foi associado ao uso do provedor LDAP, esse ADsPath também deve usar o
provedor LDAP.

[out] bMember

Ponteiro para um valor VARIANT_BOOL que recebe VARIANT_TRUE se o objeto for um


membro imediato do grupo ou VARIANT_FALSE caso contrário.

Valor retornado
Esse método dá suporte aos valores retornados padrão, incluindo S_OK. Para obter mais
informações, consulte Códigos de erro ADSI.

Comentários
Embora você possa adicionar ou remover uma entidade de segurança de ou para um
grupo usando o SID membro por meio do provedor WinNT, o método
IADsGroup.IsMember não dá suporte ao uso de um SID ADsPath para verificação se um
membro pertence a um grupo por meio do provedor WinNT.

O método IADsGroup::IsMember só funcionará corretamente se o grupo e o objeto


estiverem no mesmo domínio. Se o objeto estiver em um domínio diferente do grupo,
IADsGroup::IsMember sempre retornará VARIANT_FALSE.

Exemplos
O exemplo de código a seguir adiciona o usuário "jeffsmith" ao grupo
"Administradores" no domínio "Fabrikam" e relata que o usuário agora é membro do
grupo.

VB

Dim grp As IADsGroup


On Error GoTo Cleanup

Set grp = GetObject("WinNT://Microsoft/Administrators")


grp.Add ("WinNT://Fabrikam/jeffsmith")
Debug.Print grp.IsMember("WinNT://Fabrikam/jeffsmith ") ' Should be TRUE.

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set grp = Nothing

O exemplo de código a seguir verifica se um usuário pertence a um grupo antes de


adicioná-lo ao grupo.

C++

IADsGroup *pGroup = NULL;


HRESULT hr = S_OK;
LPWSTR adsPath = L"WinNT://Fabrikam/Administrators";
BSTR bstr = NULL;

hr = ADsGetObject(adsPath, IID_IADsGroup, (void**)&pGroup);

if(FAILED(hr))
{
goto Cleanup;
}

hr = pGroup->get_Description(&bstr);
if(FAILED(hr))
{
goto Cleanup;
}

printf("Description: %S\n",bstr);
SysFreeString(bstr);

VARIANT_BOOL inG=false;
hr = pGroup->IsMember(CComBSTR("WinNT://Microsoft/SecUser"), &inG);

if (inG )
{
printf("already in the group.\n");
}
else
{
hr = pGroup->Add(CComBSTR("WinNT://Microsoft/SecUser"));
if(FAILED(hr))
{
goto Cleanup;
}

printf("user added.\n");
}

Cleanup:
if(pGroup)
{
pGroup->Release();
}
if(bstr)
{
SysFreeString(bstr);
}

return hr;

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

IADsGroup

Métodos de propriedade IADsGroup

IADsMembers

Comentários
Esta página foi útil?  Yes  No
Método IADsGroup::Members (iads.h)
Artigo24/08/2023

O método IADsGroup::Members recupera uma coleção dos membros imediatos do


grupo. A coleção não inclui os membros de outros grupos aninhados dentro do grupo.

A implementação padrão desse método usa LsaLookupSids para consultar informações


de nome para os membros do grupo. LsaLookupSids tem uma limitação máxima de
20480 SIDs que pode converter, portanto, essa limitação também se aplica a esse
método.

Sintaxe
C++

HRESULT Members(
[out] IADsMembers **ppMembers
);

Parâmetros
[out] ppMembers

Ponteiro para um ponteiro de interface IADsMembers que recebe a coleção de


membros do grupo. O chamador deve liberar essa interface quando ela não for mais
necessária.

Valor retornado
Esse método dá suporte aos valores retornados padrão, incluindo S_OK. Para obter mais
informações e outros valores retornados, consulte Códigos de erro ADSI.

Comentários
O método Membros IADsMembers usará o mesmo provedor.

Exemplos

O exemplo de código a seguir enumera todos os membros de um grupo.


VB

Dim grp As IADsGroup


Dim memberList As IADsMembers
Dim member As IADs

On Error GoTo Cleanup

Set grp = GetObject("WinNT://Microsoft/Administrators")


Set memberList = grp.Members
For Each m In memberList
Set member = m
Debug.Print member.Name & "(" & member.Class & ")"
Next

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set grp = Nothing
Set member = Nothing
Set memberList = Nothing

O exemplo de código a seguir enumera todos os membros de um grupo.

C++

HRESULT EnumerateGroupMembers(IADsGroup *pGroup)


{
IADsMembers *pMembers;
HRESULT hr = S_OK;
hr = pGroup->Members(&pMembers);
if(FAILED(hr)){goto Cleanup;}

hr = EnumMembers(pMembers); // For more information and a code


example, see IADsMembers::get__NewEnum.
if(FAILED(hr)){goto Cleanup;}

Cleanup:
if(pMembers)
pMembers->Release();

return hr;
}

Requisitos

Cliente mínimo com suporte Windows Vista


Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

IADsGroup

Métodos de propriedade IADsGroup

IADsMembers

Comentários
Esta página foi útil?  Yes  No
Método IADsGroup::Remove (iads.h)
Artigo24/08/2023

O método IADsGroup::Remove remove o objeto de usuário especificado desse grupo. A


operação não remove o objeto de grupo em si mesmo quando não há nenhum
membro restante no grupo.

Sintaxe
C++

HRESULT Remove(
[in] BSTR bstrItemToBeRemoved
);

Parâmetros
[in] bstrItemToBeRemoved

Contém um BSTR que especifica o ADsPath do objeto a ser removido do grupo. Para
obter mais informações sobre esse parâmetro, consulte a seção Comentários.

Valor retornado
Veja a seguir os valores retornados mais comuns. Para obter mais informações sobre
valores retornados, consulte Códigos de erro ADSI.

Comentários
Se o provedor LDAP for usado para associar ao objeto IADsGroup , a mesma forma de
ADsPath deverá ser especificada no parâmetro bstrItemToBeRemoved . Por exemplo, se o
ADsPath usado para associar ao objeto IADsGroup incluir um servidor, o ADsPath no
parâmetro bstrItemToBeRemoved deverá conter o mesmo prefixo de servidor. Da mesma
forma, se um caminho sem servidor for usado para associar ao objeto IADsGroup , o
parâmetro bstrItemToBeRemoved também deverá conter um caminho sem servidor. A
exceção é ao adicionar ou remover um membro usando um GUID ou SID ADsPath.
Nesse caso, um caminho sem servidor sempre deve ser usado em bstrItemToBeRemoved.
Você pode usar um SID no ADsPath para remover uma entidade de segurança do grupo
por meio do provedor WinNT. Por exemplo, suponha que o SID de um usuário,
"Fabrikam\jeffsmith", seja S-1-5-21-35135249072896, a seguinte instrução:

VB

Dim group As IADsGroup


group.Remove("WinNT://S-1-5-21-35135249072896")

é equivalente a

VB

Dim group As IADsGroup


group.Remove("WinNT://Fabrikam/jeffsmith")

Remover um membro usando seu SID por meio do provedor WinNT é um novo recurso
no Windows 2000 e no pacote DSCLIENT.

Exemplos
O exemplo de código a seguir remove uma conta de usuário de um grupo.

VB

Dim grp As IADsGroup


On Error GoTo Cleanup

Set grp = GetObject("WinNT://Fabrikam/Administrators")


grp.Remove ("WinNT://Fabrikam/jeffsmith")

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set grp = Nothing

O exemplo de código a seguir remove um usuário de um grupo.

C++

IADsGroup *pGroup = NULL;


HRESULT hr = S_OK;
LPWSTR usrPath = L"WinNT://Fabrikam/jeffsmith";
LPWSTR grpPath = L"WinNT://Fabrikam/Administrators";

hr = ADsGetObject(grpPath, IID_IADsGroup, (void**)&pGroup);


if(FAILED(hr)){goto Cleanup;}

hr = pGroup->Remove(CComBSTR(usrPath));
if(FAILED(hr)){goto Cleanup;}

Cleanup:
if(pGroup)
pGroup->Release();

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

IADsGroup

Métodos de propriedade IADsGroup

IADsMembers

Comentários
Esta página foi útil?  Yes  No
Interface IADsLocality (iads.h)
Artigo24/08/2023

A interface IADsLocality é uma interface dupla que herda de IADs. Ele foi projetado para
representar a localização geográfica ou a região de uma entidade de diretório. Essa
interface é uma das várias que dão suporte a serviços de diretório para organizar contas
por país/região, localidade (estado/cidade/região), organização (empresa) ou unidade
organizacional (departamento). Essa interface gerencia a localidade, a interface IADsO
gerencia a organização e a interface IADsOU gerencia a unidade da organização.

Quando um serviço de diretório fornece agrupamentos hierárquicos de entradas de


diretório por país/região, localidade, organização ou unidade organizacional, você pode
usar essa e as interfaces relacionadas para expandir a árvore de diretório
adequadamente. Nesse caso, a interface IADsLocality é implementada por um objeto de
localidade que implementa a interface IADsContainer .

Herança
A interface IADsLocality herda de IDispatch e IADs. IADsLocality também tem estes
tipos de membros:

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Iads

Métodos da propriedade IADsLocality

IADsO

IADSOU
IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos de propriedade IADsLocality
Artigo • 13/06/2023

Os métodos da interface IADsLocality leem e gravam as propriedades descritas neste


tópico. Para obter mais informações, consulte Métodos de propriedade de interface.

Propriedades
Descrição

Indica o texto que descreve a localidade.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Description(
[out] BSTR* pbstrDescription
);
HRESULT put_Description(
[in] BSTR bstrDescription
);

LocalityName

Indica o nome da região geográfica, conforme representado por esse objeto de


localidade.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_LocalityName(
[out] BSTR* pbstrLocalityName
);
HRESULT put_LocalityName(
[in] BSTR bstrLocalityName
);
PostalAddress

Indica o main endereço postal da localidade.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_PostalAddress(
[out] BSTR* pbstrPostalAddress
);
HRESULT put_PostalAddress(
[in] BSTR bstrPostalAddress
);

SeeAlso

Indica uma matriz de nomes ADsPath de objetos de diretório relevantes para esse
objeto.

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT

syntax

// C++ method syntax


HRESULT get_SeeAlso(
[out] VARIANT* pvSeeAlso
);
HRESULT put_SeeAlso(
[in] VARIANT vSeeAlso
);

Exemplos
O exemplo de código a seguir exibe os dados de localidade de um objeto de contêiner.
Ele pressupõe que um objeto de localidade, chamado "myLocality", foi criado para o
objeto contêiner e as propriedades foram definidas.

VB

Dim dom As IADsContainer


Dim loc As IADsLocality
On Error GoTo Cleanup

Set dom = getObject("LDAP://adsrv1/dc=Fabrikam, dc=Com")


Set loc = dom.GetObject("locality","L=myLocality")
Debug.Print loc.Name
Debug.Print loc.LocalityName
Debug.Print loc.Description
Debug.Print loc.PostalAddress
Debug.Print loc.SeeAlso

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set dom = Nothing
Set loc = Nothing

Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsLocality é definido como A05E03A2-EFFE-11CF-8ABC-


00C04FD8D503

Confira também
Iads

IADsLocality

Métodos de propriedade de interface

Comentários
Esta página foi útil? ツ Yes ト No
Obter ajuda no Microsoft Q&A
Interface IADsMembers (iads.h)
Artigo24/08/2023

A interface IADsMembers é uma interface dupla. Ele foi projetado para gerenciar uma
lista de referências de objeto ADSI. Ele é implementado para dar suporte à associação
de grupo para contas individuais. Ele pode ser usado para gerenciar uma coleção de
objetos ADSI pertencentes a um grupo. Para acessar a coleção de membros do grupo,
use o método de propriedade IADsGroup::get_Members implementado pelo objeto de
grupo ADSI.

A interface IADsMembers serve a uma finalidade ligeiramente diferente das interfaces


IADsCollection e IADsContainer , que também funciona com um conjunto de dados ou
objetos. IADsCollection gerencia conjuntos de elementos de dados arbitrários que não
são referências de objeto, enquanto IADsContainer gerencia objetos que fazem parte
da estrutura da árvore de diretório ou da topologia de rede.

Herança
A interface IADsMembers herda da interface IDispatch . IADsMembers também tem
estes tipos de membros:

Métodos
A interface IADsMembers tem esses métodos.

IADsMembers::get__NewEnum

O método IADsMembers::get__NewEnum obtém um objeto enumerador dependente que


implementa IEnumVARIANT para este objeto de coleção ADSI. Lembre-se de que há dois
caracteres de sublinhado no nome da função (get__NewEnum).

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008


Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
IADsCollection

IADsContainer

IADsGroup::get_Members

Métodos de propriedade IADsMembers

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos de propriedade IADsMembers
Artigo • 12/06/2023

Os métodos da interface IADsMembers leem e gravam as propriedades descritas neste


tópico. Para obter mais informações, consulte Métodos de propriedade de interface.

Propriedades
Count

Indica o número de itens no contêiner. Se o filtro estiver definido, a contagem retornará


apenas o número de itens que se ajustam à descrição do filtro.

Tipo de acesso: Somente leitura

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_Count(
[out] LONG* plCountr
);

Filter

Indica o filtro. A sintaxe das entradas na matriz de filtro é a mesma que o Filtro usado na
interface IADsContainer .

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT

syntax

// C++ method syntax


HRESULT get_Filter(
[out] VARIANT* pvFilter
);
HRESULT put_Filter(
[in] VARIANT vFilter
);
Comentários
Os provedores de sistema ADSI não dão suporte ao método de propriedade
IADsMembers::get_Count .

Exemplos
O exemplo de código a seguir mostra como usar os métodos de propriedade dessa
interface.

VB

Dim grp As IADsGroup


On Error GoTo Cleanup

Set grp = GetObject("WinNT://myComputer/someGroup")


grp.members.filter = Array("user")
For Each usr In grp.Members
MsgBox usr.Name & "," & usr.Class & "," & usr.AdsPath
Next

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set grp = Nothing

O exemplo de código a seguir usa o método IADsMembers::p ut_Filter para se preparar


para uma enumeração da coleção de membros de um grupo.

C++

IADsGroup *pGroup;
HRESULT hr = S_OK;

LPWSTR grpPath = L"WinNT://myComputer/someGroup";


hr = ADsGetObject(grpPath,IID_IADsGroup,(void**)&pGroup);
if(FAILED(hr)){goto Cleanup;}

IADsMembers *pMembers;
hr = pGroup->Members(&pMembers);
if(FAILED(hr)){goto Cleanup;}

hr = pGroup->Release();

SAFEARRAY *sa = CreateSafeArray(L"user");


hr = pMembers->put_Filter(sa);
if(FAILED(hr)){goto Cleanup;}
hr = EnumMembers(pMembers); // For more information, and a
// code example, see
// IADsMembers::get__NewEnum.
if(FAILED(hr)){goto Cleanup;}

Cleanup:
if(pGroup) pGroup->Release();
if(pMembers) pMembers->Release();
return hr;

Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsMembers é definido como 451A0030-72EC-11CF-B03B-


00AA006E0975

Confira também
IADsContainer

IADsMembers::get__NewEnum

IADsMembers

Métodos de propriedade interface

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Método IADsMembers::get__NewEnum
(iads.h)
Artigo24/08/2023

O método IADsMembers::get__NewEnum obtém um objeto enumerador dependente


que implementa IEnumVARIANT para este objeto de coleção ADSI. Lembre-se de que há
dois caracteres de sublinhado no nome da função (get__NewEnum).

Sintaxe
C++

HRESULT get__NewEnum(
[out] IUnknown **ppEnumerator
);

Parâmetros
[out] ppEnumerator

Ponteiro para um ponteiro para a interface IUnknown no objeto enumerador dessa


coleção.

Valor retornado
Esse método dá suporte aos valores retornados padrão, incluindo S_OK. Para obter mais
informações sobre outros valores retornados, consulte Códigos de erro ADSI.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h
DLL Activeds.dll

Confira também
Códigos de erro ADSI

IADsMembers

Métodos de propriedade IADsMembers

IEnumVARIANT

IUnknown

Comentários
Esta página foi útil?  Yes  No
Interface IADsO (iads.h)
Artigo24/08/2023

A interface IADsO é uma interface dupla que herda de IADs. Ele foi projetado para
representar e gerenciar a organização à qual pertence uma conta. Essa interface é uma
das várias que dão suporte a serviços de diretório para organizar contas por país/região,
localidade (estado/cidade/região), organização (empresa) e unidade organizacional
(departamento). A organização é gerenciada por essa interface, localidade pela interface
IADsLocality e pela unidade da organização por IADsOU.

Quando um serviço de diretório fornece agrupamentos hierárquicos de entradas de


diretório por país/região, localidade, organização e unidade organizacional, você pode
usar isso e as interfaces relacionadas para expandir a árvore de diretório
adequadamente. Nesse caso, a interface IADsO também é implementada por um objeto
da organização que implementa a interface IADsContainer .

Herança
A interface IADsO herda de IDispatch e IADs. A IADsO também tem esses tipos de
membros:

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Iads

IADsContainer

IADsLocality

Métodos de propriedade IADsO


IADsOU

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos de propriedade IADsO
Artigo • 03/06/2023

Os métodos de propriedade da interface IADsO obtêm ou definem as propriedades


descritas na tabela a seguir. Para obter mais informações, consulte Métodos de
Propriedade de Interface.

Propriedades
Descrição

A descrição da organização.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Description(
[out] BSTR* pbstrDescription
);
HRESULT put_Description(
[in] BSTR bstrDescription
);

FaxNumber

O número fac-símile (fax) da organização.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_FaxNumber(
[out] BSTR* pbstrFaxNumber
);
HRESULT put_FaxNumber(
[in] BSTR bstrFaxNumber
);
LocalityName

O nome do local em que a organização está localizada.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_LocalityName(
[out] BSTR* pbstrLocalityName
);
HRESULT put_LocalityName(
[in] BSTR bstrLocalityName
);

PostalAddress

O endereço postal da organização.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_PostalAddress(
[out] BSTR* pbstrPostalAddress
);
HRESULT put_PostalAddress(
[in] BSTR bstrPostalAddress
);

SeeAlso

Uma matriz de nomes do ADsPath de outros objetos ADSI que podem ser relevantes
para esse objeto.

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT

syntax

// C++ method syntax


HRESULT get_SeeAlso(
[out] VARIANT* pvSeeAlso
);
HRESULT put_SeeAlso(
[in] VARIANT vSeeAlso
);

Telephonenumber

O número de telefone da organização.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_TelephoneNumber(
[out] BSTR* pbstrTelephoneNumber
);
HRESULT put_TelephoneNumber(
[in] BSTR bstrTelephoneNumber
);

Exemplos
O exemplo de código a seguir exibe a descrição de uma determinada organização. Ele
pressupõe que o serviço de diretório subjacente dê suporte ao agrupamento de objetos
de diretório por organização.

VB

Dim dom As IADsContainer


Dim dso As IADsOpenDSObject
Dim szUsername As String
Dim szPassword As String
On Error GoTo Cleanup

' Insert code to securely retrieve the user name and password

Set dso = GetObject("LDAP:")


Set dom = dso.OpenDSObject("LDAP://adsrv1/dc=Fabrikam, dc=Com", _
szUsername, szPassword,1)
dom.Filter = Array("organization")
For Each o In dom
MsgBox "Fax number of " & o.Name & " : " & o.Description
Next

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If

Set dom = Nothing


Set dso = Nothing

Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsO é definido como A1CD2DC6-EFFE-11CF-8ABC-


00C04FD8D503

Confira também
IADsO

Métodos de propriedade de interface

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interface IADsOU (iads.h)
Artigo14/03/2023

A interface IADsOU é uma interface dupla usada para gerenciar objetos


organizationalUnit . Todos os objetos organizationalUnit que implementam essa
interface também implementam a interface IADsContainer .

Herança
A interface IADsOU herda da interface IADs.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Iads

IADsContainer

IADsLocality

IADsO

Métodos de propriedade IADsOU

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos de propriedade IADSOU
Artigo • 13/06/2023

Os métodos de propriedade da interface IADsOU obtêm ou definem as propriedades


listadas na tabela a seguir. Para obter mais informações, consulte Métodos de
propriedade de interface.

Propriedades
BusinessCategory

Uma cadeia de caracteres que contém a função comercial geral ou as funções


executadas pela unidade organizacional, por exemplo, "Contabilidade".

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_BusinessCategory(
[out] BSTR* pbstrBusinessCategory
);
HRESULT put_BusinessCategory(
[in] BSTR bstrBusinessCategory
);

Descrição

Uma cadeia de caracteres que contém uma descrição textual da unidade organizacional.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Description(
[out] BSTR* pbstrDescription
);
HRESULT put_Description(
[in] BSTR bstrDescription
);
FaxNumber

Uma cadeia de caracteres que contém o número fac-símile da unidade organizacional.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_FaxNumber(
[out] BSTR* pbstrFaxNumber
);
HRESULT put_FaxNumber(
[in] BSTR bstrFaxNumber
);

LocalityName

Uma cadeia de caracteres que contém o nome da região geográfica da unidade


organizacional.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_LocalityName(
[out] BSTR* pbstrLocalityName
);
HRESULT put_LocalityName(
[in] BSTR bstrLocalityName
);

PostalAddress

Uma cadeia de caracteres que contém o endereço postal da unidade organizacional.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_PostalAddress(
[out] BSTR* pbstrPostalAddress
);
HRESULT put_PostalAddress(
[in] BSTR bstrPostalAddress
);

SeeAlso

Uma matriz de cadeias de caracteres que contém os nomes diferenciados de outros


objetos de diretório que podem ser relevantes para esse objeto.

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT

syntax

// C++ method syntax


HRESULT get_SeeAlso(
[out] VARIANT* pvSeeAlso
);
HRESULT put_SeeAlso(
[in] VARIANT vSeeAlso
);

TelephoneNumber

Uma cadeia de caracteres que contém o número de telefone da unidade organizacional.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_TelephoneNumber(
[out] BSTR* pbstrTelephoneNumber
);
HRESULT put_TelephoneNumber(
[in] BSTR bstrTelephoneNumber
);

Exemplos
O exemplo de código a seguir exibe a BusinessCategory e a Descrição de todas as
unidades da organização em um contêiner. Ele pressupõe que o serviço de diretório
subjacente dá suporte ao agrupamento de objetos de diretório por unidade
organizacional.

VB

Dim dom As IADsContainer


Dim ou As IADsOU

' Bind to the container.


Set dom = GetObject("LDAP://server1/domain1")

' Filter out all objects that are not of class "organizationalUnit".
dom.filter = Array("organizationalUnit")

' Enumerate the organizational units in the container and display


' the BusinessCategory and Description properties of each OU.
For Each ou In dom
MsgBox ou.BusinessCategory & ": " & ou.Description
Next

Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsOU é definido como A2F733B8-EFFE-11CF-8ABC-


00C04FD8D503

Confira também
IADSOU

Métodos de propriedade interface

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interface IADsPrintJob (iads.h)
Artigo24/08/2023

A interface IADsPrintJob é uma interface dupla que herda de IADs. Ele foi projetado
para representar um trabalho de impressão. Quando um usuário envia uma solicitação a
uma impressora para imprimir um documento, um trabalho de impressão é criado na
fila de impressão. Os métodos de propriedade permitem que você acesse as
informações sobre um trabalho de impressão. Essas informações incluem qual
impressora executa a impressão, quem enviou o documento, quando o documento foi
enviado e quantas páginas serão impressas.

Herança
A interface IADsPrintJob herda de IDispatch e IADs. IADsPrintJob também tem estes
tipos de membros:

Comentários
Para gerenciar um trabalho de impressão em uma rede, use a interface
IADsPrintJobOperations, que dá suporte à funcionalidade para examinar a status de um
trabalho de impressão e pausar ou retomar a operação de impressão do documento e
assim por diante.

Para acessar quaisquer trabalhos de impressão em uma fila de impressão, chame o


método IADsPrintQueueOperations::P rintJobs para obter o objeto de coleção que
contém todos os trabalhos de impressão na fila de impressão.

Exemplos

O exemplo de código a seguir mostra como gerenciar um trabalho de impressão


enviado à impressora, "\aMachine\aPrinter".

VB

Dim pq As IADsPrintQueue
Dim pqo As IADsPrintQueueOperations
Dim pj As IADsPrintJob
Dim pjo As IADsPrintJobOperations
Dim pjs As IADsCollection

On Error GoTo Cleanup


Set pq = GetObject("WinNT://aMachine/aPrinter")
Set pqo = pq
For Each pj In pqo.PrintJobs
MsgBox pj.class
MsgBox pj.description
MsgBox pj.HostPrintQueue
Set pjo = pj
If Hex(pjo.status) = 10 ' printing
pjo.Pause
Else
pjo.Resume
End If
Next

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set pq = Nothing
Set pqo = Nothing
Set pj = Nothing
Set pjo = Nothing
Set pjs = Nothing

O exemplo de código a seguir mostra como gerenciar um trabalho de impressão


enviado à impressora, "\aMachine\aPrinter".

C++

IADsPrintJobOperations *pjo = NULL;


IADsPrintQueueOperations *pqo = NULL;
IADsCollection *pColl = NULL;
IUnknown *pUnk = NULL;
IEnumVARIANT *pEnum = NULL;
VARIANT var;
ULONG lFetch = 0;
IDispatch *pDisp = NULL;

long status;

HRESULT hr = S_OK;
hr = ADsGetObject(L"WinNT://aMachine/aPrinter",
IID_IADsPrintQueueOperations,
(void**)&pqo);
if(FAILED(hr)){goto Cleanup;}

hr = pqo->PrintJobs(&pColl);

hr = pColl->get__NewEnum(&pUnk);
if(FAILED(hr)){goto Cleanup;}

hr = pUnk->QueryInterface(IID_IEnumVARIANT,(void**)&pEnum);
if(FAILED(hr)){goto Cleanup;}
// Now Enumerate
VariantInit(&var);
hr = pEnum->Next(1, &var, &lFetch);
while(hr == S_OK)
{
if (lFetch == 1)
{
pDisp = V_DISPATCH(&var);
pDisp->QueryInterface(IID_IADsPrintJobOperations,
(void**)&pjo);

pjo->get_Status(&status);
printf("Job status: %x\n",status);
if(stats == ADS_JOB_PRINTING) {
pjo.Pause();
}
else {
pjo.Resume();
}
pjo->Release();
}
pDisp->Release();
VariantClear(&var);
hr = pEnum->Next(1, &var, &lFetch);
};

Cleanup:
VariantClear(&var);
if(pColl) pColl->Release();
if(pUnk) pUnk->Release();
if(pEnum) pEnum->Release();
if(pqo) pqo->Release();

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Iads
Métodos da propriedade IADsPrintJob

IADsPrintJobOperations

IADsPrintQueueOperations::P rintJobs

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos da propriedade IADsPrintJob
Artigo • 13/06/2023

Métodos de propriedade para a interface IADsPrintJob obtêm ou definem as


propriedades descritas na tabela a seguir. Para obter mais informações, consulte
Métodos de propriedade de interface.

Propriedades
Descrição

A descrição do trabalho de impressão.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Description(
[out] BSTR* pbstrDescription
);
HRESULT put_Description(
[in] BSTR bstrDescription
);

HostPrintQueue

A cadeia de caracteres ADsPath da Fila de Impressão que processa o trabalho de


impressão.

Tipo de acesso: Somente leitura

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_HostPrintQueue(
[out] BSTR* pbstrHostPrintQueue
);

Notificar
O usuário a ser notificado quando o trabalho for concluído.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Notify(
[out] BSTR* pbstrNotify
);
HRESULT put_Notify(
[in] BSTR bstrNotify
);

NotifyPath

A cadeia de caracteres ADsPath do objeto de usuário a ser notificado quando o trabalho


de impressão for concluído.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_NotifyPath(
[out] BSTR* pbstrNotifyPath
);
HRESULT put_NotifyPath(
[in] BSTR bstrNotifyPath
);

Prioridade

A prioridade do trabalho de impressão.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_Priority(
[out] LONG* plPriority
);
HRESULT put_Priority(
[in] LONG lPriority
);

Tamanho

O tamanho, em bytes, do trabalho de impressão.

Tipo de acesso: Somente leitura

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_Size(
[out] LONG* plSize
);

StartTime

A primeira vez em que o trabalho de impressão deve ser iniciado.

Tipo de acesso: leitura/gravação

Tipo de dados de script: DATE

syntax

// C++ method syntax


HRESULT get_StartTime(
[out] DATE* pdateStartTime
);
HRESULT put_StartTime(
[in] DATE dateStartTime
);

TimeSubmitted

A hora em que o trabalho foi enviado para a fila.

Tipo de acesso: Somente leitura

Tipo de dados de script: DATE

syntax
// C++ method syntax
HRESULT get_TimeSubmitted(
[out] DATE* pdateTimeSubmitted
);

Totalpages

O número total de páginas no trabalho de impressão.

Tipo de acesso: Somente leitura

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_TotalPages(
[out] LONG* plTotalPages
);

UntilTime

A hora mais recente em que o trabalho de impressão deve ser iniciado.

Tipo de acesso: leitura/gravação

Tipo de dados de script: DATE

syntax

// C++ method syntax


HRESULT get_UntilTime(
[out] DATE* pdateUntilTime
);

Usuário

O nome do usuário que enviou o trabalho de impressão.

Tipo de acesso: Somente leitura

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_User(
[out] BSTR* pbstrUser
);

UserPath

A cadeia de caracteres ADsPath do objeto de usuário que enviou esse trabalho de


impressão.

Tipo de acesso: Somente leitura

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_UserPath(
[out] BSTR* pbstrUserPath
);

Exemplos
O exemplo de código a seguir mostra como trabalhar com propriedades de um objeto
de trabalho de impressão.

VB

Dim pqo As IADsPrintQueueOperations


Dim pj As IADsPrintJob
On Error GoTo Cleanup

Set pqo = GetObject("WinNT://aMachine/aPrinter")


For Each pj In pqo.PrintJobs
MsgBox "Host Printer: " & pj.HostPrintQueue
MsgBox "Job description: " & pj.Description
MsgBox "job requester: " & pj.User
Next

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set pqo = Nothing
Set pj = Nothing

O exemplo de código a seguir mostra como trabalhar com propriedades de um objeto


de trabalho de impressão.
C++

IADsPrintQueueOperations *pqo = NULL;


IADsPrintJob *pJob = NULL;
HRESULT hr = S_OK;
BSTR bstr = NULL;
VARIANT var;
ULONG lFetch = 0;
IDispatch *pDisp = NULL;
IADsCollection *pColl = NULL;
IUnknown *pUnk = NULL;
LPWSTR adsPath =L"WinNT://aMachine/aPrinter";

VariantInit(&var);

hr = ADsGetObject(adsPath,
IID_IADsPrintQueueOperations,
(void**)&pqo);
if(FAILED(hr)){goto Cleanup;}

hr = pqo->PrintJobs(&pColl);

// Enumerate print jobs. Code omitted.

hr = pColl->get__NewEnum(&pUnk);
if(FAILED(hr)){goto Cleanup;}

IEnumVARIANT *pEnum;
hr = pUnk->QueryInterface(IID_IEnumVARIANT,(void**)&pEnum);
if(FAILED(hr)){goto Cleanup;}

// Now Enumerate.
hr = pEnum->Next(1, &var, &lFetch);
if(FAILED(hr)){goto Cleanup;}

while(hr == S_OK)
{
if (lFetch == 1)
{
pDisp = V_DISPATCH(&var);
pDisp->QueryInterface(IID_IADsPrintJob, (void**)&pJob);

pJob->get_HostPrintQueue(&bstr);
printf("HostPrintQueue: %S\n",bstr);
SysFreeString(bstr);

pJob->get_Description(&bstr);
printf("Print job name: %S\n",bstr);
SysFreeString(bstr);

pJob->get_User(&bstr);
printf("Requester: %S\n",bstr);
SysFreeString(bstr);

pJob->Release();
}
pDisp->Release();
VariantClear(&var);
hr = pEnum->Next(1, &var, &lFetch);
};

Cleanup:
if(pEnum) pEnum->Release();
if(pUnk) pUnk->Release();
if(pColl) pColl->Release();
if(pqo) pqo->Release();

Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsPrintJob é definido como 32FB6780-1ED0-11CF-A988-


00AA006BC149

Confira também
IADsPrintJob

Métodos de propriedade interface

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interface IADsPrintQueue (iads.h)
Artigo24/08/2023

A interface IADsPrintQueue representa uma impressora em uma rede. É uma interface


dupla que herda de IADs. Os métodos de propriedade dessa interface permitem que
você acesse dados sobre uma impressora, por exemplo, modelo de impressora, local
físico e endereço de rede.

Herança
A interface IADsPrintQueue herda de IDispatch e IADs. IADsPrintQueue também tem
esses tipos de membros:

Comentários
Use essa interface para procurar uma coleção de trabalhos de impressão na fila de
impressão. Para controlar uma impressora em uma rede, use a interface
IADsPrintQueueOperations . Para obter uma coleção dos trabalhos de impressão, chame
o método IADsPrintQueueOperations::P rintJobs .

No Windows, uma impressora ou uma fila de impressão é gerenciada por um


computador host. Se o caminho para uma fila de impressão for conhecido, associe-o a
qualquer outro objeto ADSI.

O exemplo de código do Visual Basic a seguir mostra a operação de associação.

VB

Dim pq as IADsPrintQueue
Set pq = GetObject("WinNT://aMachine/aPrinter")

O exemplo de código C++ a seguir mostra a operação de associação.

C++

IADsPrintQueue *pq;
LPWSTR adsPath = L"WinNT://aMachine/aPrinter";
HRESULT hr = ADsGetObject(adsPath,
IID_IADsPrintQueue,
(void**)&pq);

Para enumerar todas as filas de impressão em um determinado computador


1. Associar ao objeto do computador.
2. Determine se o computador contém objetos "PrintQueue".
3. Enumerar todos os objetos de impressora encontrados.

Exemplos
O exemplo de código a seguir enumera impressoras em um determinado computador.

VB

Dim cont As IADsContainer


Dim pq As IADsPrintQueue

On Error GoTo Cleanup

' Bind to the computer object


Set cont = GetObject("WinNT://fabrikam1,computer")

cont.Filter = Array("PrintQueue")

For Each p In cont


Set pq = GetObject(p.ADsPath)
MsgBox pq.Name & " is a " & pq.Model
Next p

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set cont = Nothing
Set pq = Nothing

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Iads

Métodos de propriedade IADsPrintQueue

IADsPrintQueueOperations

IADsPrintQueueOperations::P rintJobs

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos de propriedade
IADsPrintQueue
Artigo • 03/06/2023

Os métodos de propriedade da interface IADsPrintQueue obtêm ou definem as


propriedades descritas na tabela a seguir. Para obter mais informações, consulte
métodos de propriedade interface.

Propriedades
BannerPage

O caminho do sistema de arquivos que aponta para a página de faixa usada para
separar trabalhos de impressão. Se NULL, nenhuma página de faixa será usada.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_BannerPage(
[out] BSTR* pbstrBannerPage
);
HRESULT put_BannerPage(
[in] BSTR bstrBannerPage
);

Datatype

O tipo de dados que pode ser processado por essa fila.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Datatype(
[out] BSTR* pbstrDatatype
);
HRESULT put_Datatype(
[in] BSTR bstrDatatype
);

DefaultJobPriority

A prioridade padrão atribuída a cada trabalho de impressão.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_DefaultJobPriority(
[out] LONG* plDefaultJobPriority
);
HRESULT put_DefaultJobPriority(
[in] BSTR lDefaultJobPriority
);

Descrição

A descrição do texto dessa fila de impressão.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Description(
[out] BSTR* pbstrDescription
);
HRESULT put_Description(
[in] BSTR bstrDescription
);

HostComputer

A cadeia de caracteres ADsPath que faz referência ao computador host.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax
// C++ method syntax
HRESULT get_HostComputer(
[out] BSTR* pbstrHostComputer
);
HRESULT put_HostComputer(
[in] BSTR bstrHostComputer
);

Localidade

O local da fila conforme descrito por um administrador.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Location(
[out] BSTR* pbstrLocation
);
HRESULT put_Location(
[in] BSTR bstrLocation
);

Modelo

O nome do driver usado por essa fila de impressão.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Model(
[out] BSTR* pbstrModel
);
HRESULT put_Model(
[in] BSTR bstrModel
);

PrintDevices

Um SAFEARRAY do BSTR que contém os nomes dos dispositivos de impressão aos quais
essa fila de impressão spools trabalhos.
Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT

syntax

// C++ method syntax


HRESULT get_PrintDevices(
[out] VARIANT* pvPrintDevices
);
HRESULT put_PrintDevices(
[in] VARIANT vPrintDevices
);

PrinterPath

A cadeia de caracteres que faz referência ao caminho pelo qual uma impressora
compartilhada pode ser acessada.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_PrinterPath(
[out] BSTR* pbstrPrinterPath
);
HRESULT put_PrinterPath(
[in] BSTR bstrPrinterPath
);

Printprocessor

O processador de impressão associado a essa fila.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_PrintProcessor(
[out] BSTR* pbstrPrintProcessor
);
HRESULT put_PrintProcessor(
[in] BSTR bstrPrintProcessor
);

Prioridade

A prioridade dessa fila de trabalho de objeto de impressora para qualquer dispositivo


conectado. Todos os trabalhos em objetos de fila de impressão de prioridade mais alta
serão processados primeiro.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_Priority(
[out] LONG* plPriority
);
HRESULT put_Priority(
[in] LONG lPriority
);

StartTime

A hora em que a fila deve começar a processar trabalhos. A parte da data da hora é
ignorada.

Tipo de acesso: leitura/gravação

Tipo de dados de script: DATE

syntax

// C++ method syntax


HRESULT get_StartTime(
[out] DATE* pdateStartTime
);
HRESULT put_StartTime(
[in] DATE dateStartTime
);

UntilTime

A hora em que a fila deve parar o processamento de trabalhos.

Tipo de acesso: leitura/gravação


Tipo de dados de script: DATE

syntax

// C++ method syntax


HRESULT get_UntilTime(
[out] DATE* pdateUntilTime
);
HRESULT put_UntilTime(
[in] DATE dateUntilTime
);

Exemplos
O exemplo de código a seguir mostra como determinar se uma impressora especificada
está online ou offline.

VB

Dim pq As IADsPrintQueue
Dim pqo As IADsPrintQueueOperations
On Error GoTo Cleanup

Set pq = GetObject("WinNT://aMachine/aPrinter")
Set pqo = pq
If pqo.status = ADS_PRINTER_OFFLINE Then
MsgBox pq.Model & "@" & pq.Location & is offline."
Else
MsgBox pq.Model & "@" & pq.Location & is online."
End If

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set pq = Nothing
Set pqo = Nothing

O exemplo de código a seguir mostra como determinar se uma impressora especificada


está online ou offline.

C++

IADsPrintQueue *pq = NULL;


HRESULT hr = S_OK;
IADsPrintQueueOperations *pqo = NULL;
BSTR model = NULL;
BSTR location = NULL;
LPWSTR adsPath = L"WinNT://aMachine/aPrinter";
hr = ADsGetObject(adsPath,
IID_IADsPrintQueue,
(void**)&pq);
if(FAILED(hr)) {goto Cleanup;}

hr = pq->QueryInterface(IID_IADsPrintQueueOperations,(void**)&pqo);
if(FAILED(hr)) {goto Cleanup;}

long status;
hr = pqo->get_Status(&status);
if(FAILED(hr)) {goto Cleanup;}

hr = pq->get_Model(&model);
if(FAILED(hr)) {goto Cleanup;}

hr =pq->get_Location(&location);
if(FAILED(hr)) {goto Cleanup;}

if(status == ADS_PRINTER_OFFLINE)
{
printf("%S @ %S is offline.\n",model,location);
}
else
{
printf("%S @ %S is online.\n",model,location);
}

Cleanup:
SysFreeString(model);
SysFreeString(location);
if(pq) pq->Release();
if(pqo) pqo->Release();

Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll
Requisito Valor

IID IID_IADsPrintQueue é definido como B15160D0-1226-11CF-A985-


00AA006BC149

Confira também
IADsPrintQueue

Métodos de propriedade interface

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interface IADsService (iads.h)
Artigo14/03/2023

A interface IADsService é uma interface dupla que herda de IADs. Ele foi projetado para
manter dados sobre serviços do sistema em execução em um computador host.
Exemplos desses serviços incluem "FAX" para o Serviço de Fax da Microsoft,
"RemoteAccess" para Roteamento e Serviço RemoteAccess e "seclogon" para o Serviço
de Logon Secundário. Exemplos dos dados sobre qualquer serviço do sistema incluem o
caminho para o arquivo executável no computador host, o tipo do serviço, outros
serviços ou grupo de carga necessários para executar um serviço específico e outros.
IADsService expõe várias propriedades para representar esses dados.

Herança
A interface IADsService herda de IDispatch e IADs. IADsService também tem estes tipos
de membros:

Comentários
Os serviços do sistema são publicados no diretório subjacente. Alguns podem estar em
execução, outros não. Para verificar o status ou operar em qualquer um dos serviços,
use as propriedades e os métodos da interface IADsServiceOperations.

O serviço de arquivo é um caso especial do serviço do sistema. As interfaces


IADsFileService e IADsFileServiceOperations dão suporte a recursos adicionais exclusivos
para serviços de arquivos.

Exemplos

Para identificar os serviços disponíveis em um computador host, primeiro associe-se ao


computador e enumere os serviços disponíveis nesse computador. O exemplo de
código a seguir mostra como fazer isso.

VB

Public Sub ListServicesOnComputer(ComputerName As String)


Dim comp As IADsComputer
Dim srvc As IADsServiceOperations

On Error GoTo Cleanup


Set comp = GetObject("WinNT://" + ComputerName + ",Computer")
comp.Filter = Array("Service")
For Each srvc In comp
' The srvc object is an IADsServiceOperations object that can be
' used to obtain the status of the service with the Status property.
' Other IADs properties can also be obtained.
Next

Cleanup:
If (Err.Number <> 0) Then
MsgBox (Err.Description & vbLf & vbLf & " Error number = " &
Err.Number)
End If
Set comp = Nothing
End Sub

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Iads

IADsFileService

IADsFileServiceOperations

Métodos de propriedade IADsService

IADsServiceOperations

IDispatch

Comentários
Esta página foi útil?
 Yes  No
Métodos de propriedade IADsService
Artigo • 03/06/2023

Os métodos de propriedade da interface IADsService leem e gravam as propriedades


descritas neste tópico. Para obter mais informações, consulte métodos de propriedade
interface.

Propriedades
Dependências

Matriz de nomes BSTR de serviços ou grupos de carga que devem ser carregados para
que esse serviço seja carregado. A sintaxe da entrada é "Service:" seguido pelo nome do
serviço ou "Group:" seguido pelo nome do grupo de carga.

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT

syntax

// C++ method syntax


HRESULT get_Dependencies(
[out] VARIANT* pvServiceDepend
);
HRESULT put_Dependencies(
[in] VARIANT vServiceDepend
);

DisplayName

O nome amigável do serviço.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_DisplayName(
[out] BSTR* pbstrDisplayName
);
HRESULT put_DisplayName(
[in] BSTR bstrDisplayName
);
ErrorControl

A ação a ser executada se esse serviço falhar na inicialização. Veja a seguir valores
válidos para essa propriedade.

ADS_SERVICE_ERROR_IGNORE

O programa de inicialização registra o erro, mas continua a operação de inicialização.

ADS_SERVICE_ERROR_NORMAL

O programa de inicialização registra o erro e apresenta uma caixa de mensagem, mas


continua a operação de inicialização.

ADS_SERVICE_ERROR_SEVERE

O programa de inicialização registra o erro. Se a última configuração conhecida-boa for


iniciada, a operação de inicialização continuará. Caso contrário, o sistema será reiniciado
com a última configuração conhecida.

ADS_SERVICE_ERROR_CRITICAL

O programa de inicialização registra o erro, se possível. Se a última configuração


conhecida estiver sendo iniciada, a operação de inicialização falhará. Caso contrário, o
sistema será reiniciado com a última configuração boa conhecida.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_ErrorControl(
[out] LONG* plErrorControl
);
HRESULT put_ErrorControl(
[in] LONG lErrorControl
);

HostComputer

A cadeia de caracteres ADsPath do host desse serviço.

Tipo de acesso: leitura/gravação


Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_HostComputer(
[out] BSTR* pbstrHostComputer
);
HRESULT put_HostComputer(
[in] BSTR bstrHostComputer
);

LoadOrderGroup

Nome do grupo de pedidos de carga que esse serviço é um membro.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_LoadOrderGroup(
[out] BSTR* pbstrLoadOrderGroup
);
HRESULT put_LoadOrderGroup(
[in] BSTR bstrLoadOrderGroup
);

Caminho

Caminho e nome do arquivo para o executável deste serviço.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Path(
[out] BSTR* pbstrPath
);
HRESULT put_Path(
[in] BSTR bstrPath
);

ServiceAccountName
Nome da conta que esse serviço usa para se autenticar na inicialização.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_ServiceAccountName(
[out] BSTR* pbstrServiceAccountName
);
HRESULT put_ServiceAccountName(
[in] BSTR bstrServiceAccountName
);

ServiceAccountPath

Caminho da conta especificada pela propriedade ServiceAccountPath .

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_ServiceAccountPath(
[out] BSTR* pbstrServiceAccountPath
);
HRESULT put_ServiceAccountPath(
[in] BSTR bstrServiceAccountPath
);

ServiceType

A descrição de como um serviço se apresenta no computador host. Essa propriedade


pode ser zero ou uma combinação de um ou mais dos valores a seguir.

ADS_SERVICE_KERNEL_DRIVER (0x00000001)

ADS_SERVICE_FILE_SYSTEM_DRIVER (0x00000002)

ADS_SERVICE_OWN_PROCESS (0x00000010)

ADS_SERVICE_SHARE_PROCESS (0x00000020)

Tipo de acesso: leitura/gravação


Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_ServiceType(
[out] LONG* plServiceType
);
HRESULT put_ServiceType(
[in] LONG lServiceType
);

StartType

Determina como iniciar o serviço. Veja a seguir valores válidos para essa propriedade.

ADS_SERVICE_BOOT_START

O serviço é um driver de dispositivo iniciado pelo carregador do sistema. Esse valor só é


válido para serviços do driver.

ADS_SERVICE_SYSTEM_START

O serviço é um driver de dispositivo iniciado pela função IoInitSystem . Esse valor só é


válido para serviços do driver.

ADS_SERVICE_AUTO_START

O serviço será iniciado automaticamente pelo gerenciador de controle de serviço


durante a inicialização do sistema.

ADS_SERVICE_DEMAND_START

O serviço será iniciado pelo gerenciador de controle de serviço quando um processo


chamar a função StartService .

ADS_SERVICE_DISABLED

Não é possível iniciar o serviço. Tenta iniciar o resultado do serviço no código de erro
ERROR_SERVICE_DISABLED.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax
// C++ method syntax
HRESULT get_StartType(
[out] LONG* plStartType
);
HRESULT put_StartType(
[in] LONG lStartType
);

StartupParameters

Parâmetros passados para o serviço na inicialização.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_StartupParameters(
[out] BSTR* pbstrStartupParameters
);
HRESULT put_StartupParameters(
[in] BSTR bstrStartupParameters
);

Versão

Versão do serviço.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Version(
[out] BSTR* pbstrVersion
);
HRESULT put_Version(
[in] BSTR bstrVersion
);

Exemplos
O exemplo de código a seguir mostra como listar todos os serviços de sistema
disponíveis em execução no computador host, "myMachine", juntamente com o local
para localizar os executáveis dos serviços.

VB

Dim cp As IADsComputer
On Error GoTo Cleanup

Set cp = GetObject("WinNT://myMachine,computer")
If (IsEmpty(cp) = False) Then
cp.Filter = Array("Service")
For Each service In cp
MsgBox service.Name & " @" & service.path
Next
End if

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set cp = Nothing

Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsService é definido como 68AF66E0-31CA-11CF-A98A-


00AA006BC149

Confira também
IADsService

Métodos de propriedade de interface


Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interface IADsUser (iads.h)
Artigo24/08/2023

A interface IADsUser é uma interface dupla que herda de IADs. Ele foi projetado para
representar e gerenciar uma conta de usuário final em uma rede. Chame os métodos
dessa interface para acessar e manipular dados de conta de usuário final. Esses dados
incluem nomes do usuário, números de telefone, cargo e assim por diante. Essa
interface dá suporte a recursos para determinar a associação de grupo do usuário e
para definir ou alterar a senha.

Para associar a um usuário de domínio por meio de um provedor WinNT, use o nome
de domínio como parte do ADsPath, conforme mostrado no exemplo de código a
seguir.

C++

GetObject("WinNT://MYDOMAIN/jeffsmith,user")

Da mesma forma, use o nome do computador como parte do ADsPath para associar a
um usuário local.

C++

GetObject("WinNT://MYCOMPUTER/jeffsmith,user")

No Active Directory, os usuários de domínio residem no diretório. O exemplo de código


a seguir mostra como associar a um usuário de domínio por meio de um provedor
LDAP.

C++

GetObject("LDAP://CN=Jeff Smith,OU=Sales,DC=Fabrikam,DC=Com")

No entanto, as contas locais residem no banco de dados SAM local e o provedor LDAP
não se comunica com o banco de dados local. Portanto, para associar a um usuário
local, você deve passar por um provedor WinNT, conforme descrito no segundo
exemplo de código.

Herança
A interface IADsUser herda de IDispatch e IADs. IADsUser também tem esses tipos de
membros:

Métodos
A interface IADsUser tem esses métodos.

IADsUser::ChangePassword

Altera a senha do usuário do valor antigo especificado para um novo valor.

IADsUser::Groups

Obtém uma coleção dos objetos de grupo ADSI aos quais este usuário pertence.

IADsUser::SetPassword

Define a senha do usuário como um valor especificado.

Comentários
Assim como acontece com qualquer outro objeto ADSI, o objeto contêiner cria um
objeto de conta de usuário do Windows. Primeiro, associe-se a um objeto de contêiner.
Em seguida, chame o método IADsContainer::Create e especifique atributos obrigatórios
ou opcionais.

Com o WinNT, você não precisa especificar nenhum atributo adicional ao criar um
usuário. Você pode chamar o método IADsContainer::Create para criar o objeto de
usuário diretamente.

VB

Dim dom As IADsContainer


Dim usr As IADsUser

On Error GoTo Cleanup

Set dom = GetObject("WinNT://MyDomain")


Set usr = dom.Create("user","jeffsmith")
usr.SetInfo

Cleanup:
If(Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set mach = Nothing
Set usr = Nothing

Nesse caso, um usuário de domínio é criado com os seguintes valores padrão.

Propriedade Valor

Nome completo Nome da conta SAM (como jeffsmith)

Senha Vazio

O usuário deve alterar a senha TRUE

Usuário não pode alterar senha FALSE

A senha nunca expira FALSE

Conta Desabilitada FALSE

Grupo Usuário do Domínio

Perfil Vazio

A conta nunca expira TRUE

Para criar um usuário local, associe-se a um computador de destino, conforme mostrado


no exemplo de código a seguir.

VB

Dim mach As IADsContainer


Dim usr as IADsUser

On Error GoTo Cleanup


Set mach = GetObject("WinNT://MyMachine,Computer")
Set usr = mach.Create("user","jeffsmith")
usr.SetInfo

Cleanup:
If(Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set mach = Nothing
Set usr = Nothing
O usuário local recém-criado terá as mesmas propriedades padrão que o usuário de
domínio. No entanto, a associação ao grupo será "usuários", em vez de "usuário de
domínio".

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Iads

IADsContainer::Create

Métodos de propriedade IADsUser

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos de propriedade IADsUser
Artigo • 03/06/2023

Os métodos de propriedade da interface IADsUser obtêm ou definem as propriedades


descritas na tabela a seguir. Para obter mais informações, consulte métodos de
propriedade interface.

Propriedades
Conta Desabilitada

Um sinalizador para indicar se a conta está ou deve ser desabilitada.

Tipo de acesso: leitura/gravação

Tipo de dados de script: Boolean

syntax

// C++ method syntax


HRESULT get_AccountDisabled(
[out] VARIANT_BOOL* pfAccountDisabled
);
HRESULT put_AccountDisabled(
[in] VARIANT_BOOL fAccountDisabled
);

AccountExpirationDate

A data e hora após a qual o usuário não pode fazer logon.

Tipo de acesso: leitura/gravação

Tipo de dados de script: DATE

syntax

// C++ method syntax


HRESULT get_AccountExpirationDate(
[out] DATE* pdateAccountExpirationDate
);
HRESULT put_AccountExpirationDate(
[in] DATE dateAccountExpirationDate
);
BadLoginAddress

O último nó que é considerado um possível intruso; isso estará disponível se a detecção


de Intruso estiver ativa.

Tipo de acesso: Somente leitura

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_BadLoginAddress(
[out] BSTR* pbstrBadLoginAddress
);

BadLoginCount

O número de tentativas de logon incorretas desde a última redefinição.

Tipo de acesso: Somente leitura

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_BadLoginCount(
[out] LONG* plBadLoginCount
);

Departamento

O departamento, uma UO (unidade organizacional), dentro da empresa à qual o usuário


pertence.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Department(
[out] BSTR* pbstrDepartment
);
HRESULT put_Department(
[in] BSTR bstrDepartment
);

Descrição

A descrição do texto do usuário.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Description(
[out] BSTR* pbstrDescription
);
HRESULT put_Description(
[in] BSTR bstrDescription
);

Divisão

A divisão dentro de uma empresa ou organização.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Division(
[out] BSTR* pbstrDivision
);
HRESULT put_Division(
[in] BSTR bstrDivision
);

EmailAddress

O endereço de email do usuário.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax
// C++ method syntax
HRESULT get_EmailAddress(
[out] BSTR* pbstrEmailAddress
);
HRESULT put_EmailAddress(
[in] BSTR bstrEmailAddress
);

EmployeeID

O identificador do funcionário do usuário.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_EmployeeID(
[out] BSTR* pbstrEmployeeID
);
HRESULT put_EmployeeID(
[in] BSTR bstrEmployeeID
);

FaxNumber

O número de fax, ou números, do usuário. No Active Directory, essa propriedade tem


valor único e a matriz VARIANT tem um elemento.

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT

syntax

// C++ method syntax


HRESULT get_FaxNumber(
[out] VARIANT* pvarFaxNumber
);
HRESULT put_FaxNumber(
[in] VARIANT varFaxNumber
);

Nome

Primeiro nome do usuário.


Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_FirstName(
[out] BSTR* pbstrFirstName
);
HRESULT put_FirstName(
[in] BSTR bstrFirstName
);

FullName

O nome completo do usuário.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_FullName(
[out] BSTR* pbstrFullName
);
HRESULT put_FullName(
[in] BSTR bstrFullName
);

GraceLoginsAllowed

O número de vezes que o usuário pode fazer logon depois que a senha expirou.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_GraceLoginsAllowed(
[out] LONG* plGraceLoginsAllowed
);
HRESULT put_GraceLoginsAllowed(
[in] LONG lGraceLoginsAllowed
);
GraceLoginsRemaining

O número de logons permitidos antes que a conta seja bloqueada.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_GraceLoginsRemaining(
[out] LONG* plGraceLoginsRemaining
);
HRESULT put_GraceLoginsRemaining(
[in] LONG lGraceLoginsRemaining
);

HomeDirectory

O diretório inicial do usuário.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_HomeDirectory(
[out] BSTR* pbstrHomeDirectory
);
HRESULT put_HomeDirectory(
[in] BSTR bstrHomeDirectory
);

Homepage

A URL da home page do usuário.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_HomePage(
[out] BSTR* pbstrHomePage
);
HRESULT put_HomePage(
[in] BSTR bstrHomePage
);

IsAccountLocked

Um sinalizador que indica se a conta está bloqueada devido à detecção de invasores.


Essa propriedade tem uso limitado quando usada com o provedor ADSI LDAP. Para
obter mais informações sobre essas limitações, consulte o Bloqueio de Conta (Provedor
LDAP).

Tipo de acesso: leitura/gravação

Tipo de dados de script: Boolean

syntax

// C++ method syntax


HRESULT get_IsAccountLocked(
[out] VARIANT_BOOL* pfIsAccountLocked
);
HRESULT put_IsAccountLocked(
[in] VARIANT_BOOL fIsAccountLocked
);

Idiomas

Uma matriz de nomes de idioma BSTR para o usuário.

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT

syntax

// C++ method syntax


HRESULT get_Languages(
[out] VARIANT* pvLanguages
);
HRESULT put_Languages(
[in] VARIANT vLanguages
);

LastFailedLogin

A data e a hora do último logon de rede com falha.


Tipo de acesso: Somente leitura

Tipo de dados de script: DATE

syntax

// C++ method syntax


HRESULT get_LastFailedLogin(
[out] DATE* pdateLastFailedLogin
);

LastLogin

A data e a hora do último logon de rede.

Tipo de acesso: Somente leitura

Tipo de dados de script: DATE

syntax

// C++ method syntax


HRESULT get_LastLogin(
[out] DATE* pdateLastLogin
);

LastLogoff

A data e a hora do último logoff de rede.

Tipo de acesso: Somente leitura

Tipo de dados de script: DATE

syntax

// C++ method syntax


HRESULT get_LastLogoff(
[out] DATE* pdateLastLogoff
);

Sobrenome

Sobrenome do usuário.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR


syntax

// C++ method syntax


HRESULT get_LastName(
[out] BSTR* pbstrLastName
);
HRESULT put_LastName(
[in] BSTR bstrLastName
);

LoginHours

Períodos de tempo para cada dia da semana durante os quais os logons são permitidos
para o usuário. Representado como uma tabela de valores boolianos para a semana,
cada um indicando se esse intervalo de tempo é um tempo de logon válido. Lembre-se
de que a representação é específica do provedor e do diretório.

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT

syntax

// C++ method syntax


HRESULT get_LoginHours(
[out] VARIANT* pvLoginHours
);
HRESULT put_LoginHours(
[in] VARIANT vLoginHours
);

LoginScript

O caminho do script de logon.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_LoginScript(
[out] BSTR* pbstrLoginScript
);
HRESULT put_LoginScript(
[in] BSTR bstrLoginScript
);
LoginWorkstations

Endereços ou nomes de estações de trabalho, do tipo de dados BSTR , do qual o


usuário pode fazer logon.

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT

syntax

// C++ method syntax


HRESULT get_LoginWorkstations(
[out] VARIANT* pvLoginWorkstations
);
HRESULT put_LoginWorkstations(
[in] VARIANT vLoginWorkstations
);

Gerente

O gerente do usuário.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Manager(
[out] BSTR* pbstrManager
);
HRESULT put_Manager(
[in] BSTR bstrManager
);

MaxLogins

O número de sessões de logon simultâneas permitidas.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_MaxLogins(
[out] LONG* plMaxLogins
);
HRESULT put_MaxLogins(
[in] LONG lMaxLogins
);

MaxStorage

A quantidade máxima de espaço em disco, em quilobytes, que o usuário pode usar.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_MaxStorage(
[out] LONG* plMaxStorage
);
HRESULT put_MaxStorage(
[in] LONG lMaxStorage
);

NamePrefix

Prefixo de nome do usuário, por exemplo "Ms.", ou "Hon".

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_NamePrefix(
[out] BSTR* pbstrNamePrefix
);
HRESULT put_NamePrefix(
[in] BSTR bstrNamePrefix
);

NameSuffix

Sufixo de nome do usuário, por exemplo , "Jr.", ou "III".

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR


syntax

// C++ method syntax


HRESULT get_NameSuffix(
[out] BSTR* pbstrNameSuffix
);
HRESULT put_NameSuffix(
[in] BSTR bstrNameSuffix
);

OfficeLocations

Office local como uma matriz BSTR para o usuário. Para o Active Directory, essa
propriedade tem valor único e a matriz tem um elemento.

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT

syntax

// C++ method syntax


HRESULT get_OfficeLocations(
[out] VARIANT* pvOfficeLocations
);
HRESULT put_OfficeLocations(
[in] VARIANT vOfficeLocations
);

OtherName

Um nome adicional, por exemplo, o nome do meio, para o usuário.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_OtherName(
[out] BSTR* pbstrOtherName
);
HRESULT put_OtherName(
[in] BSTR bstrOtherName
);

PasswordExpirationDate
A data e a hora em que a senha expira.

Tipo de acesso: leitura/gravação

Tipo de dados de script: DATE

syntax

// C++ method syntax


HRESULT get_PasswordExpirationDate(
[out] DATE* pdatePasswordExpirationDate
);
HRESULT put_PasswordExpirationDate(
[in] DATE datePasswordExpirationDate
);

PasswordLastChanged

A última vez que a senha foi alterada.

Tipo de acesso: Somente leitura

Tipo de dados de script: DATE

syntax

// C++ method syntax


HRESULT get_PasswordLastChanged(
[out] DATE* pdatePasswordLastChanged
);

PasswordMinimumLength

O comprimento mínimo da senha.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_PasswordMinimumLength(
[out] LONG* plPasswordMinimumLength
);
HRESULT put_PasswordMinimumLength(
[in] LONG lPasswordMinimumLength
);
PasswordRequired

Um sinalizador que indica se a senha é necessária.

Tipo de acesso: leitura/gravação

Tipo de dados de script: Boolean

syntax

// C++ method syntax


VARIANT_BOOL get_PasswordRequired(
[out] VARIANT_BOOL* pfPasswordRequired
);
HRESULT put_PasswordRequired(
[in] VARIANT_BOOL fPasswordRequired
);

Picture

Uma matriz OctetString de bytes que armazena uma imagem.

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT

syntax

// C++ method syntax


HRESULT get_Picture(
[out] VARIANT* pvarPicture
);
HRESULT put_Picture(
[in] VARIANT varPicture
);

PostalAddresses

Endereço postal como uma matriz BSTR . Essa propriedade tem vários valores para
conter mais do que endereços do usuário. O formato interno de um PostalAddress deve
estar em conformidade com o CCITT F.401, conforme referenciado em X.521-1993, que
define um PostalAddress como seis elementos de 30 bytes cada, mantendo um
endereço de rua, (opcionalmente) Post Office Box, cidade ou localidade, estado ou
província, Cep e País/Região.

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT


syntax

// C++ method syntax


HRESULT get_PostalAddresses(
[out] VARIANT* pvPostalAddresses
);
HRESULT put_PostalAddresses(
[in] VARIANT vPostalAddresses
);

PostalCodes

Códigos postais como uma matriz BSTR . Os códigos postais são vinculados
posicionalmente à matriz PostalAddresses . No Active Directory, no entanto, essa
propriedade é de valor único e a matriz tem um único elemento.

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT

syntax

// C++ method syntax


HRESULT get_PostalCodes(
[out] VARIANT* pvPostalCodes
);
HRESULT put_PostalCodes(
[in] VARIANT vPostalCodes
);

Perfil

O caminho para o perfil do usuário.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Profile(
[out] BSTR* pbstrProfile
);
HRESULT put_Profile(
[in] BSTR bstrProfile
);
RequireUniquePassword

Um sinalizador que indica se uma nova senha deve ser diferente daquela conhecida por
meio de um histórico de senhas.

Tipo de acesso: leitura/gravação

Tipo de dados de script: Boolean

syntax

// C++ method syntax


HRESULT get_RequireUniquePassword(
[out] VARIANT_BOOL* pfRequireUniquePassword
);
HRESULT put_RequireUniquePassword(
[in] VARIANT_BOOL fRequireUniquePassword
);

SeeAlso

Uma matriz de ADsPaths de outros objetos relacionados ao usuário.

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT

syntax

// C++ method syntax


HRESULT get_SeeAlso(
[out] VARIANT* pvSeeAlso
);
HRESULT put_SeeAlso(
[in] VARIANT vSeeAlso
);

PhoneHome

Uma matriz de números de telefone residencial do usuário. No Active Directory, essa


propriedade é de valor único e a matriz tem um elemento.

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT

syntax
// C++ method syntax
HRESULT get_TelephoneHome(
[out] VARIANT* pvarTelephoneHome
);
HRESULT put_TelephoneHome(
[in] VARIANT varTelephoneHome
);

PhoneMobile

Uma matriz de números de telefone celular do usuário. No Active Directory, essa


propriedade tem valor único e a matriz tem apenas um elemento.

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT

syntax

// C++ method syntax


HRESULT get_TelephoneMobile(
[out] VARIANT* pvarTelephoneMobile
);
HRESULT put_TelephoneMobile(
[in] VARIANT varTelephoneMobile
);

Telephonenumber

Uma matriz de números de telefone, geralmente relacionados ao trabalho, associados


ao usuário. No Active Directory, essa propriedade tem valor único e a matriz é de um
único elemento.

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT

syntax

// C++ method syntax


HRESULT get_TelephoneNumber(
[out] VARIANT* pvarTelephoneNumber
);
HRESULT put_TelephoneNumber(
[in] VARIANT varTelephoneNumber
);
PhonePager

Uma matriz de números de pager do usuário. No Active Directory, essa propriedade tem
valor único e a matriz é de um único elemento.

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT

syntax

// C++ method syntax


HRESULT get_TelephonePager(
[out] VARIANT* pvarTelephonePager
);
HRESULT put_TelephonePager(
[in] VARIANT varTelephonePager
);

Título

O título do usuário.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Title(
[out] BSTR* pbstrTitle
);
HRESULT put_Title(
[in] BSTR bstrTitle
);

Comentários
O provedor WinNT fornecido pela Microsoft não dá suporte a todos os métodos de
propriedade IADsUser , conforme apresentado acima. No entanto, o provedor dá
suporte a outras propriedades que podem ser acessadas usando o método IADs::Get ou
IADs::P ut . Para obter mais informações e uma lista de propriedades sem suporte e
exemplos de código, consulte o Objeto de Usuário WinNT no Provedor ADSI WinNT.
Para obter mais informações sobre os recursos específicos do provedor ADSI LDAP do
objeto de classe de usuário, consulte Objeto de Usuário LDAP no Provedor LDAP ADSI.
O tópico inclui IADsUser, bem como exemplos de código para gerenciar uma conta de
usuário.

Exemplos
O exemplo de código a seguir mostra como associar a um objeto de conta de usuário e
recuperar o nome completo do usuário.

VB

Dim usr As IADsUser


Dim sFullName as String

On Error GoTo Cleanup


Set usr = GetObject("WinNT://Fabrikam/JeffSmith,user")
sFullName = usr.FullName

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If

Set usr = Nothing

O exemplo de código a seguir mostra como associar a um objeto de conta de usuário e


recuperar o nome completo do usuário.

C++

IADsUser *GetUserObject(LPWSTR uPath)


{
IADsUser *pUser;
HRESULT hr = ADsGetObject(uPath,IID_IADsUser,(void**)&pUser);
if (FAILED(hr)) {return NULL;}
BSTR bstr;
hr = pUser->get_FullName(&bstr);
printf("User: %S\n", bstr);
SysFreeString(bstr);
return pUser;
}

Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsUser é definido como 3E37E320-17E2-11CF-ABC4-


02608C9E7553

Confira também
Iadsuser

Métodos de propriedade de interface

IADs::Get

IADs::P ut

Objeto de usuário WinNT

Provedor ADSI WinNT

Objeto de usuário LDAP

Provedor LDAP ADSI

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Método IADsUser::ChangePassword
(iads.h)
Artigo24/08/2023

O método IADsUser::ChangePassword altera a senha do usuário do valor antigo


especificado para um novo valor.

Sintaxe
C++

HRESULT ChangePassword(
[in] BSTR bstrOldPassword,
[out] BSTR bstrNewPassword
);

Parâmetros
[in] bstrOldPassword

Um BSTR que contém a senha atual.

[out] bstrNewPassword

Um BSTR que contém a nova senha.

Valor retornado
Esse método dá suporte aos valores retornados padrão, incluindo S_OK. Para obter mais
informações e outros valores retornados, consulte Códigos de erro ADSI.

Comentários
IADsUser::ChangePassword funciona de forma semelhante a IADsUser::SetPassword ,
pois ele usará um dos três métodos para tentar alterar a senha. Inicialmente, o provedor
LDAP tentará uma operação de alteração de senha LDAP, se uma conexão SSL segura
com o servidor for estabelecida. Se essa tentativa falhar, o provedor LDAP tentará usar
Kerberos (consulte IADsUser::SetPassword para alguns problemas que podem resultar
no Windows com autenticação entre florestas) e, se isso também falhar, ele finalmente
chamará a API de gerenciamento de rede específica do Active Directory,
NetUserChangePassword.

No Active Directory, o chamador deve ter o direito de acesso de controle estendido


Alterar Senha para alterar a senha com esse método.

Exemplos

O exemplo de código a seguir mostra como alterar uma senha de usuário.

VB

Dim usr As IADsUser


Dim szOldPass As String
Dim szNewPass As String

On Error GoTo Cleanup

Set usr = GetObject("WinNT://Fabrikam/JeffSmith,user")


' Add code to securely retrieve the old and new password.

usr.ChangePassword szOldPass, szNewPass

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set usr = Nothing

O exemplo de código a seguir mostra como alterar uma senha de usuário.

C++

HRESULT ChangePassword(
IADsUser *pUser,
LPWSTR oldPasswd,
LPWSTR newPasswd)
{
HRESULT hr=S_OK;
if(!pUser) { return E_FAIL;}
hr = pUser->ChangePassword(oldPasswd, newPasswd);
printf("User password has been changed");
return hr;
}

Requisitos
Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

Iadsuser

Métodos de propriedade IADsUser

Comentários
Esta página foi útil?  Yes  No
Método IADsUser::Groups (iads.h)
Artigo24/08/2023

O método IADsUser::Groups obtém uma coleção dos objetos de grupo ADSI aos quais
esse usuário pertence. O método retorna um ponteiro de interface IADsMembers por
meio do qual você pode enumerar todos os grupos na coleção.

Sintaxe
C++

HRESULT Groups(
[out] IADsMembers **ppGroups
);

Parâmetros
[out] ppGroups

Ponteiro para um ponteiro para a interface IADsMembers em um objeto members que


pode ser enumerado usando IEnumVARIANT para determinar os grupos aos quais esse
usuário final pertence.

Valor retornado
Esse método dá suporte aos valores de retorno padrão, incluindo S_OK. Para obter
outros valores retornados, consulte Códigos de erro ADSI.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll
Confira também
Códigos de erro ADSI

IADsMembers

Iadsuser

Métodos da propriedade IADsUser

IEnumVARIANT

Comentários
Esta página foi útil?  Yes  No
Método IADsUser::SetPassword (iads.h)
Artigo24/08/2023

O método IADsUser::SetPassword define a senha do usuário como um valor


especificado. Para o provedor LDAP, a conta de usuário deve ter sido criada e
armazenada no diretório subjacente usando IADs::SetInfo antes de
IADsUser::SetPassword ser chamado.

No entanto, o provedor WinNT permite que você defina a senha em um objeto de


usuário recém-criado antes de chamar SetInfo. Isso garante que você crie senhas que
estejam em conformidade com a política de senha do sistema antes de criar a conta de
usuário.

Sintaxe
C++

HRESULT SetPassword(
BSTR NewPassword
);

Parâmetros
NewPassword

Um BSTR que contém a nova senha.

Valor retornado
Esse método dá suporte aos valores retornados padrão, incluindo S_OK. Para outros
valores retornados, consulte Códigos de erro ADSI.

Comentários
O provedor LDAP para Active Directory usa um dos três processos para definir a senha;
Diretórios LDAP de terceiros, como iPlanet, não usam esse processo de autenticação de
senha. O método pode variar de acordo com a configuração de rede. As tentativas de
definir a senha ocorrem na seguinte ordem:
Primeiro, o provedor LDAP tenta usar o LDAP em uma conexão SSL de 128 bits.
Para que o LDAP SSL opere com êxito, o servidor LDAP deve ter o certificado de
autenticação de servidor apropriado instalado e os clientes que executam o código
ADSI devem confiar na autoridade que emitiu esses certificados. O servidor e o
cliente devem dar suporte à criptografia de 128 bits.
Em segundo lugar, se a conexão SSL não for bem-sucedida, o provedor LDAP
tentará usar Kerberos.
Em terceiro lugar, se Kerberos não for bem-sucedido, o provedor LDAP tentará
uma chamada à API NetUserSetInfo . Em versões anteriores, ADSI chamou
NetUserSetInfo no contexto de segurança no qual o thread estava em execução e
não o contexto de segurança especificado na chamada para
IADsOpenDSObject::OpenDSObject ou ADsOpenObject. Em versões posteriores,
isso foi alterado para que o provedor LDAP ADSI representasse o usuário
especificado na chamada OpenDSObject quando chama NetUserSetInfo.

No Active Directory, o chamador deve ter o direito de acesso de controle estendido


Redefinir Senha para definir a senha com esse método.

Exemplos
O exemplo de código a seguir mostra como definir a senha do usuário, se você tiver
permissão para fazer isso.

VB

Dim usr As IADsUser


Dim szPassword As String
On Error GoTo Cleanup

' Add code to securely get the password.

Set usr = GetObject("LDAP://MyLdapSvr/CN=JeffSmith,DC=Fabrikam")


usr.SetPassword szPassword

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set usr = Nothing

O exemplo de código a seguir mostra como definir a senha do usuário, se você tiver
permissão para fazer isso.

C++
HRESULT SetPassword(IADsUser *pUser, BSTR password)
{
HRESULT hr=S_OK;
if(!pUser) { return E_FAIL;}
hr = pUser->SetPassword(password);
if (hr == S_OK) printf("User password has been set");
pUser->Release();
return hr;
}

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

IADs::SetInfo

IADsMembers

IADsServiceOperations

Iadsuser

Métodos de propriedade IADsUser

NetUserSetInfo

Comentários
Esta página foi útil?
 Yes  No
Interfaces de objeto dinâmico
Artigo • 03/06/2023

Esta seção descreve as seguintes interfaces de objeto dinâmico:

IADsComputerOperations
IADsFileServiceOperations
IADsPrintJobOperations
IADsPrintQueueOperations
IADsResource
IADsServiceOperations
IADsSession

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interface IADsComputerOperations
(iads.h)
Artigo24/08/2023

A interface IADsComputerOperations é uma interface dupla herdada de IADs. Ele expõe


métodos para recuperar o status de um computador em uma rede e habilitar o
desligamento remoto. Os provedores de serviços de diretório podem optar por
implementar essa interface para dar suporte à administração básica do sistema em uma
rede por meio do ADSI.

Herança
A interface IADsComputerOperations herda de IDispatch e IADs.
IADsComputerOperations também tem esses tipos de membros:

Métodos
A interface IADsComputerOperations tem esses métodos.

IADsComputerOperations::Shutdown

O método IADsComputerOperations::Shutdown faz com que um computador sob controle ADSI


execute a operação de desligamento com uma reinicialização opcional.

IADsComputerOperations::Status

O método IADsComputerOperations::Status recupera o status de um computador.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h
Confira também
Iads

IADsComputer

IDispatch

Comentários
Esta página foi útil?  Yes  No
Método
IADsComputerOperations::Shutdown
(iads.h)
Artigo24/08/2023

O método IADsComputerOperations::Shutdown faz com que um computador sob


controle ADSI execute a operação de desligamento com uma reinicialização opcional.

Sintaxe
C++

HRESULT Shutdown(
[in] VARIANT_BOOL bReboot
);

Parâmetros
[in] bReboot

Se TRUE, reinicie o computador após a conclusão do desligamento.

Valor retornado
Esse método dá suporte aos valores retornados padrão, bem como o seguinte:

Para outros valores retornados, consulte Códigos de erro ADSI.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h
DLL Activeds.dll

Confira também
IADsComputer

IADsComputerOperations

Comentários
Esta página foi útil?  Yes  No
Método
IADsComputerOperations::Status
(iads.h)
Artigo24/08/2023

O método IADsComputerOperations::Status recupera o status de um computador.

Sintaxe
C++

HRESULT Status(
[out] IDispatch **ppObject
);

Parâmetros
[out] ppObject

Ponteiro para uma interface IDispatch que relata o código status das operações do
computador. O código status é específico do provedor.

Valor retornado
Esse método dá suporte aos valores retornados padrão, bem como aos seguintes:

Para obter outros valores retornados, consulte Códigos de erro ADSI.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h
DLL Activeds.dll

Confira também
IADsComputer

IADsComputerOperations

IDispatch

Comentários
Esta página foi útil?  Yes  No
Interface IADsFileServiceOperations
(iads.h)
Artigo24/08/2023

A interface IADsFileServiceOperations é uma interface dupla que herda de


IADsServiceOperations. Ele estende a funcionalidade, conforme exposto na interface
IADsServiceOperations , para gerenciar o serviço de arquivos em uma rede.
Especificamente, ele serve para manter e gerenciar recursos abertos e sessões ativas do
serviço de arquivo.

Herança
A interface IADsFileServiceOperations herda de IDispatch, IADs e
IADsServiceOperations. IADsFileServiceOperations também tem estes tipos de
membros:

Métodos
A interface IADsFileServiceOperations tem esses métodos.

IADsFileServiceOperations::Resources

O método IADsFileServiceOperations::Resources obtém um ponteiro para um ponteiro para a


interface IADsCollection em uma coleção dos objetos de recurso que representam os recursos
abertos atuais neste serviço de arquivo.

IADsFileServiceOperations::Sessions

O método IADsFileServiceOperations::Sessions obtém um ponteiro para um ponteiro para a


interface IADsCollection em uma coleção dos objetos de sessão que representam as sessões
abertas atuais para esse serviço de arquivo.

Comentários
Para associar a um objeto de operações de serviço de arquivo, use a cadeia de
caracteres ADsPath que identifica o serviço "LanmanServer" no computador host,
conforme mostrado no exemplo de código a seguir.
VB

Dim fso As IADsFileServiceOperations


On Error Resume Next

' Replace aDomain with the domain that the computer is located on.
' Replace aComputer with the name of the computer.
Set fso = GetObject("WinNT://aDomain/aComputer/LanmanServer")

Nesse ponto, você pode manipular o objeto de serviço de arquivo como apenas um
objeto de serviço, aplicando qualquer um dos métodos de IADsServiceOperations ao
objeto de serviço de arquivo. Por exemplo, você pode examinar o status operacional do
serviço de arquivo, iniciar ou parar o serviço de arquivo ou alterar sua senha.

No entanto, a interface IADsFileServiceOperations permite que você trabalhe com


recursos abertos e sessões ativas do serviço de arquivo. Veja o exemplo a seguir.

VB

For Each r in fso.Resources


MsgBox r.User
MsgBox r.Path
MsgBox r.LockCount
Next

Para obter mais informações sobre sessões ativas e recursos abertos, consulte
IADsSession e IADsResource.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Iads

IADsFileService
IADsResource

IADsService

IADsServiceOperations

IADsSession

IDispatch

Comentários
Esta página foi útil?  Yes  No
Método
IADsFileServiceOperations::Resources
(iads.h)
Artigo24/08/2023

O método IADsFileServiceOperations::Resources obtém um ponteiro para um ponteiro


para a interface IADsCollection em uma coleção dos objetos de recurso que
representam os recursos abertos atuais neste serviço de arquivo.

Sintaxe
C++

HRESULT Resources(
[out] IADsCollection **ppResources
);

Parâmetros
[out] ppResources

Ponteiro para um ponteiro para a interface IADsCollection que pode ser usada para
enumerar objetos implementando a interface IADsResource e representando os
recursos abertos atuais para esse serviço de arquivo.

Valor retornado
Esse método dá suporte aos valores retornados padrão, incluindo S_OK. Para obter mais
informações e outros valores retornados, consulte Códigos de erro ADSI.

Comentários
Os serviços de diretório tradicionais fornecem dados apenas sobre elementos de serviço
de diretório representados no armazenamento de dados subjacente. Os dados sobre
recursos para serviços de arquivos podem não estar disponíveis no repositório de
diretórios subjacente.
Exemplos
O exemplo de código a seguir mostra como enumerar recursos abertos gerenciados por
um serviço de arquivo.

VB

Dim fso As IADsFileServiceOperations


On Error GoTo Cleanup

' Bind to a file service operation on "myComputer"


' in the local domain.
Set fso = GetObject("WinNT://myComputer/LanmanServer")

' Enumerate resources.


For Each resource In fso.Resources
MsgBox "Resource path: " & resource.Path
Next resource

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set fso = Nothing

Para obter um exemplo de código usando o método


IADsFileServiceOperations::Resources , consulte o exemplo de código dado em
IADsResource.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
IADsFileService
IADsFileServiceOperations

IADsResource

Comentários
Esta página foi útil?  Yes  No
Método
IADsFileServiceOperations::Sessions
(iads.h)
Artigo24/08/2023

O método IADsFileServiceOperations::Sessions obtém um ponteiro para um ponteiro


para a interface IADsCollection em uma coleção dos objetos de sessão que representam
as sessões abertas atuais para esse serviço de arquivo.

Sintaxe
C++

HRESULT Sessions(
[out] IADsCollection **ppSessions
);

Parâmetros
[out] ppSessions

Ponteiro para um ponteiro para a interface IADsCollection usada para enumerar objetos
que implementam a interface IADsSession e representam as sessões abertas atuais para
esse serviço de arquivo.

Valor retornado
Esse método dá suporte aos valores retornados padrão, incluindo S_OK. Para obter mais
informações e outros valores retornados, consulte Códigos de erro ADSI.

Comentários
Os serviços de diretório tradicionais fornecem dados apenas sobre elementos de serviço
de diretório representados no armazenamento de dados subjacente. Os dados sobre
sessões para serviços de arquivos podem não estar disponíveis no repositório
subjacente.
Exemplos
O exemplo de código a seguir mostra como enumerar sessões ativas gerenciadas por
um serviço de arquivo.

VB

Dim fso As IADsFileServiceOperations


On Error GoTo Cleanup

' Bind to a file service operation on "myComputer"


' in the local domain.
Set fso = GetObject("WinNT://myComputer/LanmanServer")

' Enumerate sessions.


For Each session In fso.sessions
MsgBox "Session name: " & session.Name
Next session

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set fso = Nothing

Para obter um exemplo de código usando a interface


IADsFileServiceOperations::Sessions , consulte o exemplo de código dado em
IADsSession.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
IADsCollection
IADsFileService

IADsFileServiceOperations

IADsSession

Comentários
Esta página foi útil?  Yes  No
Interface IADsPrintJobOperations
(iads.h)
Artigo24/08/2023

A interface IADsPrintJobOperations é uma interface dupla que herda de IADs. Ele é


usado para controlar um trabalho de impressão em uma rede. Um objeto de trabalho
de impressão que implementa a interface IADsPrintJob também dará suporte aos
seguintes recursos para esta interface:

Para examinar a status operacional e outras informações.


Para interromper um trabalho de impressão em execução.
Para retomar um trabalho de impressão em pausa.

Herança
A interface IADsPrintJobOperations herda de IDispatch e IADs. IADsPrintJobOperations
também tem estes tipos de membros:

Métodos
A interface IADsPrintJobOperations tem esses métodos.

IADsPrintJobOperations::P ause

O método IADsPrintJobOperations::P ause interrompe o processamento do trabalho de impressão


atual. Chame o método IADsPrintJobOperations::Resume para continuar o processamento.

IADsPrintJobOperations::Resume

O método IADsPrintJobOperations::Resume continua o trabalho de impressão interrompido pelo


método IADsPrintJobOperations::P ause.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008


Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Iads

IADsPrintJob

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos da propriedade
IADsPrintJobOperations
Artigo • 12/06/2023

Os métodos de propriedade da interface IADsPrintJobOperations leem e gravam as


propriedades listadas na tabela a seguir. Para obter mais informações sobre métodos de
propriedade, consulte Métodos de propriedade de interface.

Propriedades
PagesPrinted

Contém o número de páginas impressas.

Tipo de acesso: Somente leitura

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_PagesPrinted(
[out] LONG* plPagesPrinted
);

Posição

Contém a posição desse trabalho de impressão na fila de impressão.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_Position(
[out] LONG* plPosition
);
HRESULT put_Position(
[in] LONG lPosition
);

Status
Contém a status atual do trabalho de impressão, conforme indicado por um dos valores
de Constantes de Status do Trabalho de Impressão ADSI.

Tipo de acesso: Somente leitura

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_Status(
[out] LONG* plStatus
);

TimeElapsed

Contém o número de milissegundos decorridos desde que o trabalho de impressão foi


iniciado.

Tipo de acesso: Somente leitura

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_TimeElapsed(
[out] LONG* plTimeElapsed
);

Exemplos
O exemplo de código a seguir mostra como as propriedades de
IADsPrintJobOperations podem ser usadas .

VB

Dim pqo As IADsPrintQueueOperations


Dim pjo As IADsPrintJobOperations

On Error GoTo Cleanup

Set pqo = GetObject("WinNT://aMachine/aPrinter")


For Each pj In pqo.PrintJobs
Set pjo = pj
MsgBox pjo.PagesPrinted & " pages printed for job " & pj.Name
If (pjo.position > 1) Then
pjo.Position = pjo.status - 1
End If
Next

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set pqo = Nothing
Set pjo = Nothing

Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsPrintJobOperations é definido como 32FB6780-1ED0-11CF-


A988-00AA006BC149

Confira também
IADsPrintJob

IADsPrintJobOperations

IADsPrintQueue

Constantes de status do trabalho de impressão ADSI

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Método IADsPrintJobOperations::P ause
(iads.h)
Artigo24/08/2023

O método IADsPrintJobOperations::P ause interrompe o processamento do trabalho de


impressão atual. Chame o método IADsPrintJobOperations::Resume para continuar o
processamento.

Sintaxe
C++

HRESULT Pause();

Valor retornado
Esse método dá suporte a valores retornados padrão. Para outros valores retornados,
consulte Códigos de erro ADSI.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
IADsPrintJobOperations

IADsPrintJobOperations::Resume
Comentários
Esta página foi útil?  Yes  No
Método
IADsPrintJobOperations::Resume
(iads.h)
Artigo24/08/2023

O método IADsPrintJobOperations::Resume continua o trabalho de impressão


interrompido pelo método IADsPrintJobOperations::P ause .

Sintaxe
C++

HRESULT Resume();

Valor retornado
Esse método dá suporte aos valores retornados padrão. Para obter mais informações
sobre outros valores retornados, consulte Códigos de erro ADSI.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
IADsPrintJobOperations

IADsPrintJobOperations::P ause
Comentários
Esta página foi útil?  Yes  No
Interface IADsPrintQueueOperations
(iads.h)
Artigo14/03/2023

A interface IADsPrintQueueOperations é uma interface dupla que herda de IADs. Ele é


usado para controlar uma impressora de uma rede.

A interface IADsPrintQueueOperations dá suporte às seguintes operações:

Recupere todos os trabalhos de impressão enviados para a fila de impressão.


Suspender a operação de fila de impressão.
Retome a operação da fila de impressão.
Remova todos os trabalhos de impressão da fila de impressão.

Herança
A interface IADsPrintQueueOperations herda de IDispatch e IADs.
IADsPrintQueueOperations também tem estes tipos de membros:

Métodos
A interface IADsPrintQueueOperations tem esses métodos.

IADsPrintQueueOperations::P ause

O método IADsPrintQueueOperations::P ause suspende o processamento de trabalhos de


impressão em um serviço de fila de impressão.

IADsPrintQueueOperations::P rintJobs

O método IADsPrintQueueOperations::P rintJobs obtém um ponteiro de interface IADsCollection


na coleção dos trabalhos de impressão processados nessa fila de impressão.

IADsPrintQueueOperations::P urge

O método IADsPrintQueueOperations::P urge limpa a fila de impressão de todos os trabalhos de


impressão sem processá-los.

IADsPrintQueueOperations::Resume
O método IADsPrintQueueOperations::Resume retoma o processamento de trabalhos de
impressão suspensos na fila de impressão.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Iads

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos de propriedade
IADsPrintQueueOperations
Artigo • 03/06/2023

Os métodos de propriedade da interface IADsPrintQueueOperations leem e gravam as


propriedades listadas na lista a seguir. Para obter mais informações sobre métodos de
propriedade, consulte Métodos de Propriedade de Interface.

Propriedades
Status

Status atual das operações de fila de impressão. Os valores válidos do código de status
são listados na lista a seguir.

ADS_PRINTER_PAUSED (0x00000001)

ADS_PRINTER_PENDING_DELETION (0x00000002)

ADS_PRINTER_ERROR (0x00000003)

ADS_PRINTER_PAPER_JAM (0x00000004)

ADS_PRINTER_PAPER_OUT (0x00000005)

ADS_PRINTER_MANUAL_FEED (0x00000006)

ADS_PRINTER_PAPER_PROBLEM (0x00000007)

ADS_PRINTER_OFFLINE (0x00000008)

ADS_PRINTER_IO_ACTIVE (0x00000100)

ADS_PRINTER_BUSY (0x00000200)

ADS_PRINTER_PRINTING (0x00000400)

ADS_PRINTER_OUTPUT_BIN_FULL (0x00000800)

ADS_PRINTER_NOT_AVAILABLE (0x00001000)

ADS_PRINTER_WAITING (0x00002000)

ADS_PRINTER_PROCESSING (0x00004000)
ADS_PRINTER_INITIALIZING (0x00008000)

ADS_PRINTER_WARMING_UP (0x00010000)

ADS_PRINTER_TONER_LOW (0x00020000)

ADS_PRINTER_NO_TONER (0x00040000)

ADS_PRINTER_PAGE_PUNT (0x00080000)

ADS_PRINTER_USER_INTERVENTION (0x00100000)

ADS_PRINTER_OUT_OF_MEMORY (0x00200000)

ADS_PRINTER_DOOR_OPEN (0x00400000)

ADS_PRINTER_SERVER_UNKNOWN (0x00800000)

ADS_PRINTER_POWER_SAVE (0x01000000)

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_Name(
[out] LONG* pbstrName
);
HRESULT put_Name(
[in] LONG bstrName
);

Exemplos
O exemplo de código Visual Basic a seguir verifica se uma impressora está bloqueada.

VB

Dim pqo As IADsPrintQueueOperations


Set pqo = GetObject("WinNT://aMachine/aPrinter")
If pqo.Status = ADS_PRINTER_PAPER_JAM Then
MsgBox "Your printer is jammed."
End If

O exemplo de código C++ a seguir verifica se uma impressora está bloqueada.


C++

IADsPrintQueueOperations *pqo;
HRESULT hr = ADsGetObject(L"WinNT://aMachine/aPrinter",
IID_IADsPrintQueueOperations,
(void**)&pqo)
long status;
hr = pqo->get_Status(&status);
if(status = ADS_PRINTER_PAPER_JAM) {
printf("Your printer is jammed.\n");
}
hr = pqo->Release();

Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsPrintQueueOperations é definido como 124BE5C0-156E-11CF-


A986-00AA006BC149

Confira também
IADsPrintQueue

IADsPrintQueueOperations

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Método IADsPrintQueueOperations::P
ause (iads.h)
Artigo24/08/2023

O método IADsPrintQueueOperations::P ause suspende o processamento de trabalhos


de impressão em um serviço de fila de impressão.

Sintaxe
C++

HRESULT Pause();

Valor retornado
Esse método dá suporte aos valores retornados padrão. Para obter mais informações
sobre outros valores retornados, consulte Os Códigos de Erro ADSI.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
IADsPrintQueueOperations

IADsPrintQueueOperations::Resume
Comentários
Esta página foi útil?  Yes  No
Método IADsPrintQueueOperations::P
rintJobs (iads.h)
Artigo24/08/2023

O método IADsPrintQueueOperations::P rintJobs obtém um ponteiro de interface


IADsCollection na coleção dos trabalhos de impressão processados nessa fila de
impressão. Essa coleção pode ser enumerada usando os métodos de enumeração de
Automação padrão em IEnumVARIANT. Para excluir um trabalho de impressão, use o
método IADsCollection::Remove no ponteiro da interface recuperada.

Sintaxe
C++

HRESULT PrintJobs(
[out] IADsCollection **pObject
);

Parâmetros
[out] pObject

Ponteiro para um ponteiro para a interface IADsCollection na coleção de objetos


adicionados a essa fila de impressão. Os objetos na coleção implementam a interface
IADsPrintJob .

Valor retornado
Esse método dá suporte aos valores retornados padrão. Para obter mais informações
sobre outros valores retornados, consulte Os Códigos de Erro ADSI.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008


Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
ADsEnumerateNext

IADsCollection

IADsCollection::Remove

IADsPrintJob

Métodos da propriedade IADsPrintJob

IADsPrintQueueOperations

IEnumVARIANT

Comentários
Esta página foi útil?  Yes  No
Método IADsPrintQueueOperations::P
urge (iads.h)
Artigo24/08/2023

O método IADsPrintQueueOperations::P urge limpa a fila de impressão de todos os


trabalhos de impressão sem processá-los.

Sintaxe
C++

HRESULT Purge();

Valor retornado
Esse método dá suporte aos valores de retorno padrão. Para obter mais informações
sobre outros valores retornados, consulte Os Códigos de Erro ADSI.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
IADsPrintQueueOperations

Comentários
Esta página foi útil?  Yes  No
Método
IADsPrintQueueOperations::Resume
(iads.h)
Artigo24/08/2023

O método IADsPrintQueueOperations::Resume retoma o processamento de trabalhos


de impressão suspensos na fila de impressão.

Sintaxe
C++

HRESULT Resume();

Valor retornado
Esse método dá suporte aos valores de retorno padrão. Para obter mais informações
sobre outros valores retornados, consulte Os Códigos de Erro ADSI.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
IADsPrintQueueOperations

IADsPrintQueueOperations::P ause
Comentários
Esta página foi útil?  Yes  No
Interface IADsResource (iads.h)
Artigo24/08/2023

A interface IADsResource é uma interface dupla que herda de IADs. Ele foi projetado
para gerenciar um recurso aberto para um serviço de arquivos em uma rede.

Herança
A interface IADsResource herda de IDispatch e IADs. IADsResource também tem estes
tipos de membros:

Comentários
Quando um usuário remoto abre uma pasta ou uma subpasta em um ponto de
compartilhamento público no computador de destino, o ADSI considera essa pasta um
recurso aberto e a representa com um objeto de recurso que implementa essa interface.

Exemplos
O exemplo de código a seguir mostra como obter a coleção de objetos de recurso de
um objeto de operações de serviço de arquivo.

VB

Dim fso as IADsFileServiceOperations


Dim rs as IADsCollection
On Error GoTo Cleanup

Set fso = GetObject("WinNT://myHost/LanmanServer")


Set rs = fso.Resources

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set rso = Nothing
Set rs = Nothing

Requisitos
Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Comentários
Esta página foi útil?  Yes  No
Métodos da propriedade IADsResource
Artigo • 12/06/2023

Os métodos de propriedade da interface IADsResource obtêm ou definem as


propriedades descritas na tabela a seguir. Para obter uma discussão geral sobre
métodos de propriedade, consulte Métodos de propriedade de interface.

Propriedades
LockCount

Número de bloqueios no recurso.

Tipo de acesso: Somente leitura

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_LockCount(
[out] LONG* plLockCount
);

Caminho

O caminho do sistema de arquivos do recurso aberto.

Tipo de acesso: Somente leitura

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Path(
[out] BSTR* pbstrPath
);

Usuário

O nome do usuário que abriu o recurso.

Tipo de acesso: Somente leitura


Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_User(
[out] BSTR* pbstrUser
);

UserPath

O ADsPath do objeto de usuário para o usuário que abriu o recurso.

Tipo de acesso: Somente leitura

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_UserPath(
[out] BSTR* pbstrUserPath
);

Exemplos
O exemplo de código a seguir mostra como examinar os recursos abertos de um serviço
de arquivo.

VB

Dim fso As IADsFileServiceOperations


' Bind to a file service operations object on "myComputer" in the local
domain.
Set fso = GetObject("WinNT://myComputer/LanmanServer")

' Enumerate resources.


If (IsEmpty(fso) = False) Then
For Each resource In fso.resources
MsgBox "Resource name: " & resource.name
MsgBox "Resource path: " & resource.path
Next resource
End If

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set fso = Nothing

O exemplo de código a seguir enumera uma coleção de recursos.

C++

IADsFileServiceOperations *pFso = NULL;


IADsResource *pRes = NULL;
IADsCollection *pColl = NULL;
IUnknown *pUnk = NULL;
IEnumVARIANT *pEnum = NULL;
BSTR bstr = NULL;
VARIANT var;
ULONG lFetch = 0;
IDispatch *pDisp = NULL;
HRESULT hr = S_OK;

LPWSTR adsPath =L"WinNT://aMachine/LanmanServer";


hr = ADsGetObject(adsPath, IID_IADsFileServiceOperations,(void**)&pFso);
if(FAILED(hr)) {goto Cleanup;}

hr = pFso->Resources(&pColl);
if(FAILED(hr)) {goto Cleanup;}

// Enumerate print jobs. Code omitted.


hr = pColl->get__NewEnum(&pUnk);
if(FAILED(hr)) {goto Cleanup;}

hr = pUnk->QueryInterface(IID_IEnumVARIANT,(void**)&pEnum);
if(FAILED(hr)) {goto Cleanup;}

// Enumerate.
VariantInit(&var);
hr = pEnum->Next(1, &var, &lFetch);
while(hr == S_OK)
{
if (lFetch == 1)
{
pDisp = V_DISPATCH(&var);
pDisp->QueryInterface(IID_IADsResource, (void**)&pRes);
pRes->get_Name(&bstr);
printf("Resource name: %S\n",bstr);
SysFreeString(bstr);
pRes->get_Path(&bstr);
printf("Resource path: %S\n",bstr);
SysFreeString(bstr);
pRes->Release();
}
pDisp->Release();
VariantClear(&var);
hr = pEnum->Next(1, &var, &lFetch);
};

Cleanup:
if(pRes) pRes->Release();
if(pDisp) pDisp->Release();
if(pEnum) pEnum->Release();
if(pUnk) pUnk->Release();
if(pColl) pColl->Release();
if(pFso) pFso->Release();

Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsResource é definido como 34A05B20-4AAB-11CF-AE2C-


00AA006EBFB9

Confira também
IADsResource

IADsFileServiceOperations::Resources

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interface IADsServiceOperations (iads.h)
Artigo14/03/2023

A interface IADsServiceOperations é uma interface dupla que herda de IADs. Ele foi
projetado para gerenciar serviços do sistema instalados em um computador. Você pode
usar essa interface para iniciar, pausar e parar um serviço do sistema, alterar a senha e
examinar a status de um determinado serviço em uma rede.

Dos serviços do sistema e suas operações, o serviço de arquivos e as operações de


serviço de arquivo são um caso especial. Eles são representados e gerenciados por
IADsFileService e IADsFileServiceOperations.

Herança
A interface IADsServiceOperations herda de IDispatch e IADs. IADsServiceOperations
também tem estes tipos de membros:

Métodos
A interface IADsServiceOperations tem esses métodos.

IADsServiceOperations::Continue

O método IADsServiceOperations::Continue retoma uma operação de serviço pausada pelo


método IADsServiceOperations::P ause.

IADsServiceOperations::P ause

O método IADsServiceOperations::P ause pausa um serviço iniciado com o método


IADsServiceOperations::Start.

IADsServiceOperations::SetPassword

O método IADsServiceOperations::SetPassword define a senha da conta usada pelo gerenciador


de serviços. Esse método é chamado quando o contexto de segurança para esse serviço é criado.

IADsServiceOperations::Start

O método IADsServiceOperations::Start inicia um serviço de rede.

IADsServiceOperations::Stop
O método IADsServiceOperations::Stop interrompe um serviço de rede ativo no momento.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Iads

IADsFileService

IADsFileServiceOperations

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos da propriedade
IADsServiceOperations
Artigo • 12/06/2023

Os métodos de propriedade da interface IADsServiceOperations leem e gravam as


propriedades descritas na lista a seguir. Para obter mais informações sobre métodos de
propriedade, consulte Métodos de propriedade de interface.

Propriedades
Status

Status do serviço.

Veja a seguir os valores possíveis.

ADS_SERVICE_STOPPED (0x00000001)

ADS_SERVICE_START_PENDING (0x00000002)

ADS_SERVICE_STOP_PENDING (0x00000003)

ADS_SERVICE_RUNNING (0x00000004)

ADS_SERVICE_CONTINUE_PENDING (0x00000005)

ADS_SERVICE_PAUSE_PENDING (0x00000006)

ADS_SERVICE_PAUSED (0x00000007)

ADS_SERVICE_ERROR (0x00000008)

ADS_SERVICE_OWN_PROCESS (0x00000010)

ADS_SERVICE_SHARE_PROCESS (0x00000020)

ADS_SERVICE_KERNEL_DRIVER (0x00000001)

ADS_SERVICE_FILE_SYSTEM_DRIVER (0x00000002)

ADS_SERVICE_BOOT_START (SERVICE_BOOT_START)

ADS_SERVICE_SYSTEM_START (SERVICE_SYSTEM_START)

ADS_SERVICE_AUTO_START (SERVICE_AUTO_START)
ADS_SERVICE_DEMAND_START (SERVICE_DEMAND_START)

ADS_SERVICE_DISABLED (SERVICE_DISABLED)

ADS_SERVICE_ERROR_IGNORE (0)

ADS_SERVICE_ERROR_NORMAL (1)

ADS_SERVICE_ERROR_SEVERE (2)

ADS_SERVICE_ERROR_CRITICAL (3)

Tipo de acesso: Somente leitura

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_Status(
[out] LONG* pstatus
);

Exemplos
O exemplo de código a seguir mostra como verificar o status de um Serviço de Fax da
Microsoft em execução no Windows 2000.

VB

Dim cp As IADsComputer
Dim sr As IADsService
Dim so As IADsServiceOperations
On Error GoTo Cleanup

Set cp = GetObject("WinNT://myMachine,computer")
Set sr = cp.GetObject("Service", "Fax")
Set so = sr

Select Case so.Status


Case ADS_SERVICE_STOPPED
MsgBox "Microsoft Fax Service has stopped."
Case ADS_SERVICE_RUNNING
MsgBox "Microsoft Fax Service is running."
Case ADS_SERVICE_PAUSED
MsgBox "Microsoft Fax Service has paused."
Case ADS_SERVICE_ERROR
MsgBox "Microsoft Fax Service has errors."
End Select
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set cp = Nothing
Set sr = Nothing
Set so = Nothing

O exemplo de código a seguir verifica o status de um Serviço de Fax da Microsoft em


execução no Windows 2000.

C++

IADsContainer *pCont = NULL;


IADsServiceOperations *pSrvOp = NULL;
LPWSTR adsPath = L"WinNT://myMachine,computer";
IDispatch *pDisp = NULL;
long status = 0;

HRESULT hr = S_OK;

hr = ADsGetObject(adsPath,IID_IADsContainer,(void**)&pCont);
if(FAILED(hr)) {goto Cleanup;}

hr = pCont->GetObject(CComBSTR("Service"), CComBSTR("Fax"), &pDisp);


if(FAILED(hr)) {goto Cleanup;}

hr = pDisp->QueryInterface(IID_IADsServiceOperations,(void**)&pSrvOp);
if(FAILED(hr)) {goto Cleanup;}

hr = pSrvOp->get_Status(&status);
switch (status)
{
case ADS_SERVICE_STOPPED:
printf("The service has stopped.\n");
break;
case ADS_SERVICE_RUNNING:
printf("The service is running.\n");
break;
case ADS_SERVICE_PAUSED:
printf("The service has paused.\n");
break;
case ADS_SERVICE_ERROR:
printf("The service has errors.\n");
break;
}

Cleanup:
if(pDisp) pDisp->Release();
if(pCont) pCont->Release();
if(pSrvOp) pSrvOp->Release();
Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsServiceOperations é definido como 5D7B33F0-31CA-11CF-


A98A-00AA006BC149

Confira também
IADsFileService

IADsFileServiceOperations

IADsService

IADsServiceOperations

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Método
IADsServiceOperations::Continue
(iads.h)
Artigo24/08/2023

O método IADsServiceOperations::Continue retoma uma operação de serviço pausada


pelo método IADsServiceOperations::P ause .

Sintaxe
C++

HRESULT Continue();

Valor retornado
Esse método dá suporte aos valores de retorno padrão, incluindo S_OK. Para obter mais
informações sobre outros valores retornados, consulte Códigos de erro ADSI.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
IADsService

IADsServiceOperations
IADsServiceOperations::P ause

Comentários
Esta página foi útil?  Yes  No
Método IADsServiceOperations::P ause
(iads.h)
Artigo24/08/2023

O método IADsServiceOperations::P ause pausa um serviço iniciado com o método


IADsServiceOperations::Start .

Sintaxe
C++

HRESULT Pause();

Valor retornado
Esse método dá suporte aos valores retornados padrão, incluindo S_OK. Para obter mais
informações sobre outros valores retornados, consulte Códigos de erro ADSI.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
IADsService

IADsServiceOperations

IADsServiceOperations::Start
Comentários
Esta página foi útil?  Yes  No
Método
IADsServiceOperations::SetPassword
(iads.h)
Artigo24/08/2023

O método IADsServiceOperations::SetPassword define a senha da conta usada pelo


gerenciador de serviços. Esse método é chamado quando o contexto de segurança para
esse serviço é criado.

Sintaxe
C++

HRESULT SetPassword(
[in] BSTR bstrNewPassword
);

Parâmetros
[in] bstrNewPassword

A cadeia de caracteres Unicode terminada em nulo a ser armazenada como a nova


senha.

Valor retornado
Esse método dá suporte aos valores de retorno padrão, incluindo S_OK. Para obter mais
informações sobre outros valores retornados, consulte Códigos de erro ADSI.

Comentários
A propriedade IADsService::get_ServiceAccountName identifica a conta para a qual essa
senha deve ser definida.

Exemplos
O exemplo de código a seguir mostra como definir uma senha para o Serviço de Fax da
Microsoft em execução no Windows 2000.

VB

Dim cp As IADsComputer
Dim so As IADsServiceOperations
Dim s As IADsService
Dim sPass As String

On Error GoTo Cleanup

Set cp = GetObject("WinNT://myMachine,computer")
Set so = cp.GetObject("Service", "Fax")
' Insert code to securely retrieve a new password from the user.
so.SetPassword sPass

Set s = so
MsgBox "The password for " & so.name & " has been changed on "_
& s.ServiceAccountName

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set cp = Nothing
Set so = Nothing
Set s = Nothing

O exemplo de código a seguir mostra como definir uma senha para o Serviço de Fax da
Microsoft em execução no Windows 2000.

C++

HRESULT SetServicePassword(LPCWSTR pwszADsPath, LPCWSTR, pwszPasword)


{
IADsContainer *pCont = NULL;
IADsServiceOperations *pSrvOp = NULL;
IDispatch *pDisp = NULL;
HRESULT hr = S_OK;

hr = ADsGetObject(pwszADsPath, IID_IADsContainer, (void**)&pCont);


if(FAILED(hr))
{
goto Cleanup;
}

hr = pCont->GetObject(CComBSTR("Service"), CComBSTR("Fax"), &pDisp);


if(FAILED(hr))
{
goto Cleanup;
}

hr = pDisp->QueryInterface(IID_IADsServiceOperations, (void**)&pSrvOp);
if(FAILED(hr))
{
goto Cleanup;
}

// Insert code to securely retrieve the password from the user.


hr = pSrvOp->SetPassword(CComBSTR(pwszPassword));

Cleanup:
if(pDisp)
{
pDisp->Release();
}
if(pCont)
{
pCont->Release();
}
if(pSrvOp)
{
pSrvOp->Release();
}
}

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
IADsService

IADsService::get_ServiceAccountName

IADsServiceOperations
Comentários
Esta página foi útil?  Yes  No
Método IADsServiceOperations::Start
(iads.h)
Artigo24/08/2023

O método IADsServiceOperations::Start inicia um serviço de rede.

Sintaxe
C++

HRESULT Start();

Valor retornado
Esse método dá suporte aos valores de retorno padrão, incluindo S_OK. Para obter mais
informações sobre outros valores retornados, consulte Códigos de erro ADSI.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
IADsService

IADsServiceOperations

Comentários
Esta página foi útil?  Yes  No
Método IADsServiceOperations::Stop
(iads.h)
Artigo24/08/2023

O método IADsServiceOperations::Stop interrompe um serviço de rede ativo no


momento.

Sintaxe
C++

HRESULT Stop();

Valor retornado
Esse método dá suporte a valores retornados padrão, incluindo S_OK. Para obter mais
informações sobre outros valores retornados, consulte Códigos de erro ADSI.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
IADsService

IADsServiceOperations
Comentários
Esta página foi útil?  Yes  No
Interface IADsSession (iads.h)
Artigo24/08/2023

A interface IADsSession é uma interface dupla que herda de IADs. Ele foi projetado para
representar uma sessão ativa para o serviço de arquivos em uma rede.

Herança
A interface IADsSession herda de IDispatch e IADs. IADsSession também tem estes
tipos de membros:

Comentários
Quando um usuário remoto abre recursos em um computador de destino, uma sessão
ativa é estabelecida entre o usuário remoto e esse computador. Muitos recursos podem
ser abertos em uma única sessão ativa. ADSI representa esse processo com um objeto
de sessão que implementa essa interface.

Chame os métodos dessa interface para examinar dados específicos da sessão, por
exemplo, quem está usando a sessão, qual computador é usado e o tempo decorrido
para a sessão atual.

As sessões são gerenciadas pelo serviço de arquivo. Para obter objetos de sessão,
primeiro associe a esse serviço ("LanmanServer" ou "FPNW").

Exemplos

O exemplo de código a seguir mostra como associar a uma sessão.

VB

Dim fso as IADsFileServiceOperations


Dim ss as IADsCollection

On Error GoTo Cleanup

Set fso = GetObject("WinNT://myComputer/LanmanServer")


Set ss = fso.Sessions

' Insert code to access session data.

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set fso = Nothing
Set ss = Nothing

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Comentários
Esta página foi útil?  Yes  No
Métodos de propriedade IADsSession
Artigo • 03/06/2023

Os métodos de propriedade da interface IADsSession obtêm ou definem as


propriedades descritas na tabela a seguir. Para obter mais informações e uma discussão
geral sobre métodos de propriedade, consulte Métodos de Propriedade de Interface.

Propriedades
Computador

Nome da estação de trabalho do cliente.

Tipo de acesso: Somente leitura

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Computer(
[out] BSTR* pbstrComputer
);

ComputerPath

ADsPath do objeto de computador para a estação de trabalho do cliente.

Tipo de acesso: Somente leitura

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_ComputerPath(
[out] BSTR* pbstrComputerPath
);

ConnectTime

Tempo decorrido, em segundos, desde que a sessão foi iniciada.

Tipo de acesso: Somente leitura


Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_ConnectTime(
[out] LONG* plConnectTime
);

IdleTime

Tempo ocioso, em segundos, da sessão.

Tipo de acesso: Somente leitura

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_IdleTime(
[out] LONG* plIdleTime
);

Usuário

O nome do usuário da sessão.

Tipo de acesso: Somente leitura

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_User(
[out] BSTR* pbstrUser
);

UserPath

O ADsPath do objeto de usuário para o usuário desta sessão.

Tipo de acesso: Somente leitura

Tipo de dados de script: BSTR

syntax
// C++ method syntax
HRESULT get_UserPath(
[out] BSTR* pbstrUserPath
);

Exemplos
O exemplo de código a seguir mostra como examinar sessões para um serviço de
arquivo.

VB

Dim fso As IADsFileServiceOperations


On Error GoTo Cleanup

' Bind to a file service operations object on "myComputer" in the local


domain.
Set fso = GetObject("WinNT://myComputer/LanmanServer")

' Enumerate sessions.


If (IsEmpty(fso) = False) Then
For Each session In fso.sessions
MsgBox "Session Computer: " & session.Computer
MsgBox "Session User: " & session.User
Next Session
End If

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set fso = Nothing

O exemplo de código a seguir enumera uma coleção de sessões.

C++

IADsFileServiceOperations *pFso = NULL;


IADsSession *pSes = NULL;
IADsCollection *pColl = NULL;
HRESULT hr = S_OK;
IUnknown *pUnk = NULL;
BSTR bstr = NULL;
VARIANT var;
ULONG lFetch = 0;
IDispatch *pDisp = NULL;
IEnumVARIANT *pEnum = NULL;

VariantInit(&var);
LPWSTR adsPath = L"WinNT://aMachine/LanmanServer";

hr = ADsGetObject(adsPath,IID_IADsFileServiceOperations,
(void**)&pFso);

if(FAILED(hr)) {goto Cleanup;}

hr = pFso->Sessions(&pColl);

// Enumerate sessions.
hr = pColl->get__NewEnum(&pUnk);
if(FAILED(hr)) {goto Cleanup;}

hr = pUnk->QueryInterface(IID_IEnumVARIANT,(void**)&pEnum);
if(FAILED(hr)) {goto Cleanup;}

// Enumerate.
hr = pEnum->Next(1, &var, &lFetch);
while(hr == S_OK)
{
if (lFetch == 1)
{
pDisp = V_DISPATCH(&var);
pDisp->QueryInterface(IID_IADsSession, (void**)&pSes);
pSes->get_Computer(&bstr);
printf("Session host: %S\n",bstr);
SysFreeString(bstr);

pSes->get_User(&bstr);
printf("Session user: %S\n",bstr);
SysFreeString(bstr);

pRes->Release();
}

VariantClear(&var);
pDisp=NULL;
hr = pEnum->Next(1, &var, &lFetch);
};

Cleanup:
if(pFso) pFso->Release();
if(pColl) pColl->Release();
if(pUnk) pUnk->Release();
if(pEnum) pEnum->Release();

Requisitos
Requisito Valor
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsSession é definido como 398B7DA0-4AAB-11CF-AE2C-


00AAA006EBFB9

Confira também
IADsFileServiceOperations::Sessions

IADsSession

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interfaces de segurança
Artigo • 03/06/2023

Esta seção descreve as seguintes interfaces de segurança:

IADsAccessControlEntry
IADsAccessControlList
IADsSecurityDescriptor
IADsSecurityUtility

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interface IADsAccessControlEntry
(iads.h)
Artigo14/03/2023

A interface IADsAccessControlEntry é uma interface dupla que permite aos clientes de


diretório acessar e manipular ACEs (entradas de controle de acesso) individuais do
objeto proprietário. Uma ACE estipula quem pode acessar o objeto e que tipo de acesso
concedido e especifica se as configurações de controle de acesso podem ser
propagadas do objeto para qualquer um de seus filhos. Uma ACE expõe um conjunto de
propriedades por meio dessa interface para fornecer esses serviços.

Um objeto pode ter vários ACEs, um para cada cliente ou um grupo de clientes. As ACEs
são mantidas em uma ACL (lista de controle de acesso) que implementa a interface
IADsAccessControlList . Ou seja, um cliente deve usar uma ACL para acessar uma ACE.
Para acessar a ACL, recupere o descritor de segurança do objeto que implementa a
interface IADsSecurityDescriptor . Os procedimentos a seguir descrevem como gerenciar
controles de acesso em um objeto ADSI.

Alguns dos valores da propriedade IADsAccessControlEntry , como AccessMask e


AceFlags, serão diferentes para diferentes tipos de objeto. Por exemplo, um objeto do
Active Directory usará o membro ADS_RIGHT_GENERIC_READ da enumeração
ADS_RIGHTS_ENUM para a propriedade IADsAccessControlEntry.AccessMask , mas o
direito de acesso equivalente para um objeto de arquivo é FILE_GENERIC_READ. Não é
seguro assumir que todos os valores de propriedade serão iguais para objetos do Active
Directory e objetos que não são do Active Directory. Para obter mais informações,
consulte Descritores de segurança em arquivos e chaves do Registro.

Para gerenciar controles de acesso em um objeto ADSI

1. Recupere o descritor de segurança para o objeto que implementa a interface


IADsSecurityDescriptor .
2. Recupere a ACL do descritor de segurança.
3. Trabalhe com o ACE, ou ACEs, do objeto na ACL.

Para definir uma ACE nova ou modificada como persistente

1. Adicione o ACE à ACL.


2. Atribua a ACL ao descritor de segurança.
3. Confirme o descritor de segurança no repositório de diretórios.
Herança
A interface IADsAccessControlEntry herda da interface IDispatch.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
IADsSecurityDescriptor

IAccessControlList

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos da propriedade
IADsAccessControlEntry
Artigo • 12/06/2023

Os métodos de propriedade da interface IADsAccessControlEntry obtêm ou definem as


propriedades descritas na tabela a seguir. Para obter mais informações, consulte
Métodos de propriedade de interface.

Propriedades
AccessMask

Contém um conjunto de sinalizadores que especifica privilégios de acesso para o objeto


. Os valores válidos para objetos do Active Directory são definidos na enumeração
ADS_RIGHTS_ENUM .

Para obter mais informações e uma lista de valores possíveis para objetos de
compartilhamento de arquivo ou arquivo, consulte Segurança de arquivo e direitos de
acesso.

Para obter mais informações e uma lista de valores possíveis para objetos do Registro,
consulte Segurança de Chave do Registro e Direitos de Acesso.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_AccessMask(
[out] LONG* plnAccessMask
);
HRESULT put_AccessMask(
[in] LONG lnAccessMask
);

AceFlags

Contém um conjunto de sinalizadores que especifica se outros contêineres ou objetos


podem herdar o ACE. Os valores válidos para o objeto do Active Directory são definidos
na enumeração ADS_ACEFLAG_ENUM .
Para obter mais informações e valores possíveis para arquivos, compartilhamento de
arquivos e objetos do Registro, consulte o membro AceFlags da estrutura ACE_HEADER
.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_AceFlags(
[out] LONG* plnAceFlags
);
HRESULT put_AceFlags(
[in] LONG lnAceFlags
);

Acetype

Contém um valor que indica o tipo de ACE. Os valores válidos para objetos do Active
Directory são definidos na enumeração ADS_ACETYPE_ENUM .

Para obter mais informações e valores possíveis para arquivos, compartilhamento de


arquivos e objetos do Registro, consulte o membro AceType da estrutura ACE_HEADER
.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_AceType(
[out] LONG* plAceType
);
HRESULT put_AceType(
[in] LONG lnAceType
);

Sinalizadores

Um sinalizador que indica se a ACE tem um tipo de objeto ou tipo de objeto herdado.
Os sinalizadores válidos são definidos na enumeração ADS_FLAGTYPE_ENUM .

Tipo de acesso: leitura/gravação


Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_Flags(
[out] LONG* lnflags
);
HRESULT put_Flags(
[in] LONG lnflags
);

Inheritedobjecttype

Um sinalizador que indica o tipo de um objeto filho de um objeto ADSI. Seu valor é um
GUID para um objeto no formato de cadeia de caracteres. Quando esse GUID é
definido, o ACE aplica-se somente ao objeto referenciado pelo GUID.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_InheritedObjectType(
[out] BSTR* bstrInheritedObjectType
);
HRESULT put_InheritedObjectType(
[in] BSTR bstrInheritedObjectType
);

ObjectType

Um sinalizador que indica o tipo de objeto ADSI. Seu valor é um GUID para uma
propriedade ou um objeto no formato de cadeia de caracteres. O GUID refere-se a uma
propriedade quando ADS_RIGHT_DS_READ_PROP e ADS_RIGHT_DS_WRITE_PROP
máscaras de acesso são usadas. O GUID especifica um objeto quando
ADS_RIGHT_DS_CREATE_CHILD e ADS_RIGHT_DS_DELETE_CHILD máscaras de acesso
são usadas.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax
// C++ method syntax
HRESULT get_ObjectType(
[out] BSTR* bstrObjectType
);
HRESULT put_ObjectType(
[in] BSTR bstrObjectType
);

Administrador

Contém o nome da conta à qual a ACE se aplica.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Trustee(
[out] BSTR* pbstrSecurityId
);
HRESULT put_Trustee(
[in] BSTR bstrSecurityId
);

Exemplos
O exemplo de código a seguir mostra como adicionar entradas a uma ACL discricionária
usando os métodos de propriedade IADsAccessControlEntry .

VB

Dim x As IADs
Dim sd As IADsSecurityDescriptor
Dim ace As IADsAccessControlEntry
Dim Dacl As IADsAccessControlList
Dim Ace1 As New AccessControlEntry
Dim Ace2 As New AccessControlEntry

On Error GoTo Cleanup

Set x = GetObject("LDAP://OU=Sales, DC=Fabrikam,DC=com")


Set sd = x.Get("ntSecurityDescriptor")
Set Dacl = sd.DiscretionaryAcl

' Show the existing ACEs.


For Each ace In Dacl
Debug.Print ace.Trustee
Next

' Setup the first ACE.


Ace1.AccessMask = -1 'Full Permission (Allowed)
Ace1.AceType = ADS_ACETYPE_ACCESS_ALLOWED
Ace1.AceFlags = ADS_ACEFLAG_INHERIT_ACE
Ace1.Trustee = "ACTIVED\Administrator"

' Setup the 2nd ACE.


Ace2.AccessMask = -1 'Full Permission (Denied)
Ace2.AceType = ADS_ACETYPE_ACCESS_DENIED
Ace2.AceFlags = ADS_ACEFLAG_INHERIT_ACE
Ace2.Trustee = "ACTIVED\Andyhar"

' Add the ACEs to the Discretionary ACL.


Dacl.AddAce Ace1
Dacl.AddAce Ace2

sd.DiscretionaryAcl = Dacl
x.Put "ntSecurityDescriptor", Array(sd)
x.SetInfo

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If

Set x = Nothing
Set sd = Nothing
Set ace = Nothing
Set Dacl = Nothing
Set Ace1 = Nothing
Set Ace2 = Nothing
Set obj = Nothing
Set cls = Nothing

O exemplo de código a seguir exibe entradas de controle de acesso.

C++

IADs *pADs = NULL;


IDispatch *pDisp = NULL;
IADsSecurityDescriptor *pSD = NULL;
VARIANT var;
HRESULT hr = S_OK;

VariantInit(&var);

hr = ADsOpenObject(L"LDAP://OU=Sales, DC=Fabrikam,DC=com",NULL,NULL,
ADS_SECURE_AUTHENTICATION, IID_IADs,(void**)&pADs);
if(FAILED(hr)) {goto Cleanup;}
hr = pADs->Get(CComBSTR("ntSecurityDescriptor"),&var);
if(FAILED(hr)) {goto Cleanup;}

pDisp = V_DISPATCH(&var);

hr = pDisp->QueryInterface(IID_IADsSecurityDescriptor,(void**)&pSD);
if(FAILED(hr)) {goto Cleanup;}
pDisp->Release();

pSD->get_DiscretionaryAcl(&pDisp);

hr = pDisp->QueryInterface(IID_IADsAccessControlList,(void**)&pACL);
if(FAILED(hr)) {goto Cleanup;}

hr = DisplayAccessInfo(pSD);
if(FAILED(hr)) {goto Cleanup;}
VariantClear(&var);

Cleanup:
if(pADs) pADs->Release();
if(pDisp) pDisp->Release();
if(pSD) pSD->Release();
return hr;

HRESULT DisplayAccessInfo(IADsSecurityDescriptor *pSD)


{
LPWSTR lpszFunction = L"DisplayAccessInfo";
IDispatch *pDisp = NULL;
IADsAccessControlList *pACL = NULL;
IADsAccessControlEntry *pACE = NULL;
IEnumVARIANT *pEnum = NULL;
IUnknown *pUnk = NULL;
HRESULT hr = S_OK;
ULONG nFetch = 0;
BSTR bstrValue = NULL;
VARIANT var;
LPWSTR lpszOutput = NULL;
LPWSTR lpszMask = NULL;
size_t nLength = 0;

VariantInit(&var);

hr = pSD->get_DiscretionaryAcl(&pDisp);
if(FAILED(hr)){goto Cleanup;}
hr = pDisp->QueryInterface(IID_IADsAccessControlList,(void**)&pACL);
if(FAILED(hr)){goto Cleanup;}

hr = pACL->get__NewEnum(&pUnk);
if(FAILED(hr)){goto Cleanup;}

hr = pUnk->QueryInterface(IID_IEnumVARIANT,(void**)&pEnum);
if(FAILED(hr)){goto Cleanup;}
hr = pEnum->Next(1,&var,&nFetch);

while(hr == S_OK)
{
if(nFetch==1)
{
if(VT_DISPATCH != V_VT(&var))
{
goto Cleanup;
}

pDisp = V_DISPATCH(&var);
hr = pDisp->QueryInterface(IID_IADsAccessControlEntry,
(void**)&pACE);

if(SUCCEEDED(hr))
{
lpszMask = L"Trustee: %s";
hr = pACE->get_Trustee(&bstrValue);
nLength = wcslen(lpszMask) + wcslen(bstrValue) + 1;
lpszOutput = new WCHAR[nLength];
swprintf_s(lpszOutput,lpszMask,bstrValue);
printf(lpszOutput);
delete [] lpszOutput;
SysFreeString(bstrValue);

pACE->Release();
pACE = NULL;
pDisp->Release();
pDisp = NULL;
}

VariantClear(&var);
}
hr = pEnum->Next(1,&var,&nFetch);
}

Cleanup:
if(pDisp) pDisp->Release();
if(pACL) pACL->Release();
if(pACE) pACE->Release();
if(pEnum) pEnum->Release();
if(pUnk) pUnk->Release();
if(szValue) SysFreeString(szValue);
return hr;
}

Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsAccessControlEntry é definido como B4F3A14C-9BDD-11D0-


852C-00C04FD8D503

Confira também
IADsAccessControlEntry

IADsAccessControlList

IADsSecurityDescriptor

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interface IADsAccessControlList (iads.h)
Artigo24/08/2023

A interface IADsAccessControlList é uma interface dupla que gerencia ACEs (entradas


de controle de acesso) individuais.

Herança
A interface IADsAccessControlList herda da interface IDispatch . IADsAccessControlList
também tem estes tipos de membros:

Métodos
A interface IADsAccessControlList tem esses métodos.

IADsAccessControlList::AddAce

O método IADsAccessControlList::AddAce adiciona um objeto IADsAccessControlEntry ao objeto


IADsAccessControlList.

IADsAccessControlList::CopyAccessList

O método IADsAccessControlList::CopyAccessList copia cada ACE (entrada de controle de acesso)


na ACL (lista de controle de acesso) para o espaço de processo do chamador.

IADsAccessControlList::get__NewEnum

O método IADsAccessControlList::get__NewEnum é usado para obter um objeto enumerador para


a ACL enumerar ACEs.

IADsAccessControlList::RemoveAce

Remove uma ACE (entrada de controle de acesso) da ACL (lista de controle de acesso).

Comentários
Uma ACL (lista de controle de acesso) é uma coleção de ACEs que podem fornecer
controle de acesso mais específico ao mesmo objeto ADSI para clientes diferentes. Em
geral, diferentes provedores implementam controles de acesso diferentes e, portanto, o
comportamento do objeto é específico para o provedor. Para obter mais informações,
consulte a documentação do provedor. Para obter mais informações sobre provedores
da Microsoft, consulte Provedores de sistema ADSI. Atualmente, somente o provedor
LDAP dá suporte a controles de acesso.

Antes de trabalhar com um OBJETO ACE, primeiro obtenha a ACL à qual eles pertencem.
As ACLs são gerenciadas por descritores de segurança e podem ser de ACL
discricionária e ACL do sistema. Para obter mais informações, consulte
IADsSecurityDescriptor.

Usando as propriedades e os métodos da interface IADsAccessControlList , você pode


recuperar e enumerar ACEs, adicionar novas entradas à lista ou remover entradas
existentes.

Para gerenciar controles de acesso em um ADSI

1. Primeiro, recupere o descritor de segurança do objeto que implementa a interface


IADsSecurityDescriptor .
2. Em segundo lugar, recupere a ACL do descritor de segurança.
3. Em terceiro lugar, trabalhe com o ACE, ou ACEs, do objeto na ACL.

Para tornar os ACEs novos ou modificados persistentes

1. Primeiro, adicione o ACE à ACL.


2. Em segundo lugar, atribua a ACL ao descritor de segurança.
3. Em terceiro lugar, confirme o descritor de segurança no repositório de diretórios.

Para obter mais informações sobre DACLs, consulte DACLs nulos e DACLs vazios.

Exemplos
O exemplo de código a seguir mostra como trabalhar com entradas de controle de
acesso de uma ACL discricionária.

VB

Dim X As IADs
Dim Namespace As IADsOpenDSObject
Dim SecurityDescriptor As IADsSecurityDescriptor
Dim Dacl As IADsAccessControlList

On Error GoTo Cleanup

Set Namespace = GetObject("LDAP://")


Set X= Namespace.OpenDSObject("LDAP://DC=Fabrikam,DC=Com, vbNullString,
vbNullString, ADS_SECURE_AUTHENTICATION)

Set SecurityDescriptor = X.Get("ntSecurityDescriptor")


Debug.Print SecurityDescriptor.Owner
Debug.Print SecurityDescriptor.Group

Set Dacl = SecurityDescriptor.DiscretionaryAcl


Debug.Print Dacl.AceCount

For Each Obj In Dacl


Debug.Print Obj.Trustee
Debug.Print Obj.AccessMask
Debug.Print Obj.AceFlags
Debug.Print Obj.AceType
Next

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set X = Nothing
Set Namespace = Nothing
Set SecurityDescriptor = Nothing
Set Dacl = Nothing

O exemplo de código a seguir enumera ACEs de uma DACL.

C++

IADs *pADs = NULL;


IDispatch *pDisp = NULL;
IADsSecurityDescriptor *pSD = NULL;
VARIANT var;
HRESULT hr = S_OK;

VariantInit(&var);

hr = ADsOpenObject(L"LDAP://OU=Sales, DC=Fabrikam,DC=com",NULL,NULL,
ADS_SECURE_AUTHENTICATION, IID_IADs,(void**)&pADs);
if(FAILED(hr)) {goto Cleanup;}

hr = pADs->Get(CComBSTR("ntSecurityDescriptor"), &var);
if(FAILED(hr)) {goto Cleanup;}

pDisp = V_DISPATCH(&var);

hr = pDisp->QueryInterface(IID_IADsSecurityDescriptor,(void**)&pSD);
if(FAILED(hr)) {goto Cleanup;}
pDisp->Release();

pSD->get_DiscretionaryAcl(&pDisp);

hr = pDisp->QueryInterface(IID_IADsAccessControlList,(void**)&pACL);
if(FAILED(hr)) {goto Cleanup;}
hr = DisplayAccessInfo(pSD);
if(FAILED(hr)) {goto Cleanup;}
VariantClear(&var);

Cleanup:
if(pADs) pADs->Release();
if(pDisp) pDisp->Release();
if(pSD) pSD->Release();
return hr;

HRESULT DisplayAccessInfo(IADsSecurityDescriptor *pSD)


{
LPWSTR lpszFunction = L"DisplayAccessInfo";
IDispatch *pDisp = NULL;
IADsAccessControlList *pACL = NULL;
IADsAccessControlEntry *pACE = NULL;
IEnumVARIANT *pEnum = NULL;
IUnknown *pUnk = NULL;
HRESULT hr = S_OK;
ULONG nFetch = 0;
BSTR bstrValue = NULL;
VARIANT var;
LPWSTR lpszOutput = NULL;
LPWSTR lpszMask = NULL;
size_t nLength = 0;

VariantInit(&var);

hr = pSD->get_DiscretionaryAcl(&pDisp);
if(FAILED(hr)){goto Cleanup;}
hr = pDisp->QueryInterface(IID_IADsAccessControlList,(void**)&pACL);
if(FAILED(hr)){goto Cleanup;}

hr = pACL->get__NewEnum(&pUnk);
if(FAILED(hr)){goto Cleanup;}

hr = pUnk->QueryInterface(IID_IEnumVARIANT,(void**)&pEnum);

if(FAILED(hr)){goto Cleanup;}
hr = pEnum->Next(1,&var,&nFetch);

while(hr == S_OK)
{
if(nFetch==1)
{
if(VT_DISPATCH != V_VT(&var))
{
goto Cleanup;
}

pDisp = V_DISPATCH(&var);
hr = pDisp->QueryInterface(IID_IADsAccessControlEntry,
(void**)&pACE);
if(SUCCEEDED(hr))
{
lpszMask = L"Trustee: %s";
hr = pACE->get_Trustee(&bstrValue);
nLength = wcslen(lpszMask) + wcslen(bstrValue) + 1;
lpszOutput = new WCHAR[nLength];
swprintf_s(lpszOutput,lpszMask,bstrValue);
printf(lpszOutput);
delete [] lpszOutput;
SysFreeString(bstrValue);

pACE->Release();
pACE = NULL;
pDisp->Release();
pDisp = NULL;
}

VariantClear(&var);
}
hr = pEnum->Next(1,&var,&nFetch);
}

Cleanup:
if(pDisp) pDisp->Release();
if(pACL) pACL->Release();
if(pACE) pACE->Release();
if(pEnum) pEnum->Release();
if(pUnk) pUnk->Release();
if(szValue) SysFreeString(szValue);
return hr;
}

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
IADsAccessControlEntry
IADsSecurityDescriptor

IDispatch

DACLs nulos e DACLs vazias

Comentários
Esta página foi útil?  Yes  No
Métodos de propriedade
IADsAccessControlList
Artigo • 13/06/2023

Os métodos de propriedade da interface IADsAccessControlList obtêm ou definem as


propriedades descritas na tabela a seguir. Para obter mais informações, consulte
Métodos de propriedade de interface.

Propriedades
AceCount

O número de entradas de controle de acesso na lista de controle de acesso.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_AceCount(
[out] LONG* lnAceCount
);
HRESULT put_AceCount(
[in] LONG lnAceCount
);

AclRevision

O nível de revisão de uma lista de controle de acesso. Esse valor pode ser
ACL_REVISION ou ACL_REVISION_DS. Use ACL_REVISION_DS se a ACL contiver uma
ACE específica do objeto. Todos os ACEs em uma ACL devem estar no mesmo nível de
revisão.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_AclRevision(
[out] LONG* lnAclRevision
);
HRESULT put_AclRevision(
[in] LONG lnAclRevision
);

Exemplos
O exemplo de código a seguir exibe o número de ACEs em uma ACL.

VB

Dim x as IADs
Dim sd As IADsSecurityDescriptor
Dim Dacl As IADsAccessControlList

On Error GoTo Cleanup

Set x = GetObject("LDAP://OU=Sales,DC=Fabrikam,DC=com")
Set sd = x.Get("ntSecurityDescriptor")
Set Dacl = sd.DiscretionaryAcl
Debug.Print Dacl.AceCount

Cleanup:
If (Err.Number <> 0) Then
MsgBox ("An error has occurred. " & Err.Number)
End If
Set x = Nothing

O exemplo de código a seguir exibe o número de ACEs em uma ACL.

C++

HRESULT ShowACEInACL(LPWSTR guestPath,LPWSTR user,LPWSTR passwd)


{
IADs *pObj = NULL;
IADsSecurityDescriptor *psd = NULL;
HRESULT hr = S_OK;
VARIANT var;

VariantInit(&var);

hr = ADsOpenObject(guestPath,user,passwd,ADS_SECURE_AUTHENTICATION,
IID_IADs,(void**)&pObj);
if(FAILED(hr)) {
printf("hr = %x\n",hr);
return hr;
}
else {
BSTR bstr = NULL;
pObj->get_Class(&bstr);
printf("Object class: %S\n",bstr);
SysFreeString(bstr);
}

hr = pObj->Get(CComBSTR("ntSecurityDescriptor"), &var);
pObj->Release();

if(FAILED(hr)) {
printf("Get ntSD: hr = %x\n",hr);
return hr;
}

hr = V_DISPATCH(&var)->QueryInterface(IID_IADsSecurityDescriptor,
(void**)&psd);

if(FAILED(hr)) {
printf("DISP: hr = %x\n",hr);
VariantClear(&var);
return hr;
}

IDispatch *pDisp = NULL;


hr = psd->get_DiscretionaryAcl(&pDisp);
VariantClear(&var);

if(FAILED(hr)) {
printf("get_DACL : hr = %x\n",hr);
return hr;
}

IADsAccessControlList *pAcl = NULL;


hr = pDisp->QueryInterface(IID_IADsAccessControlList,(void**)&pAcl);
pDisp->Release();

if(FAILED(hr)) {
printf("QI ACL: hr = %x\n",hr);
return hr;
}

long count = 0;
hr = pAcl->get_AceCount(&count);
pAcl->Release();
if(FAILED(hr)) {
printf("Count: hr = %x\n",hr);
return hr;
}

printf("AceCount = %d\n",count);

return hr;
}
Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsAccessControlList é definido como B7EE91CC-9BDD-11D0-


852C-00C04FD8D503

Confira também
IADsAccessControlList

IEnumVARIANT

IADsAccessControlEntry

IADsSecurityDescriptor

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Método IADsAccessControlList::AddAce
(iads.h)
Artigo24/08/2023

O método IADsAccessControlList::AddAce adiciona um objeto IADsAccessControlEntry


ao objeto IADsAccessControlList .

Sintaxe
C++

HRESULT AddAce(
[in] IDispatch *pAccessControlEntry
);

Parâmetros
[in] pAccessControlEntry

Ponteiro para a interface IDispatch do objeto IADsAccessControlEntry a ser adicionado.


Esse parâmetro não pode ser NULL.

Valor retornado
Retorna um valor HRESULT padrão, incluindo o seguinte.

Comentários
As entradas de controle de acesso devem aparecer na seguinte ordem na lista de
controle de acesso de um descritor de segurança:

ACEs negados pelo acesso que se aplicam ao próprio objeto


ACEs negados pelo acesso que se aplicam a um filho do objeto, como um
conjunto de propriedades ou propriedade
ACEs permitidos pelo acesso que se aplicam ao próprio objeto
ACEs permitidos pelo acesso que se aplicam a um filho do objeto, como um
conjunto de propriedades ou uma propriedade
Todos os ACEs herdados
Esse método adiciona o ACE à frente da ACL, o que não necessariamente resulta na
ordenação correta.

Exemplos

O exemplo de código do Visual Basic a seguir mostra como usar o método


IADsAccessControlList::AddAce para adicionar dois ACEs a uma ACL.

VB

Const ACL_REVISION_DS = &H4

Dim x as IADs
Dim sd as IADsSecurityDescriptor
Dim Ace1 As new IADsAccessControlEntry
Dim Ace2 As new IADsAccessControlEntry
Dim Dacl As new IADsAccessControlList
On Error GoTo Cleanup

Set x = GetObject("LDAP://OU=Sales,DC=Fabrikam,DC=com")
Set sd = x.Get("ntSecurityDescriptor")

' Add the ACEs to the Discretionary ACL.

Dacl.AclRevision = ACL_REVISION_DS 'DS ACL Revision


' Set up the first ACE.
Ace1.AccessMask = -1 'Full Permission (Allowed)
Ace1.AceType = ADS_ACETYPE_ACCESS_ALLOWED
Ace1.AceFlags = ADS_ACEFLAG_INHERIT_ACE
Ace1.Trustee = "myMachine\Administrator"

' Set up the 2nd ACE.


Ace2.AccessMask = -1 'Full Permission (Denied)
Ace2.AceType = ADS_ACETYPE_ACCESS_DENIED
Ace2.AceFlags = ADS_ACEFLAG_INHERIT_ACE
Ace2.Trustee = "aDomain\aUser"

' Add the ACEs to the Discretionary ACL.


Dacl.AddAce Ace1
Dacl.AddAce Ace2

'Commit the changes.


sd.DiscretionaryAcl = Dacl
x.Put "ntSecurityDescriptor", Array(sd)
x.SetInfo

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set Ace1 = Nothing
Set Ace2 = Nothing
Set Dacl = Nothing
Set x = Nothing
Set sd = Nothing

O exemplo de código C++ a seguir adiciona um ACE a uma ACL usando o método
IADsAccessControlList::AddAce . O ACE adicionado permitiu direitos de acesso com a
permissão completa.

C++

HRESULT addAceTo(IADsAccessControlList *pAcl)


{
if(!pAcl)
{
return E_FAIL;
}

HRESULT hr = pAcl->put_AclRevision(ACL_REVISION_DS);
if(FAILED(hr))
{
return hr;
}

IADsAccessControlEntry *pAce = NULL;


pAce = createAce(-1, // Full permissions.
ADS_ACETYPE_ACCESS_ALLOWED,
ADS_ACEFLAG_INHERIT_ACE,
CComBSTR("aDomain\\aUser"));

if(!pAce)
{
return E_FAIL;
}

IDispatch *pDisp;
hr = pAce->QueryInterface(IID_IDispatch,(void**)&pDisp);
if(FAILED(hr))
{
pAce->Release();
return hr;
}

hr = pAcl->AddAce(pDisp);
pDisp->Release();
if(pAce) pAce->Release();
if(FAILED(hr))
{
return hr;
}

printf("Ace has been added to ACL.\n");


return hr;
}

////////////////////////////////////
// function to create an allowed ACE
////////////////////////////////////
IADsAccessControlEntry *createAce(
long mask,
long type,
long flag,
BSTR trustee)
{
HRESULT hr;
IADsAccessControlEntry *pAce;
hr = CoCreateInstance(CLSID_AccessControlEntry,
NULL,
CLSCTX_INPROC_SERVER,
IID_IADsAccessControlEntry,
(void**)&pAce);
if(FAILED(hr))
{
if(pAce)
{
pAce->Release();
}

return NULL;
}

hr = pAce->put_AccessMask(mask);
hr = pAce->put_AceType(type);
hr = pAce->put_AceFlags(flag);
hr = pAce->put_Trustee(trustee);

return pAce;
}

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll
Confira também
IADsAccessControlEntry

IADsAccessControlList

Comentários
Esta página foi útil?  Yes  No
Método
IADsAccessControlList::CopyAccessList
(iads.h)
Artigo24/08/2023

O método IADsAccessControlList::CopyAccessList copia cada ACE (entrada de controle


de acesso) na ACL (lista de controle de acesso) para o espaço de processo do chamador.

Sintaxe
C++

HRESULT CopyAccessList(
[out] IDispatch **ppAccessControlList
);

Parâmetros
[out] ppAccessControlList

Endereço de um ponteiro de interface IDispatch para uma ACL como a cópia da lista de
acesso original. Se esse parâmetro for NULL no retorno, nenhuma cópia da ACL poderá
ser feita.

Valor retornado
Esse método retorna os valores de retorno padrão.

Para obter mais informações sobre outros valores retornados, consulte Códigos de erro
ADSI.

Comentários
O chamador deve chamar Release na cópia de ACEs por meio de seus ponteiros
IDispatch .

Exemplos
O exemplo de código a seguir mostra como copiar uma ACL de um objeto ADSI para
outro.

VB

Dim x As IADs
Dim sd As IADsSecurityDescriptor
Dim Dacl As IADsAccessControlList
Dim CopyDacl As IADsAccessControlList

' Get the ACL from one object.


Set x = GetObject("LDAP://OU=Sales,
DC=activeD,DC=mydomain,DC=fabrikam,DC=com")
Set sd = x.Get("ntSecurityDescriptor")
Set Dacl = sd.DiscretionaryAcl
Set CopyDacl = Dacl.CopyAccessList()

' Copy the ACL to another object in the Directory.


Set x = GetObject("LDAP://OU=Sales, DC=Fabrikam,DC=com")
Set sd = x.Get("ntSecurityDescriptor")
sd.DiscretionaryAcl = CopyDacl
x.Put "ntSecurityDescriptor", Array(sd)
x.SetInfo

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set x = Nothing
Set sd = Nothing
Set Dacl = Nothing
Set CopyDacl = Nothing

O exemplo de código a seguir copia a ACL do objeto de origem para o objeto de


destino.

C++

HRESULT CopyACL(IADs *pSource, IADs *pTarget)


{
IADsSecurityDescriptor *pSourceSD = NULL;
IADsSecurityDescriptor *pTargetSD = NULL;
IDispatch *pDisp = NULL;

HRESULT hr = S_OK;
VARIANT varSource, varTarget;

VariantInit(&varSource);
VariantInit(&varTarget);

if((pSource==NULL) || (pTarget==NULL))
{
return E_FAIL;
}

hr = pSource->Get(CComBSTR("ntSecurityDescriptor"), &varSource);
if(FAILED(hr))
{
goto Cleanup;
}

hr = pTarget->Get(CComBSTR("ntSecurityDescriptor"), &varTarget);
if(FAILED(hr))
{
goto Cleanup;
}

hr = V_DISPATCH(&varSource)->QueryInterface(IID_IADsSecurityDescriptor,
(void**)&pSourceSD);
if(FAILED(hr))
{
goto Cleanup;
}

hr = V_DISPATCH(&varTarget)->QueryInterface(IID_IADsSecurityDescriptor,
(void**)&pTargetSD);
if(FAILED(hr))
{
goto Cleanup;
}

hr = pSourceSD->get_DiscretionaryAcl(&pDisp);
if(FAILED(hr))
{
goto Cleanup;
}

hr = pTargetSD->put_DiscretionaryAcl(pDisp);
if(FAILED(hr))
{
goto Cleanup;
}

hr = pTarget->SetInfo();

Cleanup:
VariantClear(&varSource);
VariantClear(&varTarget);
if(pSourceSD)
{
pSourceSD->Release();
}
if(pTargetSD)
{
pTargetSD->Release();
}
if(pDisp)
{
pDisp->Release();
}
return hr;
}

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
IADsAccessControlEntry

IADsAccessControlList

IADsSecurityDescriptor

Comentários
Esta página foi útil?  Yes  No
Método
IADsAccessControlList::RemoveAce
(iads.h)
Artigo24/08/2023

O método IADsAccessControlList::RemoveAce remove uma ACE (entrada de controle


de acesso) da ACL (lista de controle de acesso).

Sintaxe
C++

HRESULT RemoveAce(
[in] IDispatch *pAccessControlEntry
);

Parâmetros
[in] pAccessControlEntry

Ponteiro para a interface IDispatch da ACE a ser removida da ACL.

Valor retornado
Esse método retorna valores retornados padrão.

Para obter mais informações, consulte Códigos de erro ADSI.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h
DLL Activeds.dll

Confira também
IADsAccessControlEntry

IADsAccessControlList

IADsSecurityDescriptor

Comentários
Esta página foi útil?  Yes  No
Método
IADsAccessControlList::get__NewEnum
(iads.h)
Artigo24/08/2023

O método IADsAccessControlList::get__NewEnum é usado para obter um objeto


enumerador para a ACL enumerar ACEs.

Sintaxe
C++

HRESULT get__NewEnum(
[out] IUnknown **retval
);

Parâmetros
[out] retval

Ponteiro para o ponteiro para a interface IUnknown usada para recuperar a interface
IEnumVARIANT em um objeto enumerador para a ACL.

Valor retornado
Esse método retorna os valores de retorno padrão, incluindo S_OK e E_FAIL. Para obter
mais informações sobre outros valores retornados, consulte Códigos de erro ADSI.

Comentários
Lembre-se de que há dois sublinhados em get__NewEnum.

Exemplos
O exemplo de código a seguir faz uma chamada implícita para o método
get__NewEnum na execução do loop For Each .
VB

Dim Dacl As IADsAccessControlList


Dim ace As IADsAccessControlEntry

On Error GoTo Cleanup

' Get DACL. Code omitted.

' Display the trustees for each of the ACEs


For Each ace In Dacl
Debug.Print ace.trustee
Next ace

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set Dacl = Nothing
Set ace = Nothing

O exemplo de código a seguir mostra como enumerar ACEs usando


IADsAccessControlList::get__NewEnum.

C++

HRESULT ListTrustees(IADsAccessControlList *pACL)


{
IEnumVARIANT *pEnum = NULL;
LPUNKNOWN pUnk = NULL;
ULONG lFetch = 0;
BSTR bstr = NULL;
IADsAccessControlEntry *pACE = NULL;
IDispatch *pDisp = NULL;
VARIANT var;
HRESULT hr = S_OK;

VariantInit(&var);

hr = pACL->get__NewEnum(&pUnk);
if (FAILED(hr)){goto Cleanup;}

hr = pUnk->QueryInterface( IID_IEnumVARIANT, (void**) &pEnum );


pUnk->Release();
if (FAILED(hr)){goto Cleanup;}

hr = pEnum->Next( 1, &var, &lFetch );


if (FAILED(hr)){goto Cleanup;}

while( hr == S_OK )
{
if ( lFetch == 1 )
{
if ( VT_DISPATCH != V_VT(&var) )
{
goto Cleanup;
}
pDisp = V_DISPATCH(&var);
/////////////////////////
// Get the individual ACE
/////////////////////////
hr = pDisp->QueryInterface( IID_IADsAccessControlEntry,
(void**)&pACE );
if ( SUCCEEDED(hr) )
{
pACE->get_Trustee(&bstr);
printf("\n %S:\n", bstr);
//ACE manipulation here
SysFreeString(bstr);
pACE->Release();
}
pACE->Release();
pDisp->Release();
VariantClear(&var);
}
hr = pEnum->Next( 1, &var, &lFetch );
}
Cleanup:
if(pEnum) pEnum->Release();
if(pUnk) pUnk->Release();
if(bstr) SysFreeString(bstr);
if(pACE) pACE->Release();
VariantClear(&var);
return hr;
}

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
IADsAccessControlEntry

IADsAccessControlList

IADsSecurityDescriptor

IEnumVARIANT

Comentários
Esta página foi útil?  Yes  No
Interface IADsSecurityDescriptor (iads.h)
Artigo24/08/2023

A interface IADsSecurityDescriptor fornece acesso a propriedades em um objeto


descritor de segurança ADSI.

Herança
A interface IADsSecurityDescriptor herda da interface IDispatch .
IADsSecurityDescriptor também tem estes tipos de membros:

Métodos
A interface IADsSecurityDescriptor tem esses métodos.

IADsSecurityDescriptor::CopySecurityDescriptor

O método IADsSecurityDescriptor::CopySecurityDescriptor copia um objeto descritor de


segurança ADSI que contém dados de segurança sobre um objeto .

Comentários
Use essa interface para examinar e alterar os controles de acesso para um objeto de
serviço de diretório do Active Directory. Você também pode usá-lo para criar cópias de
um descritor de segurança. Para obter essa interface, use o método IADs.Get para obter
o atributo ntSecurityDescriptor do objeto . Para obter mais informações sobre como
criar um novo descritor de segurança e defini-lo em um objeto, consulte Criando um
descritor de segurança para um novo objeto de diretório e DACLs nulos e DACLs vazias.

Muitas vezes, não é possível modificar todas as partes do descritor de segurança. Por
exemplo, se o usuário atual tiver controle total de um objeto, mas não for um
administrador e não for o proprietário do objeto, o usuário poderá modificar a DACL,
mas não poderá modificar o proprietário. Isso causará um erro quando o
ntSecurityDescriptor for atualizado. Para evitar esse problema, a interface
IADsObjectOptions pode ser usada para especificar as partes específicas do descritor de
segurança que devem ser modificadas.
Exemplos
O exemplo de código a seguir mostra como usar a interface IADsObjectOptions para
modificar apenas partes específicas do descritor de segurança.

VB

Const ADS_OPTION_SECURITY_MASK = 3
Const ADS_SECURITY_INFO_OWNER = 1
Const ADS_SECURITY_INFO_GROUP = 2
Const ADS_SECURITY_INFO_DACL = 4

Dim obj as IADs


Dim sd as IADsSecurityDescriptor
Dim oOptions as IADsObjectOptions

' Bind to the object.


Set obj = GetObject("LDAP://.....")

' Get the IADsSecurityDescriptor.


Set sd = obj.Get("ntSecurityDescriptor")

' Modify the DACL as required.

' Get the IADsObjectOptions for the object - not the IADsSecurityDescriptor.
Set oOptions = obj

' Set options so that only the DACL will be updated.


oOptions.SetOption ADS_OPTION_SECURITY_MASK, ADS_INFO_DACL

' Update the security descriptor.


obj.Put "ntSecurityDescriptor", sd
obj.SetInfo

O exemplo de código a seguir mostra como exibir dados de um descritor de segurança.

VB

' Get the security descriptor.


Dim x As IADs
Dim sd As IADsSecurityDescriptor

On Error GoTo Cleanup

Set x = GetObject("LDAP://DC=Fabrikam,DC=com")
Set sd = x.Get("ntSecurityDescriptor")
Debug.Print sd.Control
Debug.Print sd.Group
Debug.Print sd.Owner
Debug.Print sd.Revision

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set x = Nothing
Set sd = Nothing

O exemplo de código a seguir mostra como exibir dados de um descritor de segurança


de um objeto de diretório.

C++

HRESULT DisplaySD(IADs *pObj)


{
IADsSecurityDescriptor *pSD = NULL;
BSTR bstr = NULL;
long lVal = 0;
HRESULT hr = S_OK;
VARIANT var;

VariantInit(&var);

if(pObj==NULL)
{
return E_FAIL;
}

hr = pObj->Get(CComBSTR("ntSecurityDescriptor"), &var);
if(FAILED(hr)){goto Cleanup;}

hr = V_DISPATCH(&var)->QueryInterface(IID_IADsSecurityDescriptor,
(void**)&pSD);
if(FAILED(hr)){goto Cleanup;}

hr = pSD->get_Control(&lVal);
printf("SD Control = %d\n",lVal);

hr = pSD->get_Owner(&bstr);
printf("SD Owner = %S\n",bstr);
SysFreeString(bstr);

hr = pSD->get_Group(&bstr);
printf("SD Group = %S\n",bstr);
SysFreeString(bstr);

hr = pSD->get_Revision(&lVal);
printf("SD Revision= %d\n",lVal);

Cleanup:
VariantClear(&var);
if(pSD) pSD->Release();
return hr;
}

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Criando um descritor de segurança para um novo objeto de diretório

IADsAccessControlEntry

IADsAccessControlList

IDispatch

DACLs nulos e DACLs vazias

Comentários
Esta página foi útil?  Yes  No
Métodos da propriedade
IADsSecurityDescriptor
Artigo • 13/06/2023

Os métodos de propriedade da interface IADsSecurityDescriptor obtêm ou definem as


propriedades descritas na tabela a seguir. Para obter mais informações, consulte
Métodos de propriedade de interface.

Propriedades
Controle

Sinalizadores que qualificam o significado do descritor de segurança. Os valores são


obtidos da estrutura de SECURITY_DESCRIPTOR_CONTROL do Win32.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_Control(
[out] LONG* plControl
);
HRESULT put_Control(
[in] LONG lControl
);

DaclDefaulted

Um sinalizador do tipo BOOL que indica se a DACL é derivada de um mecanismo


padrão, em vez de ser fornecida explicitamente pelo provedor original do descritor de
segurança. Por exemplo, se o criador de um objeto não especificar uma DACL, o objeto
receberá a DACL padrão do token de acesso do criador. Esse sinalizador pode afetar
como o sistema trata a DACL em relação à herança ace. O sistema ignorará esse
sinalizador se o sinalizador SE_DACL_PRESENT não estiver definido.

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT_BOOL

syntax
// C++ method syntax
HRESULT get_DaclDefaulted(
[out] VARIANT_BOOL* fDaclDefaulted
);
HRESULT put_DaclDefaulted(
[in] VARIANT_BOOL fDaclDefaulted
);

Discretionaryacl

DACL (lista de controle de acesso discricionário) que especifica os tipos de acesso


concedidos ao objeto para usuários e grupos especificados. Para obter mais
informações sobre DACLs, consulte DACLs nulos e DACLs vazias.

Tipo de acesso: leitura/gravação

Tipo de dados de script: IDispatch

syntax

// C++ method syntax


HRESULT get_DiscretionaryAcl(
[out] IDispatch** ppIDispDACL
);
HRESULT put_DiscretionaryAcl(
[in] IDispatch* pIDispDACL
);

Grupo

Grupo ao qual pertence a ID de segurança do proprietário.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Group(
[out] BSTR* pbstrGroupl
);
HRESULT put_Group(
[in] BSTR bstrGroup
);

GroupDefaulted
Um sinalizador do tipo BOOL que indica se os dados do grupo são derivados de um
mecanismo padrão, em vez de serem fornecidos explicitamente pelo provedor original
do descritor de segurança.

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT_BOOL

syntax

// C++ method syntax


HRESULT get_GroupDefaultedY(
[out] VARIANT_BOOL* fGroupDefaulted
);
HRESULT put_GroupDefaulted(
[in] VARIANT_BOOL fGroupDefaulted
);

Proprietário

Proprietário do objeto.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Owner(
[out] BSTR* pbstrOwnerl
);
HRESULT put_Owner(
[in] BSTR bstrOwner
);

OwnerDefaulted

Um sinalizador do tipo BOOL que indica que os dados do proprietário são derivados de
um mecanismo padrão, em vez de serem fornecidos explicitamente pelo provedor
original do descritor de segurança.

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT_BOOL

syntax
// C++ method syntax
HRESULT get_OwnerDefaulted(
[out] VARIANT_BOOL* fOwnerDefaulted
);
HRESULT put_OwnerDefaulted(
[in] VARIANT_BOOL fOwnerDefaulted
);

Revisão

Nível de revisão do descritor de segurança. Esse valor é obtido da estrutura


ACL_REVISION_INFORMATION Win32. Todos os ACEs em uma ACL devem estar no
mesmo nível de revisão.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_Revision(
[out] LONG* plRevision
);
HRESULT put_Revision(
[in] LONG lRevision
);

SaclDefaulted

Um sinalizador do tipo BOOL que indica que a SACL é derivada de um mecanismo


padrão, em vez de ser fornecida explicitamente pelo provedor original do descritor de
segurança. Esse sinalizador pode afetar como o sistema lida com a SACL em relação à
herança ace. O sistema ignorará esse sinalizador se o sinalizador SE_SACL_PRESENT não
estiver definido.

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT_BOOL

syntax

// C++ method syntax


HRESULT get_SaclDefaulted(
[out] VARIANT_BOOL* fSaclDefaulted
);
HRESULT put_SaclDefaulted(
[in] VARIANT_BOOL fSaclDefaulted
);

Systemacl

Lista de controle de acesso do sistema usada para gerar registros de auditoria para o
objeto .

Tipo de acesso: leitura/gravação

Tipo de dados de script: IDispatch

syntax

// C++ method syntax


HRESULT get_SystemAcl(
[out] IDispatch** ppIDispSACL
);
HRESULT put_SystemAcl(
[in] IDispatch* pIDispSACL
);

Exemplos
O exemplo de código a seguir mostra como enumerar um descritor de segurança
existente.

VB

Dim ou As IADs
Dim sd As IADsSecurityDescriptor
Dim dacl As IADsAccessControlList
Dim sacl As IADsAccessControlList

On Error GoTo Cleanup

Set ou = GetObject("LDAP://OU=Sales,DC=Fabrikam,DC=com")
Set sd = ou.Get("ntSecurityDescriptor")
Debug.Print sd.Owner
Debug.Print sd.Group
Debug.Print sd.Owner
Debug.Print sd.Revision
Set dacl = sd.DiscretionaryAcl
Set sacl = sd.SystemAcl
' Add code to perform an operation with the Discretionary and System ACLs.

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set ou = Nothing
Set sd = Nothing
Set dacl = Nothing
Set sacl = Nothing

Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsSecurityDescriptor é definido como B8C787CA-9BDD-11D0-


852C-00C04FD8D503

Confira também
IADsSecurityDescriptor

IADsAccessControlEntry

IADsAccessControlList

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Método
IADsSecurityDescriptor::CopySecurityDe
scriptor (iads.h)
Artigo24/08/2023

O método IADsSecurityDescriptor::CopySecurityDescriptor copia um objeto descritor


de segurança ADSI que contém dados de segurança sobre um objeto .

Sintaxe
C++

HRESULT CopySecurityDescriptor(
[out] IDispatch **ppSecurityDescriptor
);

Parâmetros
[out] ppSecurityDescriptor

Ponteiro para um ponteiro para um objeto descritor de segurança.

Valor retornado
Esse método retorna os valores de retorno padrão, incluindo E_INVALIDARG,
E_OUTOFMEMORY, E_UNEXPECTED e E_FAIL, bem como S_OK. Para obter mais
informações sobre outros valores retornados, consulte Códigos de erro ADSI.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h
DLL Activeds.dll

Confira também
IADsAccessControlEntry

IADsAccessControlList

IADsSecurityDescriptor

Comentários
Esta página foi útil?  Yes  No
Interface IADsSecurityUtility (iads.h)
Artigo24/08/2023

A interface IADsSecurityUtility é usada para obter, definir ou recuperar o descritor de


segurança em um arquivo, compartilhamento de arquivos ou chave do Registro. Você
também pode usá-lo para converter o descritor de segurança para ou do modo bruto
ou hexadecimal e pode limitar o escopo dos dados do descritor de segurança
recuperados ou definidos indicando se você deseja que ele seja para o proprietário,
grupo, DACL ou SACL.

Herança
A interface IADsSecurityUtility herda da interface IDispatch . IADsSecurityUtility
também tem esses tipos de membros:

Métodos
A interface IADsSecurityUtility tem esses métodos.

IADsSecurityUtility::ConvertSecurityDescriptor

Converte um descritor de segurança de um formato para outro.

IADsSecurityUtility::get_SecurityMask

Determina quais elementos do descritor de segurança recuperar ou definir. (Obter)

IADsSecurityUtility::GetSecurityDescriptor

Recupera um descritor de segurança para o arquivo, o compartilhamento de arquivos ou a chave


do Registro especificados.

IADsSecurityUtility::p ut_SecurityMask

Determina quais elementos do descritor de segurança recuperar ou definir. (Put)

IADsSecurityUtility::SetSecurityDescriptor

Define o descritor de segurança para o arquivo, o compartilhamento de arquivo ou a chave do


Registro especificados.
Comentários
Para ler a SACL (lista de controle de acesso do sistema) de um arquivo ou diretório, o
privilégio SE_SECURITY_NAME deve ser habilitado para o processo de chamada. Para
obter mais informações sobre como recuperar o SACL de um objeto, consulte
Recuperando o SACL de um objeto.

Para obter mais informações e um exemplo de código que mostra como usar a interface
IADsSecurityUtility para adicionar um ACE a um arquivo, consulte Código de exemplo
para adicionar um ACE a um arquivo.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
ADS_PATHTYPE_ENUM

ADS_SD_FORMAT_ENUM

Código de exemplo para adicionar um ACE a um arquivo

IADsAccessControlEntry

IADsSecurityDescriptor

IAccessControlList

IDispatch

Descritores de segurança em arquivos e chaves do Registro

Interfaces de segurança
Comentários
Esta página foi útil?  Yes  No
Método
IADsSecurityUtility::get_SecurityMask
(iads.h)
Artigo14/03/2023

A propriedade SecurityMask determina quais elementos do descritor de segurança


recuperar ou definir. Essa propriedade deve ser definida antes de chamar
IADsSecurityUtility.GetSecurityDescriptor ou IADsSecurityUtility.SetSecurityDescriptor.

Essa propriedade é leitura/gravação.

Sintaxe
C++

HRESULT get_SecurityMask(
long *retval
);

Parâmetros
retval

[out] Um ponteiro para uma variável que recebe a máscara de segurança.

Retornar valor
Um valor HRESULT que indica o êxito ou a falha da chamada.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows


Cabeçalho iads.h

DLL Activeds.dll

Confira também
ADS_SECURITY_INFO_ENUM

IADsSecurityUtility

IADsSecurityUtility.GetSecurityDescriptor

IADsSecurityUtility.SetSecurityDescriptor

Comentários
Esta página foi útil?  Yes  No
Método
IADsSecurityUtility::ConvertSecurityDesc
riptor (iads.h)
Artigo24/08/2023

O método ConvertSecurityDescriptor converte um descritor de segurança de um


formato para outro.

Sintaxe
C++

HRESULT ConvertSecurityDescriptor(
[in] VARIANT varSD,
[in] long lDataFormat,
[in] long lOutFormat,
[out] VARIANT *pResult
);

Parâmetros
[in] varSD

Uma VARIANT que contém o descritor de segurança a ser convertido. O formato dessa
VARIANT é definido pelo parâmetro lDataFormat .

[in] lDataFormat

Contém um dos valores ADS_SD_FORMAT_ENUM que especifica o formato do descritor


de segurança no parâmetro varSD . A lista a seguir identifica os valores possíveis para
esse parâmetro e o formato do parâmetro varSD .

ADS_SD_FORMAT_IID

varSD contém um VT_DISPATCH que pode ser consultado para a interface


IADsSecurityDescriptor .

ADS_SD_FORMAT_RAW
varSD contém um VT_I1 | VT_ARRAY que contém o descritor de segurança no formato
de dados brutos. Isso está no formato de uma estrutura de SECURITY_DESCRIPTOR .

ADS_SD_FORMAT_HEXSTRING

varSD contém um VT_BSTR que contém o descritor de segurança bruto no formato de


cadeia de caracteres de codificação hex.

[in] lOutFormat

Contém um dos valores ADS_SD_FORMAT_ENUM que especifica o formato no qual o


descritor de segurança deve ser convertido. A lista a seguir identifica os valores
possíveis para esse parâmetro e o formato do parâmetro pvResult .

ADS_SD_FORMAT_IID

pvResult recebe uma VT_DISPATCH que pode ser consultada para a interface
IADsSecurityDescriptor .

ADS_SD_FORMAT_RAW
pvResult recebe um VT_I1 | VT_ARRAY que contém o descritor de segurança no formato
de dados brutos. Isso está no formato de uma estrutura de SECURITY_DESCRIPTOR .

ADS_SD_FORMAT_HEXSTRING
pvResult recebe um VT_BSTR que contém o descritor de segurança bruto no formato de
cadeia de caracteres de codificação hex.

[out] pResult

Ponteiro para um VARIANT que recebe o descritor de segurança convertido. O formato


do descritor de segurança recuperado é especificado pelo parâmetro lOutFormat .

Valor retornado
Retorna S_OK se tiver êxito ou um código de erro COM ou Win32, caso contrário. Os
códigos de erro possíveis incluem o seguinte.

Requisitos
Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
ADS_PATHTYPE_ENUM

ADS_SD_FORMAT_ENUM

IADsSecurityDescriptor

IADsSecurityUtility

Comentários
Esta página foi útil?  Yes  No
Método
IADsSecurityUtility::GetSecurityDescript
or (iads.h)
Artigo24/08/2023

O método GetSecurityDescriptor recupera um descritor de segurança para o arquivo, o


compartilhamento de arquivos ou a chave do Registro especificados.

Sintaxe
C++

HRESULT GetSecurityDescriptor(
[in] VARIANT varPath,
[in] long lPathFormat,
[in] long lFormat,
[out] VARIANT *pVariant
);

Parâmetros
[in] varPath

Uma cadeia de caracteres VARIANT que contém o caminho do objeto para o qual
recuperar o descritor de segurança.

Arquivo
Uma sintaxe de caminho de arquivo válida. Por exemplo: "c:\specs\public\adxml.doc" ou
"\adsi\public\dsclient.exe".

Compartilhamento de arquivo
Uma sintaxe de caminho de arquivo válida para um compartilhamento de arquivos. Por
exemplo: "\adsi\public".

Chave do Registro
Uma sintaxe válida do Registro. Por exemplo,
"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ADs".

[in] lPathFormat

Contém um dos valores ADS_PATHTYPE_ENUM que especifica o formato do parâmetro


varPath .

[in] lFormat

Contém um dos valores ADS_SD_FORMAT_ENUM que especifica o formato do descritor


de segurança retornado no parâmetro pVariant . A lista a seguir identifica os valores
possíveis para esse parâmetro e o formato fornecido no parâmetro pVariant .

ADS_SD_FORMAT_IID

pVariant recebe uma VT_DISPATCH que pode ser consultada para a interface
IADsSecurityDescriptor .

ADS_SD_FORMAT_RAW

pVariant recebe um VT_I1 | VT_ARRAY que contém o descritor de segurança no formato


de dados brutos. Isso está no formato de uma estrutura de SECURITY_DESCRIPTOR .

ADS_SD_FORMAT_HEXSTRING
pVariant recebe um VT_BSTR que contém o descritor de segurança bruto no formato de
cadeia de caracteres de codificação hex.

[out] pVariant

Ponteiro para um VARIANT que recebe o descritor de segurança retornado. O formato


do descritor de segurança recuperado é especificado pelo parâmetro lFormat .

Valor retornado
Retorna S_OK se tiver êxito ou um código de erro COM ou Win32, caso contrário. Os
códigos de erro possíveis incluem o seguinte.

Requisitos
Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
ADS_PATHTYPE_ENUM

ADS_SD_FORMAT_ENUM

IADsSecurityDescriptor

IADsSecurityUtility

SECURITY_DESCRIPTOR

SetSecurityDescriptor

Comentários
Esta página foi útil?  Yes  No
Método
IADsSecurityUtility::SetSecurityDescripto
r (iads.h)
Artigo24/08/2023

O método SetSecurityDescriptor define o descritor de segurança para o arquivo, o


compartilhamento de arquivo ou a chave do Registro especificados.

Sintaxe
C++

HRESULT SetSecurityDescriptor(
[in] VARIANT varPath,
[in] long lPathFormat,
[in] VARIANT varData,
[in] long lDataFormat
);

Parâmetros
[in] varPath

Uma cadeia de caracteres VARIANT que contém o caminho do objeto para o qual
definir o descritor de segurança. Os valores possíveis são listados na lista a seguir.

Arquivo
Uma sintaxe de caminho de arquivo válida. Por exemplo: "c:\specs\public\adxml.doc" ou
"\adsi\public\dsclient.exe".

Compartilhamento de arquivo
Uma sintaxe de caminho de arquivo válida para um compartilhamento de arquivos. Por
exemplo: "\adsi\public".

Chave do Registro
Uma sintaxe válida do Registro. Por exemplo,
"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ADs".

[in] lPathFormat

Contém um dos valores ADS_PATHTYPE_ENUM que especifica o formato do parâmetro


varPath .

[in] varData

Uma VARIANT que contém o novo descritor de segurança. O formato do descritor de


segurança é especificado pelo parâmetro lDataFormat .

[in] lDataFormat

Contém um dos valores ADS_SD_FORMAT_ENUM que especifica o formato do descritor


de segurança contido no parâmetro VarData . A lista a seguir identifica os valores
possíveis para esse parâmetro e o formato do parâmetro VarData .

Valor retornado
Retorna S_OK se tiver êxito ou um código de erro COM ou Win32, caso contrário. Os
códigos de erro possíveis estão listados na lista a seguir.

Comentários
As entradas de controle de acesso devem aparecer na seguinte ordem na lista de
controle de acesso de um descritor de segurança:

ACEs negados pelo acesso que se aplicam ao próprio objeto


ACEs negados pelo acesso que se aplicam a um filho do objeto, como um
conjunto de propriedades ou propriedade
ACEs permitidos pelo acesso que se aplicam ao próprio objeto
ACEs permitidos pelo acesso que se aplicam a um filho do objeto, como um
conjunto de propriedades ou uma propriedade
Todos os ACEs herdados

Exemplos
O exemplo de código a seguir mostra como definir um descritor de segurança para um
arquivo.
VB

Dim dacl as IADsAccessControlList


Dim sd as IADsSecurityDescriptor
Dim newAce as New AccessControlEntry
Dim sdUtil as New ADsSecurityUtility

Set sd = sdUtil.GetSecurityDescriptor("c:\specs\adsixml.doc", ADS_PATH_FILE,


ADS_SD_FORMAT_IID )
Set dacl = sd.DiscretionaryAcl

' Add a new ACE for Jeff Smith.


newAce.Trustee = "Fabrikam\jeffsmith"
newAce.AccessMask = ADS_RIGHT_GENERIC_READ Or ADS_RIGHT_GENERIC_EXECUTE

newAce.AceType = ADS_ACETYPE_ACCESS_ALLOWED

dacl.AddAce newAce
sd.DiscretionaryAcl = dacl
sdUtil.SetSecurityDescriptor "c:\specs\adsixml.doc", ADS_PATH_FILE, sd,
ADS_SD_FORMAT_IID

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set dacl = Nothing
Set sd = Nothing
Set newAce = Nothing
Set sdUtil = Nothing

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
ADS_PATHTYPE_ENUM
ADS_SD_FORMAT_ENUM

ConvertSecurityDescriptor

IADsSecurityDescriptor

IADsSecurityUtility

Comentários
Esta página foi útil?  Yes  No
Interfaces não automação
Artigo • 03/06/2023

Esta seção descreve as seguintes interfaces ADSI que não são de Automação:

IDirectoryObject
IDirectorySchemaMgmt
Idirectorysearch

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interface IDirectoryObject (iads.h)
Artigo14/03/2023

A interface IDirectoryObject é uma interface COM que não é de Automação que


fornece aos clientes acesso direto a objetos de serviço de diretório. A interface permite
o acesso por meio de um protocolo over-the-wire direto, em vez de por meio do cache
de atributo ADSI. O uso do protocolo over-the-wire otimiza o desempenho. Com
IDirectoryObject, um cliente pode obter ou definir qualquer número de atributos de
objeto com uma chamada de método. Ao contrário dos métodos de Automação
correspondentes, que são invocados em lote, os de IDirectoryObject são executados
quando são chamados. IDirectoryObject não executa nenhum cache de atributo.

Clientes que não são de Automação podem chamar os métodos de IDirectoryObject


para otimizar o desempenho e aproveitar as interfaces de serviço de diretório nativo. Os
clientes de automação não podem usar IDirectoryObject. Em vez disso, eles devem usar
a interface IADs .

Dos provedores fornecidos pelo sistema ADSI, somente o provedor LDAP dá suporte a
essa interface.

Herança
A interface IDirectoryObject herda da interface IUnknown . IDirectoryObject também
tem esses tipos de membros:

Métodos
A interface IDirectoryObject tem esses métodos.

IDirectoryObject::CreateDSObject

Cria um filho do objeto de serviço de diretório atual.

IDirectoryObject::D eleteDSObject

Exclui um objeto folha em uma árvore de diretório.

IDirectoryObject::GetObjectAttributes

Recupera um ou mais atributos especificados do objeto de serviço de diretório.


IDirectoryObject::GetObjectInformation

O método IDirectoryObject::GetObjectInformation recupera um ponteiro para uma estrutura


ADS_OBJECT_INFO que contém dados sobre a identidade e o local de um objeto de serviço de
diretório.

IDirectoryObject::SetObjectAttributes

O método IDirectoryObject::SetObjectAttributes modifica dados em um ou mais atributos de


objeto especificados definidos na estrutura ADS_ATTR_INFO.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Iads

Comentários
Esta página foi útil?  Yes  No
Método
IDirectoryObject::CreateDSObject
(iads.h)
Artigo24/08/2023

O método IDirectoryObject::CreateDSObject cria um filho do objeto de serviço de


diretório atual.

Sintaxe
C++

HRESULT CreateDSObject(
[in] LPWSTR pszRDNName,
[in] PADS_ATTR_INFO pAttributeEntries,
[in] DWORD dwNumAttributes,
[out] IDispatch **ppObject
);

Parâmetros
[in] pszRDNName

Fornece o nome diferenciado relativo (caminho relativo) do objeto a ser criado.

[in] pAttributeEntries

Uma matriz de estruturas ADS_ATTR_INFO que contêm definições de atributo a serem


definidas quando o objeto é criado.

[in] dwNumAttributes

Fornece vários atributos definidos quando o objeto é criado.

[out] ppObject

Fornece um ponteiro para a interface IDispatch no objeto criado.

Valor retornado
Esse método retorna os valores retornados padrão, incluindo S_OK para uma operação
bem-sucedida. Para obter mais informações e outros valores retornados, consulte
Códigos de erro ADSI.

Comentários
Especifique todos os atributos a serem inicializados na criação na matriz
pAttributeEntries . Você também pode especificar atributos opcionais. Ao criar um objeto
de diretório com esse método, os atributos com qualquer um dos tipos de dados de
cadeia de caracteres não podem ser vazios ou de comprimento zero.

Exemplos
O exemplo de código C/C++ a seguir mostra como criar um objeto de usuário usando o
método IDirectoryObject::CreateDSObject .

C++

HRESULT hr;
IDirectoryObject *pDirObject=NULL;
ADSVALUE sAMValue;
ADSVALUE uPNValue;
ADSVALUE classValue;
LPDISPATCH pDisp;

ADS_ATTR_INFO attrInfo[] =
{
{ L"objectClass", ADS_ATTR_UPDATE,
ADSTYPE_CASE_IGNORE_STRING, &classValue, 1 },
{L"sAMAccountName", ADS_ATTR_UPDATE,
ADSTYPE_CASE_IGNORE_STRING, &sAMValue, 1},
{L"userPrincipalName", ADS_ATTR_UPDATE,
ADSTYPE_CASE_IGNORE_STRING, &uPNValue, 1},
};
DWORD dwAttrs = sizeof(attrInfo)/sizeof(ADS_ATTR_INFO);

classValue.dwType = ADSTYPE_CASE_IGNORE_STRING;
classValue.CaseIgnoreString = L"user";

sAMValue.dwType=ADSTYPE_CASE_IGNORE_STRING;
sAMValue.CaseIgnoreString = L"jeffsmith";

uPNValue.dwType=ADSTYPE_CASE_IGNORE_STRING;
uPNValue.CaseIgnoreString = L"jeffsmith@Fabrikam.com";

hr = ADsGetObject(L"LDAP://OU=Sales,DC=Fabrikam,DC=com",
IID_IDirectoryObject, (void**) &pDirObject );

if ( SUCCEEDED(hr) )
{
hr = pDirObject->CreateDSObject( L"CN=Jeff Smith", attrInfo,
dwAttrs, &pDisp );

if ( SUCCEEDED(hr) )
{
// Use the DS object.

pDisp->Release();
}

pDirObject->Release();
}

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

ADS_ATTR_INFO

IDirectoryObject

Comentários
Esta página foi útil?  Yes  No
Método IDirectoryObject::D
eleteDSObject (iads.h)
Artigo24/08/2023

O método IDirectoryObject::D eleteDSObject exclui um objeto folha em uma árvore de


diretório.

Sintaxe
C++

HRESULT DeleteDSObject(
LPWSTR pszRDNName
);

Parâmetros
pszRDNName

O nome diferenciado relativo (caminho relativo) do objeto a ser excluído.

Valor retornado
Esse método retorna os valores de retorno padrão, incluindo S_OK para uma operação
bem-sucedida. Para obter mais informações e outros valores retornados, consulte
Códigos de erro ADSI.

Comentários
Para excluir um objeto de contêiner e seus filhos, use o método IADsDeleteOps::D
eleteObject .

Exemplos

O exemplo de código C/C++ a seguir mostra como excluir um objeto de usuário.

C++
HRESULT hr;
IDirectoryObject *pDirObject=NULL;
hr = ADsGetObject(L"LDAP://OU=Sales,DC=Fabrikam,DC=com",
IID_IDirectoryObject, (void**) &pDirObject );

if ( SUCCEEDED(hr) )
{
hr = pDirObject->DeleteDSObject( L"CN=Jeff Smith" );

pDirObject->Release();
}

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

IADsDeleteOps::D eleteObject

IDirectoryObject

Comentários
Esta página foi útil?  Yes  No
Método
IDirectoryObject::GetObjectAttributes
(iads.h)
Artigo24/08/2023

O método IDirectoryObject::GetObjectAttributes recupera um ou mais atributos


especificados do objeto de serviço de diretório.

Sintaxe
C++

HRESULT GetObjectAttributes(
[in] LPWSTR *pAttributeNames,
[in] DWORD dwNumberAttributes,
[out] PADS_ATTR_INFO *ppAttributeEntries,
[out] DWORD *pdwNumAttributesReturned
);

Parâmetros
[in] pAttributeNames

Especifica uma matriz de nomes dos atributos solicitados.

Para solicitar todos os atributos do objeto, defina pAttributeNames como NULL e defina
o parâmetro dwNumberAttributes como (DWORD)-1.

[in] dwNumberAttributes

Especifica o tamanho da matriz pAttributeNames . Se -1, todos os atributos do objeto


serão solicitados.

[out] ppAttributeEntries

Ponteiro para uma variável que recebe um ponteiro para uma matriz de estruturas de
ADS_ATTR_INFO que contêm os valores de atributo solicitados. Se nenhum atributo
puder ser obtido do objeto de serviço de diretório, o ponteiro retornado será NULL.

[out] pdwNumAttributesReturned
Ponteiro para uma variável DWORD que recebe o número de atributos recuperados na
matriz ppAttributeEntries .

Valor retornado
Esse método retorna os valores padrão, bem como o seguinte:

Para obter mais informações e outros valores retornados, consulte Códigos de erro
ADSI.

Comentários
ADSI aloca a memória para a matriz de ADS_ATTR_INFO estruturas retornadas no
parâmetro ppAttributeEntries . O chamador deve chamar FreeADsMem para liberar a
matriz.

A ordem dos atributos retornados em ppAttributeEntries não é necessariamente a


mesma solicitada em pAttributeNames.

O método IDirectoryObject::GetObjectAttributes tenta ler a definição de esquema dos


atributos solicitados para que ele possa retornar os valores de atributo no formato
apropriado nas estruturas ADSVALUE contidas nas estruturas ADS_ATTR_INFO . No
entanto, GetObjectAttributes pode ter êxito mesmo quando a definição de esquema
não está disponível, nesse caso, o membro dwADsType da estrutura ADS_ATTR_INFO
retorna ADSTYPE_PROV_SPECIFIC e o valor é retornado em uma estrutura
ADS_PROV_SPECIFIC . Ao processar os resultados de uma chamada GetObjectAttributes
, verifique dwADsType para garantir que os dados foram retornados no formato
esperado.

Exemplos

O exemplo de código a seguir mostra como o método


IDirectoryObject::GetObjectAttributes pode ser usado.

C++

HRESULT hr;
IDirectoryObject *pDirObject = NULL;

hr = ADsGetObject(L"LDAP://CN=Jeff Smith,OU=Sales,DC=Fabrikam,DC=com",
IID_IDirectoryObject,
(void**) &pDirObject );
if ( SUCCEEDED(hr) )
{
ADS_ATTR_INFO *pAttrInfo=NULL;
DWORD dwReturn;
LPWSTR pAttrNames[]={L"givenName",L"sn", L"otherTelephone" };
DWORD dwNumAttr=sizeof(pAttrNames)/sizeof(LPWSTR);

//////////////////////////////////////////////////////
// Get attribute values requested.
// Be aware that the order is not necessarily the
// same as requested using pAttrNames.
//////////////////////////////////////////////////////
hr = pDirObject->GetObjectAttributes( pAttrNames,
dwNumAttr,
&pAttrInfo,
&dwReturn );

if ( SUCCEEDED(hr) )
{
for(DWORD idx = 0; idx < dwReturn; idx++ )
{
if ( _wcsicmp(pAttrInfo[idx].pszAttrName,L"givenName") == 0 )
{
switch (pAttrInfo[idx].dwADsType)
{
case ADSTYPE_CASE_IGNORE_STRING:
printf("First Name: %S\n",
pAttrInfo[idx].pADsValues->CaseIgnoreString);
break;

case ADSTYPE_PROV_SPECIFIC:
printf("First Name: %S\n",
pAttrInfo[idx].pADsValues->ProviderSpecific.lpValue);
break;

default:
printf("Invalid ADsType: %d\n",
pAttrInfo[idx].dwADsType);
break;
}
}
else if ( _wcsicmp(pAttrInfo[idx].pszAttrName, L"sn") == 0 )
{
switch (pAttrInfo[idx].dwADsType)
{
case ADSTYPE_CASE_IGNORE_STRING:
printf("Last Name: %S\n", pAttrInfo[idx].pADsValues-
>CaseIgnoreString);
break;

case ADSTYPE_PROV_SPECIFIC:
printf("Last Name: %S\n", pAttrInfo[idx].pADsValues-
>ProviderSpecific.lpValue);
break;
default:
printf("Invalid ADsType: %d\n",
pAttrInfo[idx].dwADsType);
break;
}
}
else if ( _wcsicmp(pAttrInfo[idx].pszAttrName,
L"otherTelephone") == 0 )
{ // Print the multi-valued property, "Other Telephones".
switch (pAttrInfo[idx].dwADsType)
{
case ADSTYPE_CASE_IGNORE_STRING:
printf("Other Telephones:");
for (DWORD val=0; val < pAttrInfo[idx].dwNumValues;
val++)
printf(" %S\n",
pAttrInfo[idx].pADsValues[val].CaseIgnoreString);
break;

case ADSTYPE_PROV_SPECIFIC:
printf("Other Telephones:");
for (DWORD val=0; val < pAttrInfo[idx].dwNumValues;
val++)
printf(" %S\n",
pAttrInfo[idx].pADsValues[val].CaseIgnoreString);
break;

default:
printf("Other Telephones:");
for (DWORD val=0; val < pAttrInfo[idx].dwNumValues;
val++)
printf(" %S\n",
pAttrInfo[idx].pADsValues[val].CaseIgnoreString);
break;
}
}
}

/////////////////////////////////////////////////////////////
// Use FreeADsMem for all memory obtained from the ADSI call.
/////////////////////////////////////////////////////////////
FreeADsMem( pAttrInfo );

pDirObject->Release();
}

Requisitos
Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

ADS_ATTR_INFO

FreeADsMem

IDirectoryObject

Comentários
Esta página foi útil?  Yes  No
Método
IDirectoryObject::GetObjectInformation
(iads.h)
Artigo24/08/2023

O método IDirectoryObject::GetObjectInformation recupera um ponteiro para uma


estrutura ADS_OBJECT_INFO que contém dados sobre a identidade e o local de um
objeto de serviço de diretório.

Sintaxe
C++

HRESULT GetObjectInformation(
[out] PADS_OBJECT_INFO *ppObjInfo
);

Parâmetros
[out] ppObjInfo

Fornece o endereço de um ponteiro para uma estrutura ADS_OBJECT_INFO que contém


dados sobre o objeto de serviço de diretório solicitado. Se ppObjInfo for NULL no
retorno, GetObjectInformation não poderá obter os dados solicitados.

Valor retornado
Esse método retorna os valores de retorno padrão, incluindo S_OK quando os dados
são obtidos com êxito. Para obter mais informações e outros valores retornados,
consulte Códigos de erro ADSI.

Comentários
O chamador deve chamar a função auxiliar FreeADsMem para liberar a estrutura
ADS_OBJECT_INFO criada pela função GetObjectInformation .

Os clientes de automação devem chamar IADs::GetInfo.


Exemplos
O exemplo de código C++ a seguir mostra como recuperar os dados do objeto
(ADS_OBJECT_INFO) usando o método GetObjectInformation de um objeto
(m_pDirObject) que implementa a interface IDirectoryObject .

C++

ADS_OBJECT_INFO *pInfo;
HRESULT hr;

hr = m_pDirObject->GetObjectInformation(&pInfo);
if (!SUCCEEDED(hr) )
{
return;
}

//////////////////////////
// Show the attributes
/////////////////////////

printf("RDN: %S\n", pInfo->pszRDN);


printf("ObjectDN: %S\n", pInfo->pszObjectDN);
printf("Parent DN: %S\n", pInfo->pszParentDN);
printf("Class Name: %S\n", pInfo->pszClassName);
printf("Schema DN: %S\n", pInfo->pszSchemaDN);

///////////////////////////////////////////////////////////
// Remember to clean up the memory using FreeADsMem.
//////////////////////////////////////////////////////////
FreeADsMem( pInfo );

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

ADS_OBJECT_INFO

IADs::GetInfo

IDirectoryObject

Comentários
Esta página foi útil?  Yes  No
Método
IDirectoryObject::SetObjectAttributes
(iads.h)
Artigo24/08/2023

O método IDirectoryObject::SetObjectAttributes modifica dados em um ou mais


atributos de objeto especificados definidos na estrutura ADS_ATTR_INFO .

Sintaxe
C++

HRESULT SetObjectAttributes(
[in] PADS_ATTR_INFO pAttributeEntries,
[in] DWORD dwNumAttributes,
[out] DWORD *pdwNumAttributesModified
);

Parâmetros
[in] pAttributeEntries

Fornece uma matriz de atributos a serem modificados. Cada atributo contém o nome do
atributo, a operação a ser executada e o valor do atributo, se aplicável. Para obter mais
informações, consulte a estrutura de ADS_ATTR_INFO .

[in] dwNumAttributes

Fornece o número de atributos a serem modificados. Esse valor deve corresponder ao


tamanho da matriz pAttributeEntries .

[out] pdwNumAttributesModified

Fornece um ponteiro para uma variável DWORD que contém o número de atributos
modificados pelo método SetObjectAttributes .

Valor retornado
Esse método retorna os valores de retorno padrão, incluindo S_OK quando os atributos
são definidos com êxito.

Para obter mais informações e outros valores retornados, consulte Códigos de erro
ADSI.

Comentários
No Active Directory (provedor LDAP), o método IDirectoryObject::SetObjectAttributes é
uma chamada transacionada. Os atributos são todos confirmados ou descartados.
Outros provedores de diretório podem não transacionar a chamada.

O Active Directory não permite valores duplicados em um atributo de vários valores. No


entanto, se você chamar SetObjectAttributes para acrescentar um valor duplicado a um
atributo de vários valores de um objeto do Active Directory, a chamada
SetObjectAttributes terá êxito, mas o valor duplicado será ignorado.

Da mesma forma, se você usar SetObjectAttributes para excluir um ou mais valores de


uma propriedade de vários valores de um objeto do Active Directory, a operação terá
êxito mesmo se qualquer ou todos os valores especificados não estiverem definidos
para a propriedade

Exemplos

O exemplo de código C++ a seguir define o atributo sn de um objeto de usuário como


o valor de Price como uma cadeia de caracteres que não diferencia maiúsculas de
minúsculas.

C++

HRESULT hr;
IDirectoryObject *pDirObject=NULL;
DWORD dwReturn;
ADSVALUE snValue;
ADS_ATTR_INFO attrInfo[] = { {L"sn",ADS_ATTR_UPDATE,
ADSTYPE_CASE_IGNORE_STRING, &snValue, 1} };
DWORD dwAttrs = sizeof(attrInfo)/sizeof(ADS_ATTR_INFO);

snValue.dwType=ADSTYPE_CASE_IGNORE_STRING;
snValue.CaseIgnoreString = L"Price";

hr = ADsGetObject(L"LDAP://CN=Jeff Smith,OU=Sales,DC=Fabrikam,DC=com",
IID_IDirectoryObject,
(void**) &pDirObject );

if ( SUCCEEDED(hr) )
{
hr = pDirObject->SetObjectAttributes(attrInfo, dwAttrs, &dwReturn);

pDirObject->Release();
}

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

ADS_ATTR_INFO

IDirectoryObject

Comentários
Esta página foi útil?  Yes  No
Interface IDirectorySchemaMgmt
(iads.h)
Artigo16/03/2023

A interface IDirectorySchemaMgmt não está implementada no momento e não deve


ser usada.

Herança
A interface IDirectorySchemaMgmt herda da interface IUnknown .
IDirectorySchemaMgmt também tem estes tipos de membros:

Comentários
Os métodos dessa interface não são totalmente implementados no momento.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Comentários
Esta página foi útil?  Yes  No
Interface IDirectorySearch (iads.h)
Artigo24/08/2023

A interface IDirectorySearch é uma interface COM pura que fornece um método de


baixa sobrecarga que os clientes que não são de Automação podem usar para executar
consultas no diretório subjacente.

Dos provedores fornecidos pelo sistema ADSI, somente o provedor LDAP dá suporte a
essa interface.

Herança
A interface IDirectorySearch herda da interface IUnknown . IDirectorySearch também
tem estes tipos de membros:

Métodos
A interface IDirectorySearch tem esses métodos.

IDirectorySearch::AbandonSearch

O método IDirectorySearch::AbandonSearch abandona uma pesquisa iniciada por uma chamada


anterior para o método ExecuteSearch.

IDirectorySearch::CloseSearchHandle

O método IDirectorySearch::CloseSearchHandle fecha o identificador para um resultado de


pesquisa e libera a memória associada.

IDirectorySearch::ExecuteSearch

O método IDirectorySearch::ExecuteSearch executa uma pesquisa e passa os resultados para o


chamador.

IDirectorySearch::FreeColumn

O método IDirectorySearch::FreeColumn libera memória que o método


IDirectorySearch::GetColumn alocou para dados para a coluna.

IDirectorySearch::GetColumn
O método IDirectorySearch::GetColumn obtém dados de uma coluna nomeada do resultado da
pesquisa.

IDirectorySearch::GetFirstRow

O método GetFirstRow obtém a primeira linha de um resultado de pesquisa. Esse método emitirá
ou emitirá novamente uma nova pesquisa, mesmo que esse método tenha sido chamado antes.

IDirectorySearch::GetNextColumnName

O método IDirectorySearch::GetNextColumnName obtém o nome da próxima coluna no resultado


da pesquisa que contém dados.

IDirectorySearch::GetNextRow

Obtém a próxima linha do resultado da pesquisa.

IDirectorySearch::GetPreviousRow

O método IDirectorySearch::GetPreviousRow obtém a linha anterior do resultado da pesquisa. Se


o provedor não fornecer suporte ao cursor, ele deverá retornar E_NOTIMPL.

IDirectorySearch::SetSearchPreference

Especifica uma preferência de pesquisa para obter dados em uma pesquisa subsequente.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Comentários
Esta página foi útil?  Yes  No
Método
IDirectorySearch::AbandonSearch
(iads.h)
Artigo24/08/2023

O método IDirectorySearch::AbandonSearch abandona uma pesquisa iniciada por uma


chamada anterior para o método ExecuteSearch .

Sintaxe
C++

HRESULT AbandonSearch(
[in] ADS_SEARCH_HANDLE phSearchResult
);

Parâmetros
[in] phSearchResult

Fornece um identificador para o contexto de pesquisa.

Valor retornado
Esse método retorna os valores retornados padrão, incluindo S_OK se a primeira linha
for obtida com êxito.

Para outros valores retornados, consulte Códigos de erro ADSI.

Comentários
IDirectorySearch::AbandonSearch poderá ser usado se as opções Page_Size ou
Assíncronas puderem ser especificadas por meio de
IDirectorySearch::SetSearchPreference antes que a pesquisa seja executada.

Exemplos
C++

LPWSTR pszAttr[] = { L"ADsPath", L"Name", L"samAccountName" };


ADS_SEARCH_HANDLE hSearch;
DWORD dwCount= sizeof(pszAttr)/sizeof(LPWSTR);
////////////////////////////////////////////////////////////////////
// NOTE: Assume that m_pSearch is an IDirectorySearch pointer to the
// object at the base of the search, and that the appropriate search
// preferences have been set.
// For brevity, omit error handling.
////////////////////////////////////////////////////////////////////

// Search for all users with a last name that starts with h.
hr = m_pSearch->ExecuteSearch(L"(&(objectClass=user)(sn=h*))", pszAttr,
dwCount, &hSearch );
while( m_pSearch->GetNextRow( hSearch) != S_ADS_NOMORE_ROWS )
{
// Get the samAccountName
hr = m_pSearch->GetColumn( hSearch, pszAttr[2], &col );
if ( FAILED(hr) )
{
hr = m_pSearch->AbandonSearch( hSearch );
hr = m_pSearch->CloseSearchHandle(hSearch);
m_pSearch->Release();
break;
}
if (col.dwADsType == ADSTYPE_CASE_IGNORE_STRING)
printf("%S\n", col.pADsValues->CaseIgnoreString);
m_pSearch->FreeColumn( &col );
}

m_pSearch->CloseSearchHandle( hSearch );

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll; Adsldp.dll; Adsldpc.dll

Confira também
Códigos de erro ADSI

Idirectorysearch

IDirectorySearch::ExecuteSearch

IDirectorySearch::SetSearchPreference

Comentários
Esta página foi útil?  Yes  No
Método
IDirectorySearch::CloseSearchHandle
(iads.h)
Artigo24/08/2023

O método IDirectorySearch::CloseSearchHandle fecha o identificador para um


resultado de pesquisa e libera a memória associada.

Sintaxe
C++

HRESULT CloseSearchHandle(
[in] ADS_SEARCH_HANDLE hSearchResult
);

Parâmetros
[in] hSearchResult

Fornece um identificador para o resultado da pesquisa a ser fechado.

Valor retornado
Esse método retorna os valores de retorno padrão, bem como os seguintes:

Para obter outros valores retornados, consulte Códigos de erro ADSI.

Comentários
O processo que implementa o método IDirectorySearch::CloseSearchHandle também
deve ser responsável por liberar toda a memória alocada pelo método
IDirectorySearch::ExecuteSearch , incluindo o resultado da pesquisa e o identificador de
resultado da pesquisa.

O chamador pode chamar esse método apenas uma vez para cada identificador de
pesquisa aberto e deve usar o método IDirectorySearch::ExecuteSearch para obter um
novo identificador de pesquisa depois de emitir IDirectorySearch::CloseSearchHandle.
Exemplos

C++

ADS_SEARCH_HANDLE hSearch;
HRESULT hr;
hr = m_pSearch->ExecuteSearch(L"(&(objectCategory=user)(l=Redmond))",
pszAttr, dwCount, &hSearch );
if ( SUCCEEDED(hr) )
{
// Omit getting the data
m_pSearch->CloseSearchHandle(hSearch);
}

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll; Adsldp.dll; Adsldpc.dll

Confira também
Códigos de erro ADSI

Idirectorysearch

IDirectorySearch::ExecuteSearch

Comentários
Esta página foi útil?  Yes  No
Método IDirectorySearch::ExecuteSearch
(iads.h)
Artigo24/08/2023

O método IDirectorySearch::ExecuteSearch executa uma pesquisa e passa os resultados


para o chamador. Alguns provedores, como o LDAP, adiarão a execução real até que o
chamador invoque o método IDirectorySearch::GetFirstRow ou o método
IDirectorySearch::GetNextRow .

Sintaxe
C++

HRESULT ExecuteSearch(
[in] LPWSTR pszSearchFilter,
[in] LPWSTR *pAttributeNames,
[in] DWORD dwNumberAttributes,
[out] PADS_SEARCH_HANDLE phSearchResult
);

Parâmetros
[in] pszSearchFilter

Uma cadeia de caracteres de filtro de pesquisa no formato LDAP, como "


(objectClass=user)".

[in] pAttributeNames

Uma matriz de nomes de atributo para os quais os dados são solicitados. Se NULL,
dwNumberAttributes deverá ser 0 ou 0xFFFFFFFF.

[in] dwNumberAttributes

O tamanho da matriz pAttributeNames . O valor especial 0xFFFFFFFF indica que


pAttributeNames é ignorado e pode ser NULL. Esse valor especial significa que todos os
atributos definidos são solicitados. Se esse valor for 0, a matriz pAttributeNames poderá
ser NULL. Nenhum atributo será solicitado.

[out] phSearchResult
O endereço de um identificador alocado pelo método para o contexto de pesquisa. O
chamador passa esse identificador para outros métodos de IDirectorySearch para
examinar o resultado da pesquisa. Se FOR NULL, a pesquisa não poderá ser executada.

Valor retornado
Esse método retorna os valores de retorno padrão, bem como os seguintes:

Para obter mais informações e outros valores retornados, consulte Códigos de erro
ADSI.

Comentários
Quando o filtro de pesquisa (pszSearchFilter) contém um atributo de tipo
ADS_UTC_TIME , ele deve ser do formato "yymmddhhmmssZ" em que "y", "m", "d", "h",
"m" e "s" representam o ano, mês, dia, hora, minuto e segundo, respectivamente. Nesse
formato, por exemplo, "10:20:00 13de maio de 1999" torna-se "990513102000Z". A letra
final "Z" é a sintaxe necessária e indicou o Tempo zulu ou o tempo coordenado
universal.

O chamador deve chamar IDirectorySearch::CloseSearchHandle para liberar a memória


alocada para o identificador de pesquisa e o resultado.

Ao usar o valor especial de 0xFFFFFFFF para dwNumberAttributes, a recuperação LDAP


de ADsPath ou distinguishedName não tem nenhum recurso extra ou custo de tempo.

Exemplos
O exemplo de código C++ a seguir mostra como invocar
IDirectorySearch::ExecuteSearch.

C++

LPWSTR pszAttr[] = { L"ADsPath", L"Name", L"samAccountName" };


ADS_SEARCH_HANDLE hSearch;
DWORD dwCount= sizeof(pszAttr)/sizeof(LPWSTR);

// Search for users with a last name that begins with "h".
hr = m_pSearch->ExecuteSearch(L"(&(objectClass=user)(sn=h*))", pszAttr,
dwCount, &hSearch );

Requisitos
Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll; Adsldp.dll; Adsldpc.dll

Confira também
Códigos de erro ADSI

Idirectorysearch

IDirectorySearch::CloseSearchHandle

IDirectorySearch::GetFirstRow

IDirectorySearch::GetNextRow

Comentários
Esta página foi útil?  Yes  No
Método IDirectorySearch::FreeColumn
(iads.h)
Artigo24/08/2023

O método IDirectorySearch::FreeColumn libera memória que o método


IDirectorySearch::GetColumn alocou para dados para a coluna.

Sintaxe
C++

HRESULT FreeColumn(
[in] PADS_SEARCH_COLUMN pSearchColumn
);

Parâmetros
[in] pSearchColumn

Fornece um ponteiro para a coluna a ser liberada.

Valor retornado
Esse método retorna os valores de retorno padrão, bem como os seguintes:

Para obter outros valores retornados, consulte Códigos de erro ADSI.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll; Adsldp.dll; Adsldpc.dll


Confira também
Códigos de erro ADSI

Idirectorysearch

IDirectorySearch::GetColumn

Comentários
Esta página foi útil?  Yes  No
Método IDirectorySearch::GetColumn
(iads.h)
Artigo24/08/2023

O método IDirectorySearch::GetColumn obtém dados de uma coluna nomeada do


resultado da pesquisa.

Sintaxe
C++

HRESULT GetColumn(
[in] ADS_SEARCH_HANDLE hSearchResult,
[in] LPWSTR szColumnName,
[out] PADS_SEARCH_COLUMN pSearchColumn
);

Parâmetros
[in] hSearchResult

Fornece um identificador para o contexto de pesquisa.

[in] szColumnName

Fornece o nome da coluna para a qual os dados são solicitados.

[out] pSearchColumn

Fornece o endereço de uma estrutura ADS_SEARCH_COLUMN alocada pelo método que


contém a coluna da linha atual do resultado da pesquisa.

Valor retornado
Esse método retorna os valores de retorno padrão, bem como os seguintes.

Para obter outros valores retornados, consulte Códigos de erro ADSI.

Comentários
O método aloca a memória para a estrutura ADS_SEARCH_COLUMN manter os dados
da coluna. Mas o chamador deve liberar a memória chamando
IDirectorySearch::FreeColumn.

O método IDirectorySearch::GetColumn tenta ler a definição de esquema do atributo


solicitado para que ele possa retornar os valores de atributo no formato apropriado nas
estruturas ADSVALUE , contidas na estrutura ADS_SEARCH_COLUMN . No entanto,
GetColumn pode ter êxito mesmo quando a definição de esquema não está disponível;
nesse caso, o membro dwADsType da estrutura ADS_SEARCH_COLUMN retorna
ADSTYPE_PROV_SPECIFIC e o valor é retornado em uma estrutura ADS_PROV_SPECIFIC .
Ao processar os resultados de uma chamada GetColumn , você deve verificar
dwADsType para garantir que os dados foram retornados no formato esperado.

Exemplos

C++

ADS_SEARCH_COLUMN col;
/*.. Omit the set preference and execute*/
while( m_pSearch->GetNextRow( hSearch) != S_ADS_NOMORE_ROWS )
{
// Get the Name and display it in the list.
hr = m_pSearch->GetColumn( hSearch, pszAttr[0], &col );
if ( SUCCEEDED(hr) )
{
switch (col.dwADsType)
{
case ADSTYPE_CASE_IGNORE_STRING:
printf("%S\n", col.pADsValues->CaseIgnoreString);
break;

case ADSTYPE_PROV_SPECIFIC:
printf("%S\n", col.pADsValues->ProviderSpecific.lpValue);
break;

default:
printf("Unexpected ADsType: %d\n", col.dwADsType);
break;
}

{
m_pSearch->FreeColumn( &col );
}
}

}
m_pSearch->CloseSearchHandle( hSearch );

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll; Adsldp.dll; Adsldpc.dll

Confira também
Códigos de erro ADSI

ADS_SEARCH_COLUMN

Idirectorysearch

IDirectorySearch::FreeColumn

Comentários
Esta página foi útil?  Yes  No
Método IDirectorySearch::GetFirstRow
(iads.h)
Artigo24/08/2023

O método GetFirstRow obtém a primeira linha de um resultado de pesquisa. Esse


método emitirá ou reemitirá uma nova pesquisa, mesmo que esse método tenha sido
chamado antes.

Sintaxe
C++

HRESULT GetFirstRow(
[in] ADS_SEARCH_HANDLE hSearchResult
);

Parâmetros
[in] hSearchResult

Contém o identificador de pesquisa obtido chamando IDirectorySearch::ExecuteSearch.

Valor retornado
Esse método retorna os valores de retorno padrão, bem como o seguinte:

Para obter mais informações, consulte Códigos de erro ADSI.

Comentários
Quando o sinalizador ADS_SEARCHPREF_CACHE_RESULTS não está definido, ou seja,
FALSE, somente a rolagem para frente é permitida, pois o cliente pode não armazenar
em cache todos os resultados da consulta. Chamar GetFirstRow mais de uma vez da
mesma linha requer alguma rolagem de fundo e pode resultar em resultados incorretos
para uma pesquisa paginada ou assíncrona iniciada por meio do OLE DB quando os
resultados não têm garantia de permanecer no cache.

Exemplos
C++

hr = m_pSearch->ExecuteSearch(L"(objectCategory=contact)", pszAttr, dwCount,


&hSearch);
if(SUCCEEDED(hr))
{
while(SUCCEEDED(hr = m_pSearch->GetNextRow(hSearch)))
{
if(S_OK == hr)
{
// Get the data.
}
else if(S_ADS_NOMORE_ROWS == hr)
{
// Call ADsGetLastError to see if the search is waiting for a
response.
DWORD dwError = ERROR_SUCCESS;
WCHAR szError[512];
WCHAR szProvider[512];

ADsGetLastError(&dwError, szError, 512, szProvider, 512);


if(ERROR_MORE_DATA != dwError)
{
break;
}
}
else
{
break;
}
}

m_pSearch->CloseSearchHandle(hSearch);
}

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll; Adsldp.dll; Adsldpc.dll


Confira também
Códigos de erro ADSI

Idirectorysearch

IDirectorySearch::ExecuteSearch

Comentários
Esta página foi útil?  Yes  No
Método
IDirectorySearch::GetNextColumnName
(iads.h)
Artigo24/08/2023

O método IDirectorySearch::GetNextColumnName obtém o nome da próxima coluna


no resultado da pesquisa que contém dados.

Sintaxe
C++

HRESULT GetNextColumnName(
[in] ADS_SEARCH_HANDLE hSearchHandle,
[out] LPWSTR *ppszColumnName
);

Parâmetros
[in] hSearchHandle

Fornece um identificador para o contexto de pesquisa.

[out] ppszColumnName

Fornece o endereço de um ponteiro para uma cadeia de caracteres alocada pelo


método que contém o nome da coluna solicitada. Se FOR NULL, nenhuma linha
subsequente conterá dados.

Valor retornado
Esse método retorna os valores de retorno padrão, bem como os seguintes:

Para obter outros valores retornados, consulte Códigos de erro ADSI.

Comentários
Esse método aloca memória suficiente para o nome da coluna, mas o chamador deve
chamar a função auxiliar FreeADsMem para liberar essa memória quando ela não for
mais necessária.

Exemplos

C++

LPWSTR pszColumn;
m_pSearch->GetFirstRow( hSearch );
printf("Column names are: ");
while( m_pSearch->GetNextColumnName( hSearch, &pszColumn ) !=
S_ADS_NOMORE_COLUMNS )
{
printf("%S ", pszColumn );
FreeADsMem( pszColumn );
}

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll; Adsldp.dll; Adsldpc.dll

Confira também
Códigos de erro ADSI

FreeADsMem

Idirectorysearch

Comentários
Esta página foi útil?
 Yes  No
Método IDirectorySearch::GetNextRow
(iads.h)
Artigo24/08/2023

O método GetNextRow obtém a próxima linha do resultado da pesquisa. Se


IDirectorySearch::GetFirstRow não tiver sido chamado, GetNextRow emitirá uma nova
pesquisa a partir da primeira linha. Caso contrário, esse método avançará para a
próxima linha.

Sintaxe
C++

HRESULT GetNextRow(
[in] ADS_SEARCH_HANDLE hSearchResult
);

Parâmetros
[in] hSearchResult

Contém o identificador de pesquisa obtido chamando IDirectorySearch::ExecuteSearch.

Valor retornado
Esse método retorna os valores de retorno padrão, bem como o seguinte:

Para obter mais informações, consulte Códigos de erro ADSI.

Comentários
Quando o sinalizador ADS_SEARCHPREF_CACHE_RESULTS não está definido, somente
a rolagem para frente é permitida, pois o cliente pode não armazenar em cache todos
os resultados da consulta.

O provedor de diretório pode limitar o número máximo de linhas disponíveis em uma


pesquisa. Por exemplo, em um domínio do Windows, o número máximo de linhas que
serão fornecidas em uma pesquisa do Active Directory é de 1000 linhas. Se a pesquisa
resultar em mais do que o limite de linha, uma pesquisa paginada deverá ser executada
para obter todas as linhas na pesquisa. Para obter mais informações sobre pesquisas
paginadas, consulte Paginação com IDirectorySearch.

Exemplos

C++

hr = m_pSearch->ExecuteSearch(L"(objectCategory=contact)", pszAttr, dwCount,


&hSearch);
if(SUCCEEDED(hr))
{
while(SUCCEEDED(hr = m_pSearch->GetNextRow(hSearch)))
{
if(S_OK == hr)
{
// Get the data.
}
else if(S_ADS_NOMORE_ROWS == hr)
{
// Call ADsGetLastError to see if the search is waiting for a
response.
DWORD dwError = ERROR_SUCCESS;
WCHAR szError[512];
WCHAR szProvider[512];

ADsGetLastError(&dwError, szError, 512, szProvider, 512);


if(ERROR_MORE_DATA != dwError)
{
break;
}
}
else
{
break;
}
}

m_pSearch->CloseSearchHandle(hSearch);
}

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008


Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll; Adsldp.dll; Adsldpc.dll

Confira também
Códigos de erro ADSI

ADsGetLastError

Idirectorysearch

IDirectorySearch::ExecuteSearch

IDirectorySearch::GetFirstRow

Comentários
Esta página foi útil?  Yes  No
Método
IDirectorySearch::GetPreviousRow
(iads.h)
Artigo24/08/2023

O método IDirectorySearch::GetPreviousRow obtém a linha anterior do resultado da


pesquisa. Se o provedor não fornecer suporte ao cursor, ele deverá retornar
E_NOTIMPL.

Sintaxe
C++

HRESULT GetPreviousRow(
[in] ADS_SEARCH_HANDLE hSearchResult
);

Parâmetros
[in] hSearchResult

Fornece um identificador para o contexto de pesquisa.

Valor retornado
Esse método retorna os valores de retorno padrão, bem como o seguinte:

Para outros valores retornados, consulte Códigos de erro ADSI.

Comentários
Quando o sinalizador ADS_SEARCHPREF_CACHE_RESULTS não está definido, somente
a rolagem para frente é permitida, pois o cliente pode não armazenar em cache todos
os resultados da consulta.

Exemplos
C++

hr = m_pSearch->ExecuteSearch(L"(&(objectCategory=user)(st=WA))", pszAttr,
dwCount, &hSearch );
if ( SUCCEEDED(hr) )
{
while( m_pSearch->GetNextRow(hSearch) != S_ADS_NOMORE_ROWS )
{
/* Get the data */
}
// Print it backward
hr = m_pSearch->GetPreviousRow( hSearch );
while( hr != S_ADS_NOMORE_ROWS && hr != E_NOTIMPL)
{
/* Get the data */
}
m_pSearch->CloseSearchHandle(hSearch);
}

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll; Adsldp.dll; Adsldpc.dll

Confira também
Códigos de erro ADSI

Idirectorysearch

Comentários
Esta página foi útil?  Yes  No
Método
IDirectorySearch::SetSearchPreference
(iads.h)
Artigo24/08/2023

O método IDirectorySearch::SetSearchPreference especifica uma preferência de


pesquisa para obter dados em uma pesquisa subsequente.

Sintaxe
C++

HRESULT SetSearchPreference(
[in] PADS_SEARCHPREF_INFO pSearchPrefs,
[in] DWORD dwNumPrefs
);

Parâmetros
[in] pSearchPrefs

Fornece uma matriz alocada pelo chamador de estruturas de ADS_SEARCHPREF_INFO


que contêm as preferências de pesquisa a serem definidas.

[in] dwNumPrefs

Fornece o tamanho da matriz pSearchPrefs .

Valor retornado
Esse método dá suporte aos valores retornados padrão, bem como aos seguintes:

Para obter mais informações e outros valores retornados, consulte Códigos de erro
ADSI.

Requisitos
Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll; Adsldp.dll; Adsldpc.dll

Confira também
Códigos de erro ADSI

ADS_SEARCHPREF_INFO

Idirectorysearch

Comentários
Esta página foi útil?  Yes  No
Interfaces de extensão
Artigo • 03/06/2023

Esta seção descreve a interface IADsExtension e seus métodos.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interface IADsExtension (iads.h)
Artigo24/08/2023

A interface IADsExtension forma a base do modelo de extensão de aplicativo ADSI. Ele


permite que um ISV (fornecedor independente de software) adicione comportamentos
específicos do aplicativo, como métodos ou funções, a um objeto ADSI existente. Vários
fornecedores podem estender independentemente os recursos do mesmo objeto para
executar operações semelhantes, mas não relacionadas.

O modelo de extensão é baseado no modelo de agregação no COM. Um agregador, ou


objeto externo, pode adicionar à sua base de métodos, aqueles de um objeto de
agregação ou objeto interno. Um objeto de extensão ADSI, que implementa a interface
IADsExtension , é um objeto de agregação, enquanto um provedor ADSI é um
agregador.

Nota Ao implementar um módulo de extensão, libere uma interface quando


terminar com ele. Caso contrário, o agregador não poderá liberar a interface
mesmo quando não for mais necessário.

A interface IADsExtension pode ser usada da seguinte maneira:

O componente de extensão requer uma notificação de inicialização conforme


definido pelo dwCode no método Operate . Nesse caso, um cliente de extensão
deve chamar o método Operate . Os outros dois métodos, ou seja, PrivateInvoke e
PrivateGetIDsOfNames, geralmente retornam E_NOTIMPL no valor HRESULT .
O componente de extensão dá suporte a qualquer interface dupla ou de
expedição. Nesse caso, um cliente de extensão deve chamar os métodos
PrivateGetIDsOfNames ou PrivateInvoke . Operar geralmente ignora os dados e
retorna E_NOTIMPL no valor HRESULT .

Herança
A interface IADsExtension herda da interface IUnknown . IADsExtension também tem
estes tipos de membros:

Métodos
A interface IADsExtension tem esses métodos.
IADsExtension::Operate

Interpreta o código de controle e os parâmetros de entrada de acordo com as especificações do


provedor.

IADsExtension::P rivateGetIDsOfNames

O método IADsExtension::P rivateGetIDsOfNames é chamado pelo agregador, ADSI, depois que


ADSI determina que a extensão é usada para dar suporte a uma interface dupla ou de expedição.
O método pode usar os dados de tipo para obter DISPID usando IDispatch::GetIDsOfNames.

IADsExtension::P rivateInvoke

O método IADsExtension::P rivateInvoke normalmente é chamado pelo ADSI após o método


IADsExtension::P rivateGetIDsOfNames. Esse método pode ter uma implementação personalizada
ou pode delegar a operação ao método IDispatch::D ispInvoke.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Comentários
Esta página foi útil?  Yes  No
Método IADsExtension::Operate (iads.h)
Artigo24/08/2023

O método IADsExtension::Operate é invocado pelo agregador para executar a


funcionalidade estendida. O método interpreta o código de controle e os parâmetros de
entrada de acordo com as especificações do provedor. Para obter mais informações,
consulte a documentação do provedor.

Sintaxe
C++

HRESULT Operate(
[in] DWORD dwCode,
[in] VARIANT varData1,
[in] VARIANT varData2,
[in] VARIANT varData3
);

Parâmetros
[in] dwCode

Um valor do código de controle de extensão ADSI. ADSI define o valor de código a


seguir.

ADS_EXT_INITCREDENTIALS
Verifica as credenciais do usuário no objeto de extensão.

[in] varData1

Dados fornecidos pelo provedor nos quais o objeto de extensão funcionará. O valor
depende do valor do código de controle e, no momento, é indefinido.

[in] varData2

Dados fornecidos pelo provedor nos quais o objeto de extensão funcionará. O valor
depende do valor do código de controle e, no momento, é indefinido.

[in] varData3
Dados fornecidos pelo provedor nos quais o objeto de extensão funcionará. O valor
depende do valor do código de controle e, no momento, é indefinido.

Valor retornado
Esse método dá suporte aos valores retornados padrão, bem como aos seguintes:

Para obter mais informações sobre outros valores retornados, consulte Códigos de erro
ADSI.

Comentários
O agregador ignorará os valores retornados E_FAIL e E_NOTIMPL .

Exemplos
O exemplo de código C/C++ a seguir mostra uma implementação genérica.

C++

STDMETHOD(Operate)(ULONG dwCode, VARIANT varData1, VARIANT varData2, VARIANT


varData3)
{
HRESULT hr = S_OK;
switch (dwCode)
{
case ADS_EXT_INITCREDENTIALS:
// Prompt for a credential.
// MessageBox(NULL, "INITCRED", "ADsExt", MB_OK);

break;
default:
hr = E_FAIL;
break;
}
return hr;
}

Requisitos

Cliente mínimo com suporte Windows Vista


Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

IADsExtension

Comentários
Esta página foi útil?  Yes  No
Método IADsExtension::P
rivateGetIDsOfNames (iads.h)
Artigo24/08/2023

O método IADsExtension::P rivateGetIDsOfNames é chamado pelo agregador, ADSI,


depois que ADSI determina que a extensão é usada para dar suporte a uma interface
dupla ou de expedição. O método pode usar os dados de tipo para obter DISPID
usando IDispatch::GetIDsOfNames.

Sintaxe
C++

HRESULT PrivateGetIDsOfNames(
REFIID riid,
OLECHAR **rgszNames,
unsigned int cNames,
LCID lcid,
DISPID *rgDispid
);

Parâmetros
riid

Reservado para uso futuro. Deve ser IID_NULL.

rgszNames

Matriz passada de nomes a serem mapeados.

cNames

Contagem dos nomes a serem mapeados.

lcid

O contexto de localidade no qual interpretar os nomes.

rgDispid
Matriz alocada pelo chamador, cada elemento do qual contém um identificador que
corresponde a um dos nomes passados na matriz rgszNames . O primeiro elemento
representa o nome do membro. Os elementos subsequentes representam cada um dos
parâmetros do membro.

Valor retornado
Os valores retornados são os mesmos do método IDispatch::GetIDsOfNames padrão.
Para obter mais informações sobre outros valores retornados, consulte Códigos de erro
ADSI.

Comentários
Todos os parâmetros têm o mesmo significado que os correspondentes no
IDispatch::GetIDsOfNames(). O componente de extensão retorna um identificador
exclusivo (rgDispID) para cada método ou propriedade definida nas interfaces duplas
com suporte. A exclusividade é imposta dentro do componente de extensão. O
provedor ADSI deve garantir a exclusividade dos DISPIDs de todos os objetos de
extensão e do agregador (ADSI) em si. O parâmetro rgDispID deve estar entre 1 e
16777215 (2^24-1) ou -1 (DISPID_UNKNOWN).

Exemplos

O exemplo de código C/C++ a seguir mostra uma implementação genérica desse


método.

C++

STDMETHOD(PrivateGetIDsOfNames)(REFIID riid, OLECHAR ** rgszNames, unsigned


int cNames, LCID lcid, DISPID * rgdispid)
{
if (rgdispid == NULL)
{
return E_POINTER;
}
return DispGetIDsOfNames(m_pTypeInfo, rgszNames, cNames, rgdispid);
}

Requisitos
Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

IADsExtension

IADsExtension::P rivateInvoke

IDispatch::GetIDsOfNames

Comentários
Esta página foi útil?  Yes  No
Método IADsExtension::P rivateInvoke
(iads.h)
Artigo24/08/2023

O método IADsExtension::P rivateInvoke normalmente é chamado por ADSI após o


método IADsExtension::P rivateGetIDsOfNames . Esse método pode ter uma
implementação personalizada ou pode delegar a operação ao método IDispatch::D
ispInvoke .

Sintaxe
C++

HRESULT PrivateInvoke(
[in] DISPID dispidMember,
[in] REFIID riid,
[in] LCID lcid,
[in] WORD wFlags,
[in] DISPPARAMS *pdispparams,
[out] VARIANT *pvarResult,
[out] EXCEPINFO *pexcepinfo,
[out] unsigned int *puArgErr
);

Parâmetros
[in] dispidMember

Identifica o membro. Use o método IADsExtension::P rivateGetIDsOfNames para obter o


identificador de expedição.

[in] riid

Reservado para uso futuro. Deve ser IID_NULL.

[in] lcid

O contexto de localidade no qual interpretar argumentos. A função IADsExtension::P


rivateGetIDsOfNames usa lcid. Ele também é passado para o método PrivateInvoke para
permitir que o objeto interprete os argumentos específicos de uma localidade.

[in] wFlags
Os sinalizadores que descrevem o contexto da chamada PrivateInvoke incluem.

DISPATCH_METHOD
O membro é invocado como um método . Se uma propriedade tiver o mesmo nome,
esse e o sinalizador DISPATCH_PROPERTYGET poderão ser definidos.

DISPATCH_PROPERTYGET

O membro é recuperado como uma propriedade ou membro de dados.

DISPATCH_PROPERTYPUT

O membro é alterado como uma propriedade ou membro de dados.

DISPATCH_PROPERTYPUTREF

O membro é alterado por uma atribuição de referência, em vez de uma atribuição de


valor. Esse sinalizador é válido somente quando a propriedade aceita uma referência a
um objeto .

[in] pdispparams

Ponteiro para uma estrutura DISPPARAMS que recebe uma matriz de argumentos, uma
matriz de DISPIDs de argumento para argumentos nomeados e contagens para o
número de elementos nas matrizes.

[out] pvarResult

Ponteiro para o local onde o resultado deve ser armazenado ou NULL se o chamador
não espera nenhum resultado. Esse argumento será ignorado se
DISPATCH_PROPERTYPUT ou DISPATCH_PROPERTYPUTREF for especificado.

[out] pexcepinfo

Ponteiro para uma estrutura que contém dados de exceção. Essa estrutura deverá ser
preenchida se DISP_E_EXCEPTION for retornado. Pode ser NULL.

[out] puArgErr

O índice dentro do membro rgvarg da estrutura DISPPARAMS em pdispparams para o


primeiro argumento que tem um erro. Os argumentos são armazenados na matriz
rgvarg em ordem inversa, portanto, o primeiro argumento é aquele com o índice mais
alto na matriz. Esse parâmetro é retornado somente quando o valor retornado
resultante é DISP_E_TYPEMISMATCH ou DISP_E_PARAMNOTFOUND.

Valor retornado
Esse método dá suporte aos valores retornados padrão, bem como aos seguintes.

Para obter mais informações sobre outros valores retornados, consulte Códigos de erro
ADSI.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

Dispinvoke

IADsExtension

IADsExtension::P rivateGetIDsOfNames

Comentários
Esta página foi útil?  Yes  No
Interfaces do utilitário
Artigo • 03/06/2023

Esta seção descreve as seguintes interfaces de utilitário:

IADsADSystemInfo
IADsDeleteOps
IADsNameTranslate
IADsObjectOptions
IADsPathname
IADsWinNTSystemInfo

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interface IADsADSystemInfo (iads.h)
Artigo24/08/2023

A interface IADsADSystemInfo recuperará dados sobre o computador local se ele


estiver executando um sistema operacional Windows em um domínio do Windows. Por
exemplo, você pode obter o domínio, o site e o nome diferenciado do computador
local.

A interface IADsADSystemInfo é implementada no objeto ADSystemInfo que reside em


adsldp.dll, que está incluído na instalação padrão do ADSI no Windows 2000. Você deve
criar explicitamente uma instância do objeto ADSystemInfo para chamar os métodos na
interface IADsADSystemInfo . Esse requisito equivale à criação de uma instância
ADSystemInfo com a função CoCreateInstance em C/C++.

C++

IADsADSystemInfo *pADsys;
HRESULT hr = CoCreateInstance(CLSID_ADSystemInfo,
NULL,
CLSCTX_INPROC_SERVER,
IID_IADsADSystemInfo,
(void**)&pADsys);

Você também pode usar o operador Novo no Visual Basic.

VB

Dim adSys as New ADSystemInfo

Ou você pode chamar a função CreateObject em um ambiente de script, fornecendo


"ADSystemInfo" como o ProgID.

VB

Dim adSys
Set adSys = CreateObject("ADSystemInfo")

Herança
A interface IADsADSystemInfo herda da interface IDispatch . IADsADSystemInfo
também tem estes tipos de membros:
Métodos
A interface IADsADSystemInfo tem esses métodos.

IADsADSystemInfo::GetAnyDCName

Recupera o nome DNS de um controlador de domínio no domínio do computador local.

IADsADSystemInfo::GetDCSiteName

Recupera o nome do site do Active Directory que contém o computador local.

IADsADSystemInfo::GetTrees

Recupera os nomes DNS de todas as árvores de diretório na floresta do computador local.

IADsADSystemInfo::RefreshSchemaCache

O método IADsADSystemInfo::RefreshSchemaCache atualiza o cache de esquema do Active


Directory.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Cocreateinstance

Métodos de propriedade IADsADSystemInfo

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos de propriedade
IADsADSystemInfo
Artigo • 03/06/2023

Os métodos de propriedade da interface IADsADSystemInfo obtêm ou definem as


propriedades descritas na tabela a seguir. Para obter mais informações, consulte
métodos de propriedade interface.

Propriedades
ComputerName

Recupera o nome diferenciado do computador local.

Tipo de acesso: Somente leitura

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_ComputerName(
[out] BSTR* pbstrComputer
);

DomainDNSName

Recupera o nome DNS do domínio do computador local, como


"domainName.companyName.com".

Tipo de acesso: Somente leitura

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_DomainDNSName(
[out] BSTR* pbstr
);

DomainShortName
Recupera o nome curto do domínio do computador local, como "domainName".

Tipo de acesso: Somente leitura

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_DomainShortName(
[out] BSTR* pbstrDSN
);

ForestDNSName

Recupera o nome DNS da floresta do computador local.

Tipo de acesso: Somente leitura

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_ForestDNSName(
[out] BSTR* pbstr
);

IsNativeMode

Determina se o domínio do computador local está no modo nativo ou misto.

Tipo de acesso: Somente leitura

Tipo de dados de script: BOOL

syntax

// C++ method syntax


HRESULT get_IsNativeMode(
[out] BOOL* pvBool
);

PDCRoleOwner

Recupera o nome diferenciado do objeto DSA (agente de serviço de diretório) para o


DC que possui a função de controlador de domínio primário no domínio do
computador local.

Tipo de acesso: Somente leitura

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_PDCRoleOwner(
[out] BSTR* pbstr
);

Schemaroleowner

Recupera o nome diferenciado do objeto DSA (agente de serviço de diretório) para o


DC que possui a função mestra de esquema na floresta do computador local.

Tipo de acesso: Somente leitura

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_SchemaRoleOwner(
[out] BSTR* pbstr
);

SiteName

Recupera o nome do site do computador local.

Tipo de acesso: Somente leitura

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_SiteName(
[out] BSTR* pbstrSite
);

UserName
Recupera o nome diferenciado do Active Directory do usuário atual, que é o usuário
conectado ou o usuário representado pelo thread de chamada.

Tipo de acesso: Somente leitura

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_UserName(
[out] BSTR* pbstrUser
);

Exemplos
O exemplo de código C++ a seguir recupera as informações do sistema Windows. Para
fins de brevidade, a verificação de erros é omitida.

C++

#include <activeds.h>
#include <stdio.h>

int main()
{
HRESULT hr;

hr = CoInitialize(NULL);

IADsADSystemInfo *pSys;
hr = CoCreateInstance(CLSID_ADSystemInfo,
NULL,
CLSCTX_INPROC_SERVER,
IID_IADsADSystemInfo,
(void**)&pSys);

BSTR bstr;
hr = pSys->get_UserName(&bstr);
if (SUCCEEDED(hr)) {
printf("User: %S\n", bstr);
SysFreeString(bstr);
}

hr = pSys->get_ComputerName(&bstr);
if (SUCCEEDED(hr)) {
printf("Computer: %S\n", bstr);
SysFreeString(bstr);
}
hr = pSys->get_DomainDNSName(&bstr);
if (SUCCEEDED(hr)) {
printf("Domain: %S\n", bstr);
SysFreeString(bstr);
}

hr = pSys->get_PDCRoleOwner(&bstr);
if (SUCCEEDED(hr)) {
printf("PDC Role owner: %S\n", bstr);
SysFreeString(bstr);
}

if(pSys) {
pSys->Release();
}

CoUninitialize();
return 0;
}

O exemplo de código Visual Basic a seguir recupera as informações do sistema


Windows.

VB

Dim sys As New ADSystemInfo


Debug.print "User: " & sys.UserName
Debug.print "Computer: " & sys.ComputerName
Debug.print "Domain: " & sys.DomainDNSName
Debug.print "PDC Role Owner: " & sys.PDCRoleOwner

O exemplo de código VBScript/ASP a seguir recupera as informações do sistema


Windows.

VB

<%
Dim sys
Set sys = CreateObject("ADSystemInfo")
Response.Write "User: " & sys.UserName
Response.Write "Computer: " & sys.ComputerName
Response.Write "Domain: " & sys.DomainDNSName
Response.Write "PDC Role Owner: " & sys.PDCRoleOwner
%>

Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsADSystemInfo é definido como 5BB11929-AFD1-11D2-9CB9-


0000F87A369E

Confira também
IADsADSystemInfo

Cocreateinstance

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Método
IADsADSystemInfo::GetAnyDCName
(iads.h)
Artigo24/08/2023

O método IADsADSystemInfo::GetAnyDCName recupera o nome DNS de um


controlador de domínio no domínio do computador local.

Sintaxe
C++

HRESULT GetAnyDCName(
[out] BSTR *pszDCName
);

Parâmetros
[out] pszDCName

Nome de um controlador de domínio, como "ADServer1.domain1.Fabrikam.com".

Valor retornado
Esse método dá suporte aos valores de retorno HRESULT padrão. Para obter mais
informações, consulte Códigos de erro ADSI.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h
DLL Activeds.dll

Confira também
Códigos de erro ADSI

IADsADSystemInfo

Comentários
Esta página foi útil?  Yes  No
Método
IADsADSystemInfo::GetDCSiteName
(iads.h)
Artigo24/08/2023

O método IADsADSystemInfo::GetDCSiteName recupera o nome do site do Active


Directory que contém o computador local.

Sintaxe
C++

HRESULT GetDCSiteName(
[out] BSTR szServer,
[in] BSTR *pszSiteName
);

Parâmetros
[out] szServer

Nome do site do Active Directory.

[in] pszSiteName

Nome DNS do servidor de serviço.

Valor retornado
Esse método dá suporte aos valores de retorno HRESULT padrão. Para obter mais
informações, consulte Códigos de erro ADSI.

Comentários
Um site do Active Directory é uma ou mais sub-redes TCP/IP bem conectadas que
contêm controladores de domínio do Active Directory. Para obter mais informações,
consulte Conceitos principais do Active Directory.
Exemplos
O exemplo de código C++ a seguir recupera o nome do site do Active Directory. Para
resumir, a verificação de erros é omitida.

C++

#include <activeds.h>
#include <stdio.h>

int main()
{
HRESULT hr;

hr = CoInitialize(NULL);

IADsADSystemInfo *pSys;
hr = CoCreateInstance(CLSID_ADSystemInfo,
NULL,
CLSCTX_INPROC_SERVER,
IID_IADsADSystemInfo,
(void**)&pSys);

BSTR siteName;
BSTR dnsServer;
hr = pSys->GetAnyDCName(&dnsServer);

if (SUCCEEDED(hr)) {
printf("Domain controller: %S\n", dnsServer);

hr = pSys->GetDCSiteName(&siteName);
if (SUCCEEDED(hr)) {
printf("Domain controller site: %S\n", siteName);
SysFreeString(siteName);
}

SysFreeString(dnsServer);
}

if(pSys) {
pSys->Release();
}

CoUninitialize();
return 0;
}

O exemplo de código do Visual Basic a seguir recupera o nome do site do controlador


de domínio do Active Directory.

VB
Dim sys As New ADSystemInfo
dc = sys.GetAnyDCName
Debug.Print "Domain Controller site: " & sys.GetDCSiteName(dc)

O exemplo de código VBScript/ASP a seguir recupera o nome do site do controlador de


domínio do Active Directory.

VB

<%
Dim sys

Set sys = CreateObject("ADSystemInfo")

dc = sys.GetAnyDCName

wscript.echo "Domain Controller : " & dc


wscript.echo "Domain Controller site: " & sys.GetDCSiteName(dc)

%>

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

Conceitos principais do Active Directory

IADsADSystemInfo
Comentários
Esta página foi útil?  Yes  No
Método IADsADSystemInfo::GetTrees
(iads.h)
Artigo24/08/2023

O método IADsADSystemInfo::GetTrees recupera os nomes DNS de todas as árvores de


diretório na floresta do computador local.

Sintaxe
C++

HRESULT GetTrees(
[out] VARIANT *pvTrees
);

Parâmetros
[out] pvTrees

Uma matriz Variant de cadeias de caracteres que contém os nomes das árvores de
diretório dentro da floresta.

Valor retornado
Esse método dá suporte aos valores de retorno HRESULT padrão. Para obter mais
informações, consulte Códigos de erro ADSI.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll
Confira também
Códigos de erro ADSI

IADsADSystemInfo

Comentários
Esta página foi útil?  Yes  No
Método
IADsADSystemInfo::RefreshSchemaCach
e (iads.h)
Artigo24/08/2023

O método IADsADSystemInfo::RefreshSchemaCache atualiza o cache de esquema do


Active Directory.

Sintaxe
C++

HRESULT RefreshSchemaCache();

Valor retornado
Esse método dá suporte aos valores de retorno HRESULT padrão. Para obter mais
informações, consulte Códigos de erro ADSI.

Comentários
Quando você chama esse método, ele faz um Put() da função schemaUpdateNow no
RootDSE. Normalmente, quando você faz alterações no esquema, elas não são
atualizadas para o RootDSE até a próxima atualização automática. Esse método faz uma
atualização imediata do esquema para que você possa exibir as alterações no esquema.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h
DLL Activeds.dll

Confira também
Códigos de erro ADSI

IADsADSystemInfo

Comentários
Esta página foi útil?  Yes  No
Interface IADsDeleteOps (iads.h)
Artigo24/08/2023

A interface IADsDeleteOps especifica um método que um objeto pode usar para se


excluir do diretório subjacente. Para um objeto de contêiner, o método exclui seus filhos
e toda a subárvore.

A interface foi projetada para oferecer recursos que complementam IADsContainer. Para
remover um objeto do repositório de diretórios, solicite seu objeto pai para executar a
operação. Isso equivale a chamar o método IADsContainer::D elete no objeto contido.
Quando o objeto também implementa a interface IADsDeleteOps , você pode instruir o
objeto a remover a si mesmo, e todos os objetos contidos, chamando o método
IADsDeleteOps::D eleteObject diretamente no objeto.

Herança
A interface IADsDeleteOps herda da interface IDispatch . IADsDeleteOps também tem
estes tipos de membros:

Métodos
A interface IADsDeleteOps tem esses métodos.

IADsDeleteOps::D eleteObject

O método IADsDeleteOps::D eleteObject exclui um objeto ADSI.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h
Confira também
exclusão de objetos e Controle de Acesso

IADsContainer

IADsContainer::D elete

IADsDeleteOps Interface

IDispatch

Comentários
Esta página foi útil?  Yes  No
Método IADsDeleteOps::D eleteObject
(iads.h)
Artigo24/08/2023

O método IADsDeleteOps::D eleteObject exclui um objeto ADSI.

Sintaxe
C++

HRESULT DeleteObject(
long lnFlags
);

Parâmetros
lnFlags

Reservado.

Valor retornado
Esse método dá suporte a valores retornados padrão, incluindo S_OK para uma
operação bem-sucedida. Para obter mais informações sobre códigos de erro, consulte
Códigos de erro ADSI.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll
Confira também
Códigos de erro ADSI

exclusão de objetos e Controle de Acesso

IADsContainer::D elete

IADsDeleteOps

IADsDeleteOps Interface

IDirectoryObject::D eleteDSObject

Comentários
Esta página foi útil?  Yes  No
Interface IADsNameTranslate (iads.h)
Artigo24/08/2023

A interface IADsNameTranslate converte DNs (nomes distintos) entre vários formatos,


conforme definido na enumeração ADS_NAME_TYPE_ENUM . O recurso está disponível
para objetos no Active Directory.

As traduções de nome são executadas no servidor de diretório. Para traduzir um DN,


comunique-se com o servidor por meio de um objeto IADsNameTranslate e
especifique qual objeto é de interesse e qual formato é desejado. Veja a seguir o
processo geral para usar a interface IADsNameTranslate .

Primeiro, crie uma instância do objeto IADsNameTranslate .

Em segundo lugar, inicialize o objeto IADsNameTranslate especificando o servidor de


diretório usando o
Métodos IADsNameTranslate::Init ou IADsNameTranslate::InitEx .

Em terceiro lugar, defina o objeto de diretório no servidor especificando o nome com o


método IADsNameTranslate::Set e o formato com o método IADsNameTranslate::SetEx .

Em quarto lugar, recupere o nome do objeto no formato especificado com o método


IADsNameTranslate::Get ou IADsNameTranslate::GetEx .

O exemplo de código a seguir mostra como criar um objeto IADsNameTranslate no


Visual C++, Visual Basic e VBScript/Active Server Pages.

Nota Os elementos de formato definidos na enumeração ADS_NAME_TYPE_ENUM


e usados por IADsNameTranslate não são equivalentes e não são intercambiáveis
com os elementos de formato usados pela função DsCrackName . Não confunda
o uso adequado desses formatos de elementos nomeados da mesma forma, mas
não intercambiáveis.

Herança
A interface IADsNameTranslate herda da interface IDispatch . IADsNameTranslate
também tem estes tipos de membros:

Métodos
A interface IADsNameTranslate tem esses métodos.

IADsNameTranslate::Get

Recupera o nome de um objeto de diretório no formato especificado.

IADsNameTranslate::GetEx

Obtém os nomes de objeto no formato especificado.

IADsNameTranslate::Init

Inicializa um objeto de conversão de nome associando-se a um servidor de diretório, domínio ou


catálogo global especificado, usando as credenciais do usuário atual.

IADsNameTranslate::InitEx

Inicializa um objeto de conversão de nome associando-se a um servidor de diretório, domínio ou


catálogo global especificado, usando a credencial de usuário especificada.

IADsNameTranslate::Set

Direciona o serviço de diretório para configurar um objeto especificado para tradução de nome.

IADsNameTranslate::SetEx

Estabelece uma matriz de objetos para conversão de nomes.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
ADS_NAME_TYPE_ENUM

Cocreateinstance
Métodos da propriedade IADsNameTranslate

IADsNameTranslate Interface

IADsNameTranslate::Get

IADsNameTranslate::GetEx

IADsNameTranslate::Init

IADsNameTranslate::InitEx

IADsNameTranslate::Set

IADsNameTranslate::SetEx

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos da propriedade
IADsNameTranslate
Artigo • 13/06/2023

O método de propriedade da interface IADsNameTranslate define a propriedade


ChaseReferral . Para obter mais informações, consulte Métodos de propriedade de
interface.

Propriedades
ChaseReferral

Opções de busca de referência, conforme definido em ADS_CHASE_REFERRALS_ENUM.


Quando a perseguição de indicação é definida, a tradução de nome é executada em
objetos que não pertencem a esse diretório e são as indicações retornadas da busca de
referência.

Tipo de acesso: somente gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT put_ChaseReferral(
[in] LONG lnChaseReferral
);

Comentários
As opções de busca de indicação se aplicam somente quando você usa
IADsNameTranslate::Set e IADsNameTranslate::Get. O recurso não está disponível com
IADsNameTranslate::SetEx ou IADsNameTranslate::GetEx.

A interface IADsNameTranslate tem uma implementação parcial de


ADS_CHASE_REFERRALS_ENUM por meio da propriedade ChaseReferral . Se a
propriedade ChaseReferral estiver definida como zero (0), será o mesmo que especificar
ADS_CHASE_REFERRALS_NEVER (0). Se um valor diferente de zero for usado, ele será o
mesmo que especificar ADS_CHASE_REFERRALS_ALWAYS (0x60). IADsNameTranslate
não implementa as opções ADS_CHASE_REFERRALS_SUBORDINATE (0x20) ou
ADS_CHASE_REFERRALS_EXTERNAL (0x40).

A configuração padrão para busca de referência está habilitada


(ADS_CHASE_REFERRALS_ALWAYS). Sem a busca de referências, você pode ter a
tradução de nome executada nesses objetos que residem apenas no servidor de
diretório conectado. Se você não tiver certeza se o objeto de interesse está no servidor
especificado, defina essa propriedade como ADS_CHASE_REFERRALS_ALWAYS.

Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsNameTranslate é definido como B1B272A3-3625-11D1-A3A4-


00C04FB950DC

Confira também
ADS_CHASE_REFERRALS_ENUM

IADsNameTranslate

IADsNameTranslate::Get

IADsNameTranslate::GetEx

IADsNameTranslate::Set

IADsNameTranslate::SetEx

Métodos de propriedade interface

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Método IADsNameTranslate::Get
(iads.h)
Artigo24/08/2023

O método IADsNameTranslate::Get recupera o nome de um objeto de diretório no


formato especificado. O nome diferenciado deve ter sido definido no formato
apropriado pelo método IADsNameTranslate::Set .

Sintaxe
C++

HRESULT Get(
long lnFormatType,
BSTR *pbstrADsPath
);

Parâmetros
lnFormatType

O tipo de formato do nome da saída. Para obter mais informações, consulte


ADS_NAME_TYPE_ENUM. Esse método não dá suporte ao elemento
ADS_NAME_TYPE_SID_OR_SID_HISTORY_NAME no ADS_NAME_TYPE_ENUM.

pbstrADsPath

O nome do objeto retornado.

Valor retornado
Esse método dá suporte aos valores de retorno HRESULT padrão, incluindo:

Comentários
Esse método permite recuperar o nome de um único objeto de diretório. Para recuperar
nomes de vários objetos, use IADsNameTranslate::GetEx.
Quando a perseguição de referência estiver ativada, esse método tentará perseguir e
resolve o caminho de um objeto especificado que não reside no servidor conectado.

Exemplos

O exemplo de código C/C++ a seguir mostra como traduzir um nome diferenciado em


conformidade com o RFC 1779 para um formato GUID. O nome do computador do
servidor de diretório é "myServer".

C++

IADsNameTranslate *pNto;
HRESULT hr;
hr = CoCreateInstance(CLSID_NameTranslate,
NULL,
CLSCTX_INPROC_SERVER,
IID_IADsNameTranslate,
(void**)&pNto);
if(FAILED(hr)) { exit 1;}

hr = pNto->Init(ADS_NAME_INITTYPE_SERVER,
CComBSTR("myServer"));
if (FAILED(hr)) { exit 1;}

hr =pNto->Set(ADS_NAME_TYPE_1779, CComBSTR
("CN=jeff,CN=Users,DC=myDomain,DC=Fabrikam,DC=COM,O=Internet"));
if(FAILED(hr)) {exit 1;}

BSTR bstr;
hr = pNto->Get(ADS_NAME_TYPE_GUID, &bstr);
printf("Translation: %S\n", bstr);

SysFreeString(bstr);
pNto->Release();

O exemplo de código do Visual Basic a seguir mostra como traduzir um nome


diferenciado compatível com RFC 1779 para um formato GUID. O nome do computador
do servidor de diretório é "myServer".

VB

Dim nto As New NameTranslate


Dim result As String

dn = "CN=rob,CN=Users,DC=myDomain,DC=Fabrikam,DC=COM,O=Internet"
nto.Init ADS_NAME_INITTYPE_SERVER, "myServer"
nto.Set ADS_NAME_TYPE_1779, dn
result = nto.Get ADS_NAME_TYPE_GUID
MsgBox result

O exemplo de código VBScript/ASP a seguir mostra como traduzir um nome


diferenciado em conformidade com o RFC 1779 para um formato GUID. O nome do
computador do servidor de diretório é "myServer".

VB

<%@ Language=VBScript %>


<html>
<body>
<%
Dim nto
const ADS_NAME_INITTYPE_SERVER = 2
const ADS_NAME_TYPE_1779 = 1
const ADS_NAME_TYPE_NT4 = 3

server = "myServer"
user = "jeffsmith"
dom = "Fabrikam"
passwd = "top secret"

Set nto = Server.CreateObject("NameTranslate")


nto.InitEx ADS_NAME_INITTYPE_SERVER, server, user, dom, passwd
nto.Set ADS_NAME_TYPE_1779, dn
result = nto.Get(ADS_NAME_TYPE_GUID)

Response.Write "<p>Translated name: " & result

%>
</body>
</html>

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll
Confira também
ADS_NAME_TYPE_ENUM

IADsNameTranslate

IADsNameTranslate::GetEx

IADsNameTranslate::Set

Comentários
Esta página foi útil?  Yes  No
Método IADsNameTranslate::GetEx
(iads.h)
Artigo24/08/2023

O método IADsNameTranslate::GetEx obtém os nomes de objeto no formato


especificado. Os nomes de objeto devem ser definidos por IADsNameTranslate::SetEx.

Sintaxe
C++

HRESULT GetEx(
long lnFormatType,
VARIANT *pvar
);

Parâmetros
lnFormatType

O tipo de formato usado para os nomes de saída. Para obter mais informações sobre os
vários tipos de formatos que você pode usar, consulte ADS_NAME_TYPE_ENUM. Esse
método não dá suporte ao elemento ADS_NAME_TYPE_SID_OR_SID_HISTORY_NAME em
ADS_NAME_TYPE_ENUM.

pvar

Uma matriz variante de cadeias de caracteres que contém nomes dos objetos
retornados.

Valor retornado
Esse método dá suporte aos valores de retorno HRESULT padrão, incluindo:

Comentários
Esse método obtém os nomes de vários objetos. No entanto, todos os nomes
retornados usam um único formato.
Quando a perseguição de indicação estiver ativada, esse método não tentará perseguir
e resolve o caminho de um objeto especificado que não reside no servidor conectado.

Exemplos

O exemplo de código C/C++ a seguir mostra como traduzir nomes diferenciados em


conformidade com o RFC 1779 para o formato GUID. O nome do computador do
servidor de diretório é "myServer".

C++

IADsNameTranslate *pNto;
HRESULT hr;
hr = CoCreateInstance(CLSID_NameTranslate,
NULL,
CLSCTX_INPROC_SERVER,
IID_IADsNameTranslate,
(void**)&pNto);
if(FAILED(hr)) { exit 1;}

hr = pNto->Init(ADS_NAME_INITTYPE_SERVER,
CComBSTR("myServer"));
if (FAILED(hr)) { exit 1;}

LPWSTR str[1] = { L"CN=jim,CN=Users,DC=myDomain,DC=Fabrikam,DC=COM",


L"CN=rob,CN=Users,DC=myDomain,DC=Fabrikam,DC=COM"};
DWORD dwNum = sizeof(str)/sizeof(LPWSTR);

VARIANT varStr;
VariantInit(&varStr);

hr = ADsBuildVarArrayStr(str,dwNum,&varStr);

hr =pNto->SetEx(ADS_NAME_TYPE_1779, varStr);
if(FAILED(hr)) {exit 1;}
VariantClear(&varStr);

hr = pNto->GetEx(ADS_NAME_TYPE_GUID, &varStr);
if(FAILED(hr)) {exit 1;}

LONG lstart, lend;


SAFEARRAY *sa = V_ARRAY(&varStr);
VARIANT varItem;
VariantInit(&varItem);
printf("Names in the translated format:\n");
for (long idx = lstart; idx <= lend; idx++)
{
hr = SafeArrayGetElement(sa, &idx, &varItem);
printf(" %S\n", V_BSTR(&varItem));
VariantClear(&varItem);
}
VariantClear(&varStr);
pNto->Release();

O exemplo de código a seguir mostra como converter vários nomes do tipo RFC 1779
para o tipo GUID. O nome do computador do servidor de diretório é "myServer".

VB

Dim nto As new NameTranslate


Dim result As Variant
Dim ns(1) As String

nto.Init ADS_NAME_INITTTYPE_SERVER, "myServer"

ns(0)="CN=rob,CN=users,DC=example,DC=Fabrikam,DC=COM,O=Internet"
ns(1)="CN=jim,CN=users,DC=example,DC=Fabrikam,DC=COM,O=Internet"

nto.SetEx ADS_NAME_TYPE_1779, ns
nto.GetEx ADS_NAME_TYPE_GUID, result
MsgBox "name(0): " & result(0) & " name(1): " & result(1)

O exemplo de código VBScript/ASP a seguir converte dois nomes diferenciados em


conformidade com o RFC 1779 para o formato GUID. O nome do computador do
servidor de diretório é "myServer".

VB

<%@ Language=VBScript %>


<html>
<body>
<%
Dim nto
const ADS_NAME_INITTYPE_SERVER = 2
const ADS_NAME_TYPE_1779 = 1
const ADS_NAME_TYPE_NT4 = 3

server = "myServer"
user = "jeffsmith"
dom = "Fabrikam"
passwd = "top secret"

Set nto = Server.CreateObject("NameTranslate")


nto.InitEx ADS_NAME_INITTYPE_SERVER, server, user, dom, passwd

ns(0)="CN=rob,CN=users,DC=example,DC=Fabrikam,DC=COM,O=Internet"
ns(1)="CN=jim,CN=users,DC=example,DC=Fabrikam,DC=COM,O=Internet"

nto.SetEx ADS_NAME_TYPE_1779, ns
result = nto.GetEx(ADS_NAME_TYPE_GUID)

Response.Write "<p>Names in the translated format: " & result(0) & _


", " & result(1)

%>
</body>
</html>

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
ADS_NAME_TYPE_ENUM

IADsNameTranslate

IADsNameTranslate::SetEx

Comentários
Esta página foi útil?  Yes  No
Método IADsNameTranslate::Init (iads.h)
Artigo24/08/2023

O método IADsNameTranslate::Init inicializa um objeto de conversão de nome por


associação a um servidor de diretório, domínio ou catálogo global especificado, usando
as credenciais do usuário atual. Para inicializar o objeto com uma credencial de usuário
diferente, use IADsNameTranslate::InitEx.

Sintaxe
C++

HRESULT Init(
long lnSetType,
BSTR bstrADsPath
);

Parâmetros
lnSetType

Um tipo de inicialização a ser executada. Os valores possíveis são definidos em


ADS_NAME_INITTYPE_ENUM.

bstrADsPath

O nome do servidor ou domínio, dependendo do valor de lnInitType. Quando


ADS_NAME_INITTYPE_GC é emitido, esse parâmetro é ignorado. O servidor de catálogo
global do domínio do computador atual executará as operações de tradução de nome.
Esse método falhará se o computador não fizer parte de um domínio, pois nenhum
catálogo global será encontrado neste cenário. Para obter mais informações, consulte
ADS_NAME_INITTYPE_ENUM.

Valor retornado
Retorna um código de erro HRESULT ou RPC padrão, incluindo:

Comentários
Após a inicialização bem-sucedida, você pode continuar a usar o objeto de tradução de
nome para enviar solicitações de traduções de nomes de objetos no diretório. Para
obter mais informações, consulte IADsNameTranslate::Set ou IADsNameTranslate::Get.

Exemplos
O exemplo de código C/C++ a seguir usa o método IADsNameTranslate::Init para
inicializar um objeto IADsNameTranslate antes que o nome diferenciado de um objeto
de usuário seja renderizado no formato s.

C++

IADsNameTranslate *pNto;
HRESULT hr;
hr = CoCreateInstance(CLSID_NameTranslate,
NULL,
CLSCTX_INPROC_SERVER,
IID_IADsNameTranslate,
(void**)&pNto);
if(FAILED(hr)) { exit 1;}

hr = pNto->Init(ADS_NAME_INITTYPE_SERVER,
CComBSTR("myServer"));
if (FAILED(hr)) { exit 1;}

hr =pNto->Set(ADS_NAME_TYPE_1779,
CComBSTR("cn=jeffsmith,cn=users,dc=Fabrikam,dc=com"));
if(FAILED(hr)) {exit 1;}

BSTR bstr;
hr = pNto->Get(ADS_NAME_TYPE_NT4, &bstr);
printf("Name in the translated format: %S\n", bstr);

SysFreeString(bstr);
pNto->Release();

O exemplo de código do Visual Basic a seguir usa o método IADsNameTranslate::Init


para inicializar um objeto IADsNameTranslate para ter o nome diferenciado de um
objeto de usuário renderizado no formato de nome de usuário.

VB

Dim nto As New NameTranslate


dso="CN=jeffsmith, CN=users, DC=Fabrikam dc=COM"

nto.Init ADS_NAME_INITTYPE_SERVER, "myServer"


nto.Set ADS_NAME_TYPE_1779, dso
trans = nto.Get(ADS_NAME_TYPE_NT4)
O exemplo de código VBScript/ASP a seguir usa o método IADsNameTranslate::Init
para inicializar um objeto IADsNameTranslate para ter o nome diferenciado de um
objeto de usuário renderizado no formato de nome de usuário.

VB

<%@ Language=VBScript %>


<html>
<body>
<%
Dim nto
const ADS_NAME_INITTYPE_SERVER = 2 ' VBScript cannot read
const ADS_NAME_TYPE_1779 = 1 ' enumeration definition
const ADS_NAME_TYPE_NT4 = 3

dn = "CN=jeffsmith,CN=Users,DC=Fabrikam,DC=COM"

Set nto = Server.CreateObject("NameTranslate")


nto.Init ADS_NAME_INITTYPE_SERVER, "myServer"
nto.Set ADS_NAME_TYPE_1779, dn
result = nto.Get(ADS_NAME_TYPE_NT4)

Response.Write "<p>Name in the translated format: " & result

%>
</body>
</html>

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
ADS_NAME_TYPE_ENUM

IADsNameTranslate
IADsNameTranslate::Get

IADsNameTranslate::InitEx

IADsNameTranslate::Set

Comentários
Esta página foi útil?  Yes  No
Método IADsNameTranslate::InitEx
(iads.h)
Artigo24/08/2023

O método IADsNameTranslate::InitEx inicializa um objeto de conversão de nome


associando-se a um servidor de diretório, domínio ou catálogo global especificado,
usando a credencial de usuário especificada. Para inicializar o objeto sem uma
credencial de usuário explícita, use IADsNameTranslate::Init.

O método IADsNameTranslate::InitEx inicializa o objeto definindo o servidor ou


domínio para o qual o objeto apontará e fornecendo uma credencial de usuário.

Sintaxe
C++

HRESULT InitEx(
long lnSetType,
BSTR bstrADsPath,
BSTR bstrUserID,
BSTR bstrDomain,
BSTR bstrPassword
);

Parâmetros
lnSetType

Um tipo de inicialização a ser executada. Os valores possíveis são definidos em


ADS_NAME_INITTYPE_ENUM.

bstrADsPath

O nome do servidor ou domínio, dependendo do valor de lnInitType. Quando


ADS_NAME_INITTYPE_GC é emitido, esse parâmetro é ignorado. O servidor de catálogo
global do domínio do computador atual será usado para executar as operações de
tradução de nome. Esse método falhará se o computador não fizer parte de um
domínio, pois nenhum catálogo global será encontrado neste cenário. Para obter mais
informações, consulte ADS_NAME_INITTYPE_ENUM.

bstrUserID
Nome de usuário.

bstrDomain

Nome de domínio do usuário.

bstrPassword

Senha do usuário.

Valor retornado
Retorna um código de erro HRESULT ou RPC padrão, incluindo:

Comentários
Após a inicialização bem-sucedida, use o objeto de conversão de nome para enviar
solicitações de traduções de nome de objetos de diretório. Para obter mais informações,
consulte IADsNameTranslate::Set, IADsNameTranslate::Get, IADsNameTranslate::SetEx ou
IADsNameTranslate::GetEx.

Exemplos
O exemplo de código C/C++ a seguir usa o método IADsNameTranslate::InitEx para
inicializar um objeto IADsNameTranslate antes que o nome diferenciado de um objeto
de usuário seja renderizado no formato s.

C++

IADsNameTranslate *pNto;
HRESULT hr;
hr = CoCreateInstance(CLSID_NameTranslate,
NULL,
CLSCTX_INPROC_SERVER,
IID_IADsNameTranslate,
(void**)&pNto);
if(FAILED(hr)) { exit 1;}

hr = pNto->InitEx(ADS_NAME_INITTYPE_SERVER,
CComBSTR("myServer"),
CComBSTR("jeffsmith"),
CComBSTR("Fabrikam"),
CComBSTR("top secret"));
if (FAILED(hr)) { exit 1;}

hr =pNto->Set(ADS_NAME_TYPE_1779,
CComBSTR("cn=jeffsmith,cn=users,dc=Fabrikam,dc=com"));
if(FAILED(hr)) {exit 1;}

BSTR bstr;
hr = pNto->Get(ADS_NAME_TYPE_NT4, &bstr);
printf("Name in the translated format: %S\n", bstr);

SysFreeString(bstr);
pNto->Release();

O exemplo de código do Visual Basic a seguir usa o método IADsNameTranslate::InitEx


para inicializar um objeto IADsNameTranslate para ter o nome diferenciado de um
objeto de usuário renderizado no formato de nome de usuário s.

VB

Dim nto As New NameTranslate


dso="CN=jeffsmith, CN=users, DC=Fabrikam dc=COM"
server = "myServer"
domain = "Fabrikam"
user = "jeffsmith"
passwd = "myPass"

nto.InitEx ADS_NAME_INITTYPE_SERVER, server,user,domain,passwd


nto.Set ADS_NAME_TYPE_1779, dso
trans = nto.Get(ADS_NAME_TYPE_NT4)
MsgBox "Name in the translated format: " & trans

O exemplo de código VBScript/ASP a seguir usa o método IADsNameTranslate::InitEx


para inicializar um objeto IADsNameTranslate para ter o nome diferenciado de um
objeto de usuário renderizado no formato de nome de usuário s.

VB

<%@ Language=VBScript %>


<html>
<body>
<%
Dim nto
const ADS_NAME_INITTYPE_SERVER = 2 ' VBScript cannot read
const ADS_NAME_TYPE_1779 = 1 ' enumeration definition
const ADS_NAME_TYPE_NT4 = 3

server = "myServer"
domain = "Fabrikam"
user = "jeffsmith"
passwd = "myPass"

dn = "CN=jeffsmith,CN=Users,DC=Fabrikam,DC=COM"
Set nto = Server.CreateObject("NameTranslate")
nto.InitEx ADS_NAME_INITTYPE_SERVER, server,user,domain,passwd
nto.Set ADS_NAME_TYPE_1779, dn
result = nto.Get(ADS_NAME_TYPE_NT4)

Response.Write "<p>Name in the translated format: " & result

%>
</body>
</html>

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
ADS_NAME_TYPE_ENUM

IADsNameTranslate

IADsNameTranslate::Get

IADsNameTranslate::GetEx

IADsNameTranslate::Set

IADsNameTranslate::SetEx

Comentários
Esta página foi útil?  Yes  No
Método IADsNameTranslate::Set (iads.h)
Artigo24/08/2023

O método IADsNameTranslate::Set direciona o serviço de diretório para configurar um


objeto especificado para tradução de nome. Para definir os nomes e o formato de vários
objetos, use IADsnametranslate::SetEx.

Sintaxe
C++

HRESULT Set(
long lnSetType,
BSTR bstrADsPath
);

Parâmetros
lnSetType

O formato do nome de um objeto de diretório. Para obter mais informações, consulte


ADS_NAME_TYPE_ENUM.

bstrADsPath

O nome do objeto, por exemplo, "CN=Administrator, CN=users, DC=Fabrikam,


DC=com".

Valor retornado
Esse método dá suporte aos valores de retorno HRESULT padrão, incluindo:

Comentários
Antes de chamar esse método para definir o nome do objeto, você deve ter
estabelecido uma conexão com o serviço de diretório usando IADsNameTranslate::Init
ou IADsNameTranslate::InitEx.

Você pode usar o método IADsNameTranslate::Set para definir a conversão de nomes


para objetos que residem no servidor de diretório. Quando a perseguição de indicação
estiver ativada, esse método também definirá qualquer objeto encontrado em outros
servidores. Para obter mais informações sobre a busca de indicações, consulte Métodos
de propriedade IADsNameTranslate.

Exemplos
O exemplo de código C/C++ a seguir usa o método IADsNameTranslate::Set para
definir um objeto para que seu nome possa ser convertido do formato RFC 1779 para o
formato de nome de usuário.

C++

IADsNameTranslate *pNto;
HRESULT hr;
hr = CoCreateInstance(CLSID_NameTranslate,
NULL,
CLSCTX_INPROC_SERVER,
IID_IADsNameTranslate,
(void**)&pNto);
if(FAILED(hr)) { exit 1;}

hr = pNto->Init(ADS_NAME_INITTYPE_SERVER,
CComBSTR("myServer"));
if (FAILED(hr)) { exit 1;}

hr =pNto->Set(ADS_NAME_TYPE_1779,
CComBSTR("cn=jeffsmith,cn=users,dc=Fabrikam,dc=com"));
if(FAILED(hr)) {exit 1;}

BSTR bstr;
hr = pNto->Get(ADS_NAME_TYPE_NT4, &bstr);
printf("Name in the translated format: %S\n", bstr);

SysFreeString(bstr);
pNto->Release();

O exemplo de código do Visual Basic a seguir usa o método IADsNameTranslate::Set


para definir um objeto para que seu nome possa ser convertido do formato RFC 1779
para o formato de nome de usuário.

VB

Dim nto As New NameTranslate


dso="CN=jeffsmith, CN=users, DC=Fabrikam dc=COM"

nto.Init ADS_NAME_INITTYPE_SERVER, "myServer"


nto.Set ADS_NAME_TYPE_1779, dso
trans = nto.Get(ADS_NAME_TYPE_NT4)
O exemplo de código VBScript/ASP a seguir usa o método IADsNameTranslate::Set
para definir um objeto para ter seu nome traduzido do formato RFC 1779 para o
formato de nome de usuário.

VB

<%@ Language=VBScript %>


<html>
<body>
<%
Dim nto
const ADS_NAME_INITTYPE_SERVER = 2 ' VBScript cannot read
const ADS_NAME_TYPE_1779 = 1 ' enumeration definition
const ADS_NAME_TYPE_NT4 = 3

dn = "CN=jeffsmith,CN=Users,DC=Fabrikam,DC=COM"

Set nto = Server.CreateObject("NameTranslate")


nto.Init ADS_NAME_INITTYPE_SERVER, "myServer"
nto.Set ADS_NAME_TYPE_1779, dn
result = nto.Get(ADS_NAME_TYPE_NT4)

Response.Write "<p>Name in the translated format: " & result

%>
</body>
</html>

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
ADS_NAME_TYPE_ENUM

IADsNameTranslate
Métodos de propriedade IADsNameTranslate

IADsNameTranslate::Init

IADsNameTranslate::InitEx

IADsNameTranslate::SetEx

Comentários
Esta página foi útil?  Yes  No
Método IADsNameTranslate::SetEx
(iads.h)
Artigo24/08/2023

O método IADsNameTranslate::SetEx estabelece uma matriz de objetos para conversão


de nomes. Os objetos especificados devem existir no servidor de diretório conectado.
Para definir o nome e o formato de um único objeto de diretório, use o método
IADsNameTranslate::Set .

Sintaxe
C++

HRESULT SetEx(
long lnFormatType,
VARIANT pvar
);

Parâmetros
lnFormatType

O tipo de formato dos nomes de entrada. Para obter mais informações, consulte
ADS_NAME_TYPE_ENUM.

pvar

Uma matriz variante de cadeias de caracteres que contém nomes de objeto.

Valor retornado
Esse método dá suporte aos valores de retorno HRESULT padrão, incluindo:

Comentários
Você não pode usar o método IADsNameTranslate::SetEx para definir a conversão de
nomes para objetos que residem em outros servidores, mesmo quando a opção de
busca de referência está habilitada. Para obter mais informações sobre a busca de
indicações, consulte Métodos de propriedade IADsNameTranslate.
Você pode usar IADsNameTranslate::SetEx para definir nomes para vários objetos.
Todos os nomes, no entanto, devem ser do mesmo formato.

Exemplos

O exemplo de código C/C++ a seguir usa o método IADsNameTranslate::SetEx para


configurar uma matriz de objetos cujos nomes devem ser traduzidos do formato RFC
1779 para o formato de nome de usuário do Windows.

C++

IADsNameTranslate *pNto;
HRESULT hr;
hr = CoCreateInstance(CLSID_NameTranslate,
NULL,
CLSCTX_INPROC_SERVER,
IID_IADsNameTranslate,
(void**)&pNto);
if(FAILED(hr)) { exit 1;}

hr = pNto->Init(ADS_NAME_INITTYPE_SERVER,
CComBSTR("myServer"));
if (FAILED(hr)) { exit 1;}

LPWSTR str[1] = { L"CN=jim,CN=Users,DC=myDomain,DC=Fabrikam,DC=COM",


L"CN=rob,CN=Users,DC=myDomain,DC=Fabrikam,DC=COM"};
DWORD dwNum = sizeof(str)/sizeof(LPWSTR);

VARIANT varStr;
VariantInit(&varStr);

hr = ADsBuildVarArrayStr(str,dwNum,&varStr);

hr =pNto->SetEx(ADS_NAME_TYPE_1779, varStr);
if(FAILED(hr)) {exit 1;}
VariantClear(&varStr);

hr = pNto->GetEx(ADS_NAME_TYPE_GUID, &varStr);
if(FAILED(hr)) {exit 1;}

LONG lstart, lend;


SAFEARRAY *sa = V_ARRAY(&varStr);
VARIANT varItem;
VariantInit(&varItem);
printf("Names in the translated format:\n");
for (long idx = lstart; idx <= lend; idx++)
{
hr = SafeArrayGetElement(sa, &idx, &varItem);
printf(" %S\n", V_BSTR(&varItem));
VariantClear(&varItem);
}
VariantClear(&varStr);
pNto->Release();

O exemplo de código do Visual Basic a seguir usa o método IADsNameTranslate::SetEx


para configurar uma matriz de objetos cujos nomes devem ser convertidos do formato
RFC 1779 para o formato de nome de usuário.

VB

Dim nto As New NameTranslate


dso(0)="CN=jeffSmith, CN=users, DC=Fabrikam dc=COM"
dso(1)="CN=brendaDiaz, CN=users, DC=Fabrikam dc=COM"
nto.Init ADS_NAME_INITTYPE_SERVER, "myServer"
nto.SetEx ADS_NAME_TYPE_1779, dso
trans = nto.GetEx(ADS_NAME_TYPE_NT4)
Msgbox "Translations: " & trans(0) & "," & trans(1)

O exemplo de código VBScript/ASP a seguir usa o método IADsNameTranslate::SetEx


para configurar uma matriz de objetos cujos nomes devem ser convertidos do formato
RFC 1779 para o formato de nome de usuário.

VB

<%@ Language=VBScript %>


<html>
<body>
<%
Dim nto
const ADS_NAME_INITTYPE_SERVER = 2 ' VBScript cannot read
const ADS_NAME_TYPE_1779 = 1 ' enumeration definition
const ADS_NAME_TYPE_NT4 = 3

dn(0) = "CN=jeffSmith,CN=Users,DC=Fabrikam,DC=COM"
dn(1) = "CN=brendaDiaz,CN=Users,DC=Fabrikam,DC=COM"

Set nto = Server.CreateObject("NameTranslate")


nto.Init ADS_NAME_INITTYPE_SERVER, "myServer"
nto.SetEx ADS_NAME_TYPE_1779, dn
result = nto.GetEx(ADS_NAME_TYPE_NT4)

Response.Write "<p>Name in the translated format: " & result(0) & _


", & result(1)

%>
</body>
</html>

Requisitos
Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
ADS_NAME_TYPE_ENUM

IADsNameTranslate

Métodos de propriedade IADsNameTranslate

IADsNameTranslate::Set

Comentários
Esta página foi útil?  Yes  No
Interface IADsObjectOptions (iads.h)
Artigo24/08/2023

A interface IADsObjectOptions fornece um mecanismo direto para especificar e obter


opções específicas do provedor para manipular um objeto ADSI. Normalmente, as
opções se aplicam a operações de pesquisa do repositório de diretórios subjacente. As
opções com suporte são específicas do provedor.

Herança
A interface IADsObjectOptions herda da interface IDispatch . IADsObjectOptions
também tem estes tipos de membros:

Métodos
A interface IADsObjectOptions tem esses métodos.

IADsObjectOptions::GetOption

Obtém uma opção específica do provedor para um objeto de diretório.

IADsObjectOptions::SetOption

Define uma opção específica do provedor para manipular um objeto de diretório.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
ADS_OPTION_ENUM

ADS_SECURITY_INFO_ENUM

Opção de associação rápida para operações de gravação/modificação em lote

IADsObjectOptions Interface

IDispatch

Comentários
Esta página foi útil?  Yes  No
Método IADsObjectOptions::GetOption
(iads.h)
Artigo24/08/2023

O método IADsOptions.GetOption obtém uma opção específica do provedor para um


objeto de diretório.

Sintaxe
C++

HRESULT GetOption(
long lnOption,
VARIANT *pvValue
);

Parâmetros
lnOption

Indica a opção específica do provedor a ser obtido. Esse parâmetro pode ser qualquer
valor na enumeração ADS_OPTION_ENUM .

pvValue

Ponteiro para uma variável VARIANT que recebe o valor atual para a opção especificada
no parâmetro lnOption .

Valor retornado
O método dá suporte aos valores de retorno padrão, incluindo S_OK se a operação for
bem-sucedida e E_ADS_BAD_PARAMETER se o usuário tiver fornecido um parâmetro
pvValue inválido. Para obter mais informações, consulte Códigos de erro ADSI.

Requisitos

Cliente mínimo com suporte Windows Vista


Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

ADS_OPTION_ENUM

IADsObjectOptions

Comentários
Esta página foi útil?  Yes  No
Método IADsObjectOptions::SetOption
(iads.h)
Artigo24/08/2023

O método IADsOptions.SetOption define uma opção específica do provedor para


manipular um objeto de diretório.

Sintaxe
C++

HRESULT SetOption(
long lnOption,
VARIANT vValue
);

Parâmetros
lnOption

Indica a opção específica do provedor a ser definida. Esse parâmetro pode ser qualquer
valor na enumeração ADS_OPTION_ENUM , exceto ADS_OPTION_SERVERNAME ou
ADS_OPTION_MUTUAL_AUTH_STATUS.

vValue

Especifica o valor a ser definido para a opção especificada no parâmetro lnOption .

Valor retornado
O método dá suporte aos valores de retorno padrão, incluindo S_OK para uma
operação bem-sucedida e E_ADS_BAD_PARAMETER quando o usuário forneceu um
parâmetro pValue inválido. Para obter mais informações, consulte Códigos de erro ADSI.

Requisitos

Cliente mínimo com suporte Windows Vista


Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

IADsObjectOptions

Comentários
Esta página foi útil?  Yes  No
Interface IADsPathname (iads.h)
Artigo24/08/2023

A interface IADsPathname analisa o caminho X.500 e do Windows em ADSI.

A interface IADsPathname pode ser usada para:

Defina e obtenha caminhos de objetos ADSI em formatos diferentes.


Extraia ou adicione cada elemento para um determinado ADsPath.
Construa ADsPaths a serem usados em consultas de objetos de diretório.

A interface IADsPathname é implementada em um objeto Pathname . Você deve


instanciar o objeto Pathname para usar os métodos definidos na interface
IADsPathname . Esse requisito é semelhante a chamar a função CoCreateInstance() em
C++.

C++

IADsPathname *pPathname=NULL;
HRESULT hr;

hr = CoCreateInstance(CLSID_Pathname,
NULL,
CLSCTX_INPROC_SERVER,
IID_IADsPathname,
(void**)&pPathname);

Você também pode invocar o operador New no Visual Basic:

VB

Dim path As New Pathname

Ou use a função CreateObject no VBScript, fornecendo "Pathname" como o ProgID.

VB

Dim path
Set path = CreateObject("Pathname")

A interface IADsPathname usa dois tipos de enumeração: ADS_SETTYPE_ENUM e


ADS_FORMAT_ENUM.
Herança
A interface IADsPathname herda da interface IDispatch . IADsPathname também tem
esses tipos de membros:

Métodos
A interface IADsPathname tem esses métodos.

IADsPathname::AddLeafElement

Adiciona um elemento ao final do caminho de diretório já definido no objeto Pathname.

IADsPathname::CopyPath

Cria uma cópia do objeto Pathname.

IADsPathname::GetElement

Recupera um elemento de um caminho de diretório.

IADsPathname::GetEscapedElement

Usado para escapar de caracteres especiais no caminho de entrada.

IADsPathname::GetNumElements

Recupera o número de elementos no caminho.

IADsPathname::RemoveLeafElement

Remove o último elemento do caminho de diretório que foi definido no objeto Pathname.

IADsPathname::Retrieve

O método IADsPathname::Retrieve recupera o caminho do objeto com tipos de formato


diferentes.

IADsPathname::Set

Configura o objeto Pathname para analisar um caminho de diretório.

IADsPathname::SetDisplayType

Especifica como exibir o caminho de um objeto .


Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
ADS_FORMAT_ENUM

ADS_SETTYPE_ENUM

CoCreateInstance()

Métodos de propriedade IADsPathname

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos da propriedade IADsPathname
Artigo • 12/06/2023

Os métodos de propriedade da interface IADsPathname obtêm ou definem as


propriedades EscapedMode . Para obter mais informações, consulte Métodos de
propriedade de interface.

Propriedades
EscapedMode

Examine ou especifique como os caracteres de escape são tratados em um nome de


caminho. Para obter mais informações e opções definidas, consulte
ADS_ESCAPE_MODE_ENUM.

Tipo de acesso: leitura/gravação

Tipo de dados de script: Long

syntax

// C++ method syntax


HRESULT get_EscapedMode(
[out] long* retval
);
HRESULT get_EscapedMode(
[in] long* lnEscapedMode
);

Comentários
EscapedMode representa um estado. Você pode ativá-lo ou desativá-lo definindo-o
como ADS_ESCAPEDMODE_ON ou
ADS_ESCAPEDMODE_OFF/ADS_ESCAPEDMODE_OFF_EX. Quando ele é ativado ou
desativado, todas as recuperações subsequentes produzem cadeias de caracteres de
caminho com escape ou sem escape.

No ADSI, somente o IADsPathname é capaz de desescapsar caminhos. Todas as outras


interfaces ADSI sempre retornam caminhos de escape. O estado padrão de
EscapedMode é ADS_ESCAPEDMODE_DEFAULT conforme definido em
ADS_ESCAPE_MODE_ENUM.
Exemplos
O exemplo de código a seguir mostra como usar a propriedade EscapedMode
ativar/desativar o escape dos três caracteres especiais a seguir: "=", e "/".

VB

Dim path As New Pathname


path.Set "CN=joy\=ful\,\/*", ADS_SETTYPE_DN

path.EscapedMode = ADS_ESCAPEDMODE_ON
MsgBox path.Retrieve(ADS_FORMAT_WINDOWS) ' All escaped, producing:
' "LDAP://CN=joy\=ful\,\/*"

path.EscapedMode = ADS_ESCAPEMODE_OFF
MsgBox path.Retrieve(ADS_FORMAT_WINDOWS) ' Only "/" is unescaped:
' "LDAP://CN=joy\=ful\,/*"

path.EscapedMode = ADS_ESCAPEDMODE_OFF_EX
MsgBox path.Retrieve(ADS_FORMAT_WINDOWS) ' All are unescaped:
' "LDAP://CN=joy=ful,/*"

path.Set "LDAP://CN=joy\=ful\,\/*", ADS_SETTYPE_FULL

path.EscapedMode = ADS_ESCAPEDMODE_ON
MsgBox path.Retrieve(ADS_FORMAT_WINDOWS)
' Produces "LDAP://CN=joy\=ful\,\/*"

path.EscapedMode = ADS_ESCAPEMODE_OFF
MsgBox path.Retrieve(ADS_FORMAT_WINDOWS)
' Produces "LDAP://CN=joy\=ful\,/*"

path.EscapedMode = ADS_ESCAPEMODE_OFF_EX
MsgBox path.Retrieve(ADS_FORMAT_WINDOWS)
' Produces "LDAP://CN=joy=ful,/*"

O exemplo de código a seguir mostra como usar a propriedade EscapedMode


ativar/desativar o escape dos três caracteres especiais a seguir: "=", e "/".

VB

<%
Dim path
const ADS_SETTYPE_FULL = 1
const ADS_SETTYPE_DN = 4
const ADS_FORMAT_WINDOWS = 1
const ADS_ESCAPEDMODE_ON = 2
const ADS_ESCAPEDMODE_OFF = 3
const ADS_ESCAPEDMODE_OFF_EX = 4
Set path = CreateObject("Pathname")
path.Set "CN=joy\=ful\,\/*", ADS_SETTYPE_DN

path.EscapedMode = ADS_ESCAPEDMODE_ON
Response.Write path.Retrieve(ADS_FORMAT_WINDOWS)
' All escaped, producing: "LDAP://CN=joy\=ful\,\/*"

path.EscapedMode = ADS_ESCAPEMODE_OFF
Response.Write path.Retrieve(ADS_FORMAT_WINDOWS)
' Only "/" is unescaped: "LDAP://CN=joy\=ful\,/*"

path.EscapedMode = ADS_ESCAPEDMODE_OFF_EX
Response.Write path.Retrieve(ADS_FORMAT_WINDOWS) ' All are unescaped:
' "LDAP://CN=joy=ful,/*"

path.Set "LDAP://CN=joy\=ful\,\/*", ADS_SETTYPE_FULL

path.EscapedMode = ADS_ESCAPEDMODE_ON
Response.Write path.Retrieve(ADS_FORMAT_WINDOWS)
' Produces "LDAP://CN=joy\=ful\,\/*"

path.EscapedMode = ADS_ESCAPEMODE_OFF
Response.Write path.Retrieve(ADS_FORMAT_WINDOWS)
' Produces "LDAP://CN=joy\=ful\,/*"

path.EscapedMode = ADS_ESCAPEMODE_OFF_EX
Response.Write path.Retrieve(ADS_FORMAT_WINDOWS)
' Produces "LDAP://CN=joy=ful,/*"
%>

O exemplo de código a seguir mostra como trabalhar com a propriedade EscapedMode


. A verificação de erros é ignorada.

C++

IADsPathname *pPathname=NULL;
HRESULT hr;

hr = CoCreateInstance(CLSID_Pathname,
NULL,
CLSCTX_INPROC_SERVER,
IID_IADsPathname,
(void**)&pPathname);

if(FAILED(hr))
{
if(pPathname) pPathname->Release();
return NULL;
}

pPathname->AddRef();
hr = pPathname->Set(CComBSTR("LDAP://CN=joy/ful\/*"),
ADS_SETTYPE_FULL);

hr = pPathname->put_EscapedMode(ADS_ESCAPEDMODE_OFF);
hr = pPathname->Retrieve(ADS_FORMAT_WINDOWS_DN,&bstr);
printf("Unescaped path: %S\n",bstr);

// Producing "LDAP://CN=joy/ful/*"

SysFreeString(bstr);

hr = pPathname->put_EscapedMode(ADS_ESCAPEDMODE_ON);
hr = pPathname->Retrieve(ADS_FORMAT_WINDOWS_DN,&bstr);
printf("Escaped path: %S\n",bstr);

// Producing "LDAP://CN=joy/ful\/*"

SysFreeString(bstr);

// Set the path using ADS_SETTYPE_DN

hr = pPathname->Set(CComBSTR("CN=joy/ful\/*"), ADS_SETTYPE_DN);

hr = pPathname->put_EscapedMode(ADS_ESCAPEDMODE_OFF);
hr = pPathname->Retrieve(ADS_FORMAT_WINDOWS_DN,&bstr);
printf("Unescaped path: %S\n",bstr);

// Producing "LDAP://CN=joy/ful/*"

SysFreeString(bstr);

hr = pPathname->put_EscapedMode(ADS_ESCAPEDMODE_ON);
hr = pPathname->Retrieve(ADS_FORMAT_WINDOWS_DN,&bstr);
printf("Escaped path: %S\n",bstr);

// Producing "LDAP://CN=joy\/ful\/*"

SysFreeString(bstr);

hr = pPathname->Release();

Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h
Requisito Valor

DLL Activeds.dll

IID IID_IADsPathname é definido como D592AED4-F420-11D0-A36E-


00C04FB950DC

Confira também
IADsPathname

ADS_ESCAPE_MODE_ENUM

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Método
IADsPathname::AddLeafElement (iads.h)
Artigo24/08/2023

O método IADsPathname::AddLeafElement adiciona um elemento ao final do caminho


de diretório já definido no objeto Pathname.

Sintaxe
C++

HRESULT AddLeafElement(
[in] BSTR bstrLeafElement
);

Parâmetros
[in] bstrLeafElement

O nome do elemento folha.

Valor retornado
Esse método dá suporte aos valores retornados padrão, bem como aos seguintes:

Para obter mais informações e outros valores retornados, consulte Códigos de erro
ADSI.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h
DLL Activeds.dll

Confira também
Códigos de erro ADSI

IADsPathname

Comentários
Esta página foi útil?  Yes  No
Método IADsPathname::CopyPath
(iads.h)
Artigo24/08/2023

O método IADsPathname::CopyPath cria uma cópia do objeto Pathname.

Sintaxe
C++

HRESULT CopyPath(
[out] IDispatch **ppAdsPath
);

Parâmetros
[out] ppAdsPath

O ponteiro da interface IDispatch no objeto IADsPathname retornado.

Valor retornado
Esse método dá suporte aos valores retornados padrão, bem como o seguinte:

Para obter mais informações e outros valores retornados, consulte Códigos de erro
ADSI.

Comentários
Esse método é usado para modificar o caminho do objeto e manter o caminho do
objeto original.

Exemplos
O exemplo de código do Visual Basic a seguir mostra como fazer uma cópia de um
nome de caminho.

VB
Dim x, y As New Pathname
x.Set "LDAP://srv1/dc=dom,dc=company,dc=com",ADS_SETTYPE_FULL
set y = x.CopyPath
MsgBox y.Retrieve(ADS_FORMAT_WINDOWS)

O exemplo de código VBScript/ASP a seguir mostra como fazer uma cópia de um nome
de caminho.

VB

<%
Dim x, y
Const ADS_SETTYPE_FULL = 1
Const ADS_FORMAT_WINDOWS = 1
Set x = CreateObject("Pathname")
x.Set "LDAP://srv1/dc=dom,dc=company,dc=com",ADS_SETTYPE_FULL

set y = x.CopyPath
Response.Write y.Retrieve(ADS_FORMAT_WINDOWS)
%>

O exemplo de código C++ a seguir cria uma cópia de um objeto pathname. Para obter
mais informações e um exemplo de código da função GetPathnameObject , consulte
IADsPathname.

C++

IADsPathname *pPath;
LPWSTR adsPath;
adsPath = L"LDAP://server/cn=jeff smith,dc=Fabrikam,dc=com";

IADsPathname *pPath = GetPathnameObject(adsPath)


if (!pPath) exit(0);

IDispatch *pDisp;
HRESULT hr;
hr = pPath->CopyPath(&pDisp);
if(FAILED(hr)) exit(hr);

IADsPathname *pPathCopy;
hr = pDisp->QueryInterface(IID_IADsPathname,(void**)&pPathCopy);

// ...

Requisitos
Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

IADsPathname

Comentários
Esta página foi útil?  Yes  No
Método IADsPathname::GetElement
(iads.h)
Artigo24/08/2023

O método IADsPathname::GetElement recupera um elemento de um caminho de


diretório.

Sintaxe
C++

HRESULT GetElement(
[in] long lnElementIndex,
[out] BSTR *pbstrElement
);

Parâmetros
[in] lnElementIndex

O índice do elemento.

[out] pbstrElement

O elemento retornado.

Valor retornado
Esse método dá suporte aos valores retornados padrão, bem como aos seguintes:

Para obter mais informações e outros valores retornados, consulte Códigos de erro
ADSI.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008


Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

IADsPathname

Comentários
Esta página foi útil?  Yes  No
Método
IADsPathname::GetEscapedElement
(iads.h)
Artigo24/08/2023

O método IADsPathname::GetEscapedElement é usado para escapar de caracteres


especiais no caminho de entrada.

Sintaxe
C++

HRESULT GetEscapedElement(
[in] long lnReserved,
[in] BSTR bstrInStr,
[out] BSTR *pbstrOutStr
);

Parâmetros
[in] lnReserved

Reservado para uso futuro.

[in] bstrInStr

Uma cadeia de caracteres de entrada.

[out] pbstrOutStr

Uma cadeia de caracteres de saída.

Valor retornado
Esse método dá suporte aos valores retornados padrão, bem como o seguinte:

Para obter mais informações e outros valores retornados, consulte Códigos de erro
ADSI.
Comentários
Esse método é usado para manipular um caminho que contém caracteres especiais em
uma cadeia de caracteres sem escape como entrada de uma interface do usuário. A
cadeia de caracteres de entrada deve ser um único elemento (par nome-valor) do
caminho; ou seja, "CN=Smith, Jeff".

Exemplos
O exemplo de código do Visual Basic a seguir mostra o efeito produzido por
IADsPathname::GetEscapedElement. Depois que esse código for executado, rdn
conterá "cn=smith,jeff".

VB

Dim x As New Pathname

rdn = x.GetEscapedElement(0, "cn=smith,jeff")

O exemplo de código VBScript a seguir mostra o efeito produzido por


IADsPathname::GetEscapedElement. Depois que esse código for executado, rdn
conterá "cn=smith,jeff".

VB

Dim x
Set x = CreateObject("Pathname")
rdn = x.GetEscapedElement(0, "cn=smith,jeff")

O exemplo de código C++ a seguir mostra o efeito produzido por


IADsPathname::GetEscapedElement. Depois que esse código for executado, rdn
conterá "cn=smith,jeff".

C++

LPWSTR adsPath=L"LDAP://server/cn=jeffsmith,dc=Fabrikam,dc=com";

IADsPathname *pPath = GetPathnameObject(adsPath);


BSTR rdn;
HRESULT hr = pPath->GetEscapedElement(0,CComBSTR("cn=smith,jeff")
,&rdn);

pPath->Release();
Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

IADsPathname

Comentários
Esta página foi útil?  Yes  No
Método
IADsPathname::GetNumElements
(iads.h)
Artigo24/08/2023

O método IADsPathname::GetNumElements recupera o número de elementos no


caminho.

Sintaxe
C++

HRESULT GetNumElements(
[out] long *plnNumPathElements
);

Parâmetros
[out] plnNumPathElements

O número de elementos no caminho.

Valor retornado
Esse método dá suporte aos valores retornados padrão, bem como o seguinte:

Para obter mais informações e outros valores retornados, consulte Códigos de erro
ADSI.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows


Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

IADsPathname

Comentários
Esta página foi útil?  Yes  No
Método
IADsPathname::RemoveLeafElement
(iads.h)
Artigo24/08/2023

O método IADsPathname::RemoveLeafElement remove o último elemento do caminho


de diretório que foi definido no objeto Pathname.

Sintaxe
C++

HRESULT RemoveLeafElement();

Valor retornado
Esse método dá suporte aos valores retornados padrão, bem como o seguinte:

Para obter mais informações e outros valores retornados, consulte Códigos de erro
ADSI.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI
IADsPathname

Comentários
Esta página foi útil?  Yes  No
Método IADsPathname::Retrieve (iads.h)
Artigo24/08/2023

O método IADsPathname::Retrieve recupera o caminho do objeto com tipos de


formato diferentes.

Sintaxe
C++

HRESULT Retrieve(
[in] long lnFormatType,
[out] BSTR *pbstrADsPath
);

Parâmetros
[in] lnFormatType

Especifica o formato no qual o caminho deve ser recuperado. Esse pode ser um dos
valores especificados na enumeração ADS_FORMAT_ENUM .

[out] pbstrADsPath

Contém um ponteiro para um valor BSTR que recebe o caminho do objeto. O chamador
deve liberar essa memória com a função SysFreeString quando ela não for mais
necessária.

Valor retornado
Esse método dá suporte aos valores retornados padrão, bem como aos seguintes.

Para obter mais informações e outros valores retornados, consulte Códigos de erro
ADSI.

Requisitos

Cliente mínimo com suporte Windows Vista


Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

ADS_FORMAT_ENUM

IADsPathname

Sysfreestring

Comentários
Esta página foi útil?  Yes  No
Método IADsPathname::Set (iads.h)
Artigo24/08/2023

O método IADsPathname::Set configura o objeto Pathname para analisar um caminho


de diretório. O caminho é definido com um formato conforme definido em
ADS_SETTYPE_ENUM.

Sintaxe
C++

HRESULT Set(
[in] BSTR bstrADsPath,
[in] long lnSetType
);

Parâmetros
[in] bstrADsPath

Caminho de um objeto ADSI.

[in] lnSetType

Uma opção ADS_SETTYPE_ENUM que define o tipo de formato a ser recuperado.

Valor retornado
Esse método dá suporte aos valores retornados padrão, bem como o seguinte:

Para obter mais informações e outros valores retornados, consulte Códigos de erro
ADSI.

Comentários
Esse método definirá o namespace conforme especificado e identificará o provedor
apropriado para executar a operação de quebra de caminho. A redefinição para um
namespace diferente perderá dados já definidos por esse método.
Exemplos
O exemplo de código do Visual Basic a seguir define um caminho ADSI completo no
objeto Pathname.

VB

Dim x As New Pathname

x.Set "LDAP://server/CN=Jeff Smith, DC=Fabrikam, DC=Com", _


ADS_SETTYPE_FULL
dn = x.GetElement(0) ' dn now is "CN=Jeff Smith".

O exemplo de código VBScript/ASP a seguir define um caminho ADSI completo no


objeto Pathname.

VB

<%
Dim x
const ADS_SETTYPE_FULL = 1
Set x = CreateObject("Pathname")
path = "LDAP://server/CN=Jeff Smith, DC=Fabrikam,DC=com"
x.Set path, ADS_SETTYPE_FULL
dn = x.GetElement(0) ' dn now is "CN=Jeff Smith".
%>

O exemplo de código C++ a seguir define um caminho ADSI completo no objeto


Pathname.

C++

IADsPathname *pPathname=NULL;
HRESULT hr;

hr = CoCreateInstance(CLSID_Pathname,
NULL,
CLSCTX_INPROC_SERVER,
IID_IADsPathname,
(void**)&pPathname);

if(FAILED(hr))
{
if(pPathname) pPathname->Release();
return NULL;
}

hr = pPathname->Set(CComBSTR("LDAP://CN=pencil/desk"),
ADS_SETTYPE_FULL);
Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
Códigos de erro ADSI

ADS_SETTYPE_ENUM

IADsPathname

Comentários
Esta página foi útil?  Yes  No
Método IADsPathname::SetDisplayType
(iads.h)
Artigo24/08/2023

O método IADsPathname::SetDisplayType especifica como exibir o caminho de um


objeto. Ele pode consultar o caminho a ser exibido em uma cadeia de caracteres com
atributos de nomenclatura e valores, ou seja, "CN=Jeff Smith" ou apenas com valores,
ou seja, "Jeff Smith".

Sintaxe
C++

HRESULT SetDisplayType(
long lnDisplayType
);

Parâmetros
lnDisplayType

O tipo de exibição de um caminho conforme definido em ADS_DISPLAY_ENUM.

Valor retornado
Esse método dá suporte aos valores retornados padrão, incluindo o seguinte:

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll
Confira também
Códigos de erro ADSI

ADS_DISPLAY_ENUM

IADsPathname

Comentários
Esta página foi útil?  Yes  No
Interface IADsWinNTSystemInfo (iads.h)
Artigo14/03/2023

A interface IADsWinNTSystemInfo recupera as informações do sistema WinNT sobre


um computador. Essas informações do sistema incluem o nome da conta de usuário, o
domínio do usuário, o nome do host e o controlador de domínio primário do
computador host.

A interface IADsWinNTSystemInfo é implementada no objeto WinNTSystemInfo que


reside em Activeds.dll, que está incluído na instalação padrão do ADSI para edições
compatíveis com domínio do Windows. Você deve criar explicitamente uma instância do
objeto WinNTSystemInfo para chamar os métodos na interface IADsWinNTSystemInfo
. Esse requisito significa criar uma instância WinNTSystemInfo com a função
CoCreateInstance em C/C++.

C++

IADsWinNTSystemInfo *pNTsys;
HRESULT hr = CoCreateInstance(CLSID_WinNTSystemInfo,
NULL,
CLSCTX_INPROC_SERVER,
IID_IADsWinNTSystemInfo,
(void**)&pNTsys);

Você também pode usar o operador New no Visual Basic.

VB

Dim ntSys As New WinNTSystemInfo

Você também pode chamar a função CreateObject em um ambiente de script,


fornecendo "WinNTSystemInfo" como o ProgID.

VB

Dim ntSys
Set ntSys = CreateObject("WinNTSystemInfo")

Herança
A interface IADsWinNTSystemInfo herda da interface IDispatch.
Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Cocreateinstance

Métodos de propriedade IADsWinNTSystemInfo

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos de propriedade
IADsWinNTSystemInfo
Artigo • 12/06/2023

Os métodos de propriedade da interface IADsWinNTSystemInfo obtêm ou definem as


propriedades descritas na tabela a seguir. Para obter mais informações, consulte
Métodos de propriedade de interface.

Propriedades
ComputerName

Nome do computador host em que o aplicativo está sendo executado.

Tipo de acesso: Somente leitura

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_ComputerName(
[out] BSTR* pbstrComputer
);

DomainName

Nome do domínio ao qual o usuário pertence.

Tipo de acesso: Somente leitura

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_DomainName(
[out] BSTR* pbstrDomain
);

PDC

Nome do controlador de domínio primário ao qual o computador host pertence.


Tipo de acesso: Somente leitura

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_PDC(
[out] BSTR* pbstrPDC
);

UserName

Nome da conta de usuário sob a qual o objeto WinNTSystemInfo é criado.

Tipo de acesso: Somente leitura

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_UserName(
[out] BSTR* pbstrUser
);

Exemplos
O exemplo de código C/C++ a seguir recupera as informações do sistema WinNT. Para
resumir, a verificação de erros é omitida.

C++

#include <activeds.h>
#include <stdio.h>

int main()
{
HRESULT hr;

hr = CoInitialize(NULL);

IADsWinNTSystemInfo *pNtSys;
hr = CoCreateInstance(CLSID_WinNTSystemInfo,
NULL,
CLSCTX_INPROC_SERVER,
IID_IADsWinNTSystemInfo,
(void**)&pNTsys);
BSTR bstr;
hr = pNtSys->get_UserName(&bstr);
if (SUCCEEDED(hr)) {
printf("User: %S\n", bstr);
SysFreeString(bstr);
}

hr = pNtSys->get_ComputerName(&bstr);
if (SUCCEEDED(hr)) {
printf("Computer: %S\n", bstr);
SysFreeString(bstr);
}

hr = pNtSys->get_DomainName(&bstr);
if (SUCCEEDED(hr)) {
printf("Domain: %S\n", bstr);
SysFreeString(bstr);
}

hr = pNtSys->get_PDC(&bstr);
if (SUCCEEDED(hr)) {
printf("PDC: %S\n", bstr);
SysFreeString(bstr);
}

if(pNtSys) {
pNtSys->Release();
}

CoUninitialize();
return 0;
}

O exemplo de código do Visual Basic a seguir recupera as informações do sistema


WinNT.

VB

Dim ntsys As New WinNTSystemInfo


Debug.print "User: " & ntsys.UserName
Debug.print "Computer: " & ntsys.ComputerName
Debug.print "Domain: " & ntsys.DomainName
Debug.print "PDC: " & ntsys.PDC

O exemplo de código do Visual Basic Scripting Edition/Active Server Pages a seguir


recupera as informações do sistema WinNT.

VB
<%
Dim ntsys
Set ntsys = CreateObject("WinNTSystemInfo")
Response.Write "User: " & ntsys.UserName
Response.Write "Computer: " & ntsys.ComputerName
Response.Write "Domain: " & ntsys.DomainName
Response.Write "PDC: " & ntsys.PDC
%>

Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsWinNTSystemInfo é definido como 6C6D65DC-AFD1-11D2-


9CB9-0000F87A369E

Confira também
IADsWinNTSystemInfo

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interfaces de tipo de dados
Artigo • 03/06/2023

Esta seção descreve as seguintes interfaces de tipo de dados:

IADsAcl
IADsBackLink
IADsCaseIgnoreList
IADsDNWithBinary
IADsDNWithString
IADsEmail
IADsFaxNumber
IADsHold
Iadslargeinteger
IADsNetAddress
IADsOctetList
IADsPath
IADsPostalAddress
IADsReplicaPointer
IADsTimestamp
IADsTypedName

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interface IADsAcl (iads.h)
Artigo24/08/2023

A interface IADsAcl fornece métodos para um cliente ADSI acessar e manipular os


valores de atributo ACLherdado ou ACL herdado . Essa interface manipula os atributos.

Herança
A interface IADsAcl herda da interface IDispatch . IADsAcl também tem esses tipos de
membros:

Métodos
A interface IADsAcl tem esses métodos.

IADsAcl::CopyAcl

O método IADsAcl::CopyAcl faz uma cópia da ACL existente.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Métodos de propriedade IADsAcl

IDispatch
Comentários
Esta página foi útil?  Yes  No
Métodos da propriedade IADsAcl
Artigo • 13/06/2023

O método de propriedade da interface IADsAcl define a propriedade descrita na tabela


a seguir. Para obter mais informações, consulte Métodos de propriedade de interface.

Propriedades
Privilégios

Configurações de privilégio.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_Privileges(
[out] LONG* retval
);
HRESULT put_Privileges(
[in] LONG lnPrivileges
);

ProtectedAttrName

Nome de um atributo protegido.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_ProtecteAttrName(
[out] BSTR* retVal
);
HRESULT put_ProtectedAttrName(
[in] BSTR bstrProtectedAttrName
);

Subjectname
Nome do assunto.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_SubjectName(
[out] BSTR* retval
);
HRESULT put_SubjectName(
[in] BSTR bstrSubjectName
);

Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsAcl é definido como 8452D3AB-0869-11D1-A377-


00C04FB950DC

Confira também
IADsAcl

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Método IADsAcl::CopyAcl (iads.h)
Artigo24/08/2023

O método IADsAcl::CopyAcl faz uma cópia da ACL existente.

Sintaxe
C++

HRESULT CopyAcl(
IDispatch **ppAcl
);

Parâmetros
ppAcl

Ponteiro para a cópia recém-criada da ACL existente.

Valor retornado
Esse método dá suporte aos valores retornados padrão, bem como aos seguintes:

Para obter outros valores retornados, consulte Códigos de erro ADSI.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

DLL Activeds.dll

Confira também
IADsAcl

Comentários
Esta página foi útil?  Yes  No
Interface IADsBackLink (iads.h)
Artigo14/03/2023

A interface IADsBackLink fornece métodos para um cliente ADSI acessar o atributo Back
Link . Você pode chamar os métodos de propriedade dessa interface para obter e
modificar o atributo.

Herança
A interface IADsBackLink herda da interface IDispatch.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Métodos de propriedade IADsBackLink

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos de propriedade IADsBackLink
Artigo • 12/06/2023

O método de propriedade da interface IADsBackLink define a propriedade descrita na


tabela a seguir. Para obter mais informações, consulte Métodos de propriedade de
interface.

Propriedades
ObjectName

O nome de um objeto ao qual o atributo Back Link está anexado.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

// C++ method syntax


HRESULT get_ObjectName(
[out] BSTR* retval
);
HRESULT put_ObjectName(
[in] BSTR bstrSubjectName
);

RemoteID

O identificador do servidor remoto que requer uma referência externa do objeto


especificado por ObjectName.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

// C++ method syntax


HRESULT get_RemoteID(
[out] LONG* retVal
);
HRESULT put_RemoteID(
[in] LONG bstrProtectedAttrName
);

Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsBackLink é definido como FD1302BD-4080-11D1-A3AC-


00C04FB950DC

Confira também
IADsBackLink

ADS_BACKLINK

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interface IADsCaseIgnoreList (iads.h)
Artigo14/03/2023

A interface IADsCaseIgnoreList fornece métodos para um cliente ADSI acessar o


atributo Lista de Ignorar Maiúsculas e Minúsculas. Você pode chamar os métodos de
propriedade dessa interface para obter e modificar o atributo.

Herança
A interface IADsCaseIgnoreList herda da interface IDispatch.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Métodos de propriedade IADsCaseIgnoreList

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos de propriedade
IADsCaseIgnoreList
Artigo • 13/06/2023

O método de propriedade da interface IADsCaseIgnoreList define a propriedade


descrita na tabela a seguir. Para obter mais informações, consulte Métodos de
propriedade de interface.

Propriedades
CaseIgnoreList

Uma sequência ordenada de cadeias de caracteres que não diferenciam maiúsculas de


minúsculas.

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT

syntax

// C++ method syntax


HRESULT get_CaseIgnoreList(
[out] VARIANT* retVal
);
HRESULT put_CaseIgnoreList(
[in] VARIANT vCaseIgnoreList
);

Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll
Requisito Valor

IID IID_IADsCaseIgnoreList é definido como 7B66B533-4680-11D1-A3B4-


00C04FB950DC

Confira também
IADsCaseIgnoreList

ADS_CASEIGNORE_LIST

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interface IADsDNWithBinary (iads.h)
Artigo14/03/2023

A interface IADsDNWithBinary fornece métodos para um cliente ADSI associar um DN


(nome distinto) ao GUID de um objeto.

Herança
A interface IADsDNWithBinary herda da interface IDispatch.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Métodos de propriedade IADsDNWithBinary

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos de propriedade
IADsDNWithBinary
Artigo • 13/06/2023

O método de propriedade da interface IADsDNWithBinary define a propriedade


descrita na tabela a seguir. Para obter mais informações, consulte Métodos de
propriedade de interface.

Propriedades
BinaryValue

O GUID de um objeto associado a um DN.

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT

syntax

// C++ method syntax


HRESULT get_BinaryValue(
[out] VARIANT* retVal
);
HRESULT put_BinaryValue(
[in] VARIANT varBV
);

DNString

A cadeia de caracteres DN associada ao GUID de um objeto .

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_DNString(
[out] BSTR* retval
);
HRESULT put_DNString(
[in] BSTR bstrDN
);
Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsDNWithBinary é definido como 7E99C0A2-F935-11D2-BA96-


00C04FB6D0D1

Confira também
IADsDNWithBinary

ADS_DN_WITH_BINARY

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interface IADsDNWithString (iads.h)
Artigo14/03/2023

A interface IADsDNWithString fornece métodos para um cliente ADSI associar um DN


(nome distinto) a um valor de cadeia de caracteres.

Herança
A interface IADsDNWithString herda da interface IDispatch.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Métodos da propriedade IADsDNWithString

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos da propriedade
IADsDNWithString
Artigo • 13/06/2023

O método de propriedade da interface IADsDNWithString define a propriedade


descrita na tabela a seguir. Para obter mais informações, consulte Métodos de
propriedade de interface.

Propriedades
DNString

A cadeia de caracteres DN associada a um valor de cadeia de caracteres.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_DNString(
[out] BSTR* retval
);
HRESULT put_DNString(
[in] BSTR bstrDN
);

Stringvalue

O valor da cadeia de caracteres associado a um DN de um objeto .

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_StringValue(
[out] BSTR* retVal
);
HRESULT put_StringValue(
[in] BSTR varBV
);
Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsDNWithString é definido como 370DF02E-F934-11D2-BA96-


00C04FB6D0D1

Confira também
IADsDNWithString

ADS_DN_WITH_STRING

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interface IADsEmail (iads.h)
Artigo14/03/2023

A interface IADsEmail fornece métodos para um cliente ADSI acessar o atributo


endereço Email.

Você pode chamar os métodos de propriedade dessa interface para obter e modificar o
atributo.

Herança
A interface IADsEmail herda da interface IDispatch.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Métodos de propriedade IADsEmail

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos de propriedade IADsEmail
Artigo • 12/06/2023

O método de propriedade da interface IADsEmail define a propriedade descrita na


tabela a seguir. Para obter mais informações, consulte Métodos de propriedade de
interface.

Propriedades
Endereço

O endereço de email do usuário.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Address(
[out] BSTR* retval
);
HRESULT put_Address(
[in] BSTR bstrAddress
);

Tipo

O tipo da mensagem de email.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_Type(
[out] LONG* retVal
);
HRESULT put_Type(
[in] LONG lnType
);
Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsEmail é definido como 97AF011A-478E-11D1-A3B4-


00C04FB950DC

Confira também
IADsEmail

ADS_EMAIL

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interface IADsFaxNumber (iads.h)
Artigo14/03/2023

A interface IADsFaxNumber fornece métodos para um cliente ADSI acessar o atributo


Número de Telefone Facsimile.

Você pode chamar os métodos de propriedade dessa interface para obter e modificar o
atributo.

Herança
A interface IADsFaxNumber herda da interface IDispatch.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Métodos de propriedade IADsFaxNumber

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos de propriedade
IADsFaxNumber
Artigo • 13/06/2023

O método de propriedade da interface IADsFaxNumber define a propriedade descrita


na tabela a seguir. Para obter mais informações, consulte Métodos de propriedade de
interface.

Propriedades
Parâmetros

Os parâmetros do computador de fax.

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT

// C++ method syntax


HRESULT get_Parameters(
[out] VARIANT* retval
);
HRESULT put_Parameters(
[in] VARIANT vParameters
);

TelephoneNumber

O número de telefone do computador de fax.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

// C++ method syntax


HRESULT get_TelephoneNumber(
[out] BSTR* retVal
);
HRESULT put_TelephoneNumber(
[in] BSTR bstrTelephoneNumber
);
Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsFaxNumber é definido como A910DEA9-4680-11D1-0A3B-


00C04FB950DC

Confira também
IADsFaxNumber

ADS_FAXNUMBER

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interface IADsHold (iads.h)
Artigo14/03/2023

A interface IADsHold fornece métodos para um cliente ADSI acessar o atributo Hold .

Você pode chamar os métodos de propriedade dessa interface para obter e modificar o
atributo.

Herança
A interface IADsHold herda da interface IDispatch.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Métodos de propriedade IADsHold

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos de propriedade IADsHold
Artigo • 03/06/2023

O método de propriedade da interface IADsHold define a propriedade descrita na


tabela a seguir. Para obter mais informações, consulte Métodos de Propriedade de
Interface.

Propriedades
Quantidade

A quantidade de encargos cobrados contra o usuário pelo período em espera enquanto


o servidor verifica o saldo da conta do usuário.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_Amount(
[out] LONG* retval
);
HRESULT put_Amount(
[in] LONG lnAmount
);

ObjectName

O nome do objeto que representa um usuário em espera.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_ObjectName(
[out] BSTR* retVal
);
HRESULT put_ObjectName(
[in] BSTR bstrObjectName
);
Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsHold é definido como B3EB3B37-4080-11D1-A3AC-


00C04FB950DC

Confira também
IADsHold

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interface IADsLargeInteger (iads.h)
Artigo14/03/2023

A interface IADsLargeInteger é usada para manipular inteiros de 64 bits do tipo


LargeInteger .

Herança
A interface IADsLargeInteger herda da interface IDispatch.

Comentários
O tratamento do IADsLargeInteger no Visual Basic é dificultado pelo fato de que o
Visual Basic não tem nenhum tipo de dados numérico não assinado nativo. Isso poderá
causar erros na conversão de dados se LowPart ou HighPart tiver o conjunto de bits
alto, o que fará com que o Visual Basic manipule o número como negativo. Os exemplos
de código do Visual Basic abaixo mostram como lidar corretamente com o
IADsLargeInteger no Visual Basic.

Exemplos

O exemplo a seguir mostra como converter um objeto IADsLargeInteger em uma


cadeia de caracteres hex.

VB

Dim oDomain As IADs


Dim oLargeInt As LargeInteger

Set oDomain = GetObject("LDAP://DC=fabrikam,DC=com")


Set oLargeInt = oDomain.Get("creationTime")

Debug.Print oLargeInt.HighPart
Debug.Print oLargeInt.LowPart

strTemp = "&H" + CStr(Hex(oLargeInt.HighPart)) + _


CStr(Hex(oLargeInt.LowPart))
Debug.Print strTemp

No Visual Basic, é possível converter um objeto IADsLargeInteger que representa uma


data e/ou hora em uma Variant de tempo usando as APIs FileTimeToSystemTime e
SystemTimeToVariantTime . Isso é mostrado no exemplo de código a seguir.
VB

Public Declare Function FileTimeToSystemTime Lib "kernel32" _


(lpFileTime As FILETIME, _
lpSystemTime As SYSTEMTIME) As Long

Public Declare Function SystemTimeToVariantTime Lib "oleaut32.dll" _


(lpSystemTime As SYSTEMTIME, _
dbTime As Double) As Long

Public Type SYSTEMTIME


wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type

Public Type FILETIME


dwLowDateTime As Long
dwHighDateTime As Long
End Type

' This function will convert the ADSI data type LargeInteger to
' a Variant time value in Greenwich Mean Time (GMT).
Function LargeInteger_To_Time(oLargeInt As LargeInteger, vTime As Variant)_
As Boolean
On Error Resume Next
Dim pFileTime As FILETIME
Dim pSysTime As SYSTEMTIME
Dim dbTime As Double
Dim lResult As Long

If (oLargeInt.HighPart = 0 And oLargeInt.LowPart = 0) Then


vTime = 0
LargeInteger_To_Time = True
Exit Function
End If

If (oLargeInt.LowPart = -1) Then


vTime = -1
LargeInteger_To_Time = True
Exit Function
End If

pFileTime.dwHighDateTime = oLargeInt.HighPart
pFileTime.dwLowDateTime = oLargeInt.LowPart

' Convert the FileTime to System time.


lResult = FileTimeToSystemTime(pFileTime, pSysTime)
If lResult = 0 Then
LargeInteger_To_Time = False
Debug.Print "FileTimeToSystemTime: " + Err.Number + " - "_
+ Err.Description
Exit Function
End If

' Convert System Time to a Double.


lResult = SystemTimeToVariantTime(pSysTime, dbTime)
If lResult = 0 Then
LargeInteger_To_Time = False
Debug.Print "SystemTimeToVariantTime: " + Err.Number + _
" - " + Err.Description
Exit Function
End If

' Place the double in the variant.


vTime = CDate(dbTime)
LargeInteger_To_Time = True

End Function

O exemplo a seguir mostra como converter um IADsLargeInteger em um inteiro de 64


bits.

C++

HRESULT PrintAccountExpires(LPCWSTR pwszADsPath)


{
if(!pwszADsPath)
{
return E_INVALIDARG;
}

HRESULT hr;
CComPtr<IADs> spads;

// Bind to the object.


hr = ADsGetObject(pwszADsPath, IID_IADs, (LPVOID*)&spads);
if(FAILED(hr))
{
return hr;
}

/*
Get the accountExpires attribute, which is an
IDispatch that contains an IADsLargeInteger.
*/
CComVariant svar;
hr = spads->Get(CComBSTR("accountExpires"), &svar);
if(FAILED(hr))
{
return hr;
}

// Get the IADsLargeInteger interface.


CComPtr<IADsLargeInteger> spli;
hr = svar.pdispVal->QueryInterface(IID_IADsLargeInteger,
(LPVOID*)&spli);
if(FAILED(hr))
{
return hr;
}

// Get the high and low parts of the value.


long lHigh;
long lLow;
hr = spli->get_HighPart(&lHigh);
hr = spli->get_LowPart(&lLow);

// Convert the high and low parts to an __i64.


__int64 i64;
i64 = (ULONG)lHigh;
i64 = (i64 << 32);
i64 = i64 + (ULONG)lLow;

// Print all of the values.


wprintf(L"HighPart = %u, LowPart = %u, Combined = %I64d\n",
lHigh, lLow, i64);

return hr;
}

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Métodos de propriedade IADsLargeInteger

IDispatch
Comentários
Esta página foi útil?  Yes  No
Métodos da propriedade
IADsLargeInteger
Artigo • 13/06/2023

Os métodos de propriedade da interface IADsLargeInteger obtêm e definem as


propriedades descritas na tabela a seguir. Para obter mais informações, consulte
Métodos de propriedade de interface.

Propriedades
HighPart

A parte alta do inteiro.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_HighPart(
[out] LONG* retval
);
HRESULT put_HighPart(
[in] LONG lnHighPart
);

LowPart

A parte baixa do inteiro.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_LowPart(
[out] LONG* retval
);
HRESULT put_LowPart(
[in] LONG lnLowPart
);
Comentários
Se largeInt for do tipo LargeInteger , seu valor será especificado pelos de HighPart e
LowPart de acordo com a fórmula a seguir.

VB

largeInt = HighPart * 2^32 + LowPart

Exemplos
O exemplo de código do Visual Basic a seguir define um inteiro grande como
43937327281.

VB

Dim LI As New LargeInteger


LI.HighPart = 10
LI.LowPart = 987654321

Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsLargeInteger é definido como 9068270B-0939-11D1-8BE1-


00C04FD8D503

Confira também
Iadslargeinteger
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interface IADsNetAddress (iads.h)
Artigo14/03/2023

A interface IADsNetAddress fornece métodos para um cliente ADSI acessar o atributo


Endereço Líquido.

Você pode chamar os métodos de propriedade dessa interface para obter e modificar o
atributo.

Herança
A interface IADsNetAddress herda da interface IDispatch.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Métodos da propriedade IADsNetAddress

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos de propriedade
IADsNetAddress
Artigo • 12/06/2023

O método de propriedade da interface IADsNetAddress define a propriedade descrita


na tabela a seguir. Para obter mais informações, consulte Métodos de propriedade de
interface.

Propriedades
Endereço

Um endereço de rede.

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT

syntax

// C++ method syntax


HRESULT get_Address(
[out] VARIANT* retval
);
HRESULT put_Address(
[in] VARIANT vAddress
);

AddressType

Um tipo de protocolos de comunicação.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_AddressType(
[out] LONG* retVal
);
HRESULT put_AddressType(
[in] LONG lnAddressType
);
Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsNetAddress é definido como B21A50A9-4080-11D1-A3AC-


00C04FB950DC

Confira também
IADsNetAddress

ADS_NETADDRESS

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interface IADsOctetList (iads.h)
Artigo14/03/2023

A interface IADsOctetList fornece métodos para um cliente ADSI acessar o atributo


Octet List.

Você pode chamar os métodos de propriedade dessa interface para obter e modificar o
atributo.

Herança
A interface IADsOctetList herda da interface IDispatch.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Métodos de propriedade IADsOctetList

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos de propriedade IADsOctetList
Artigo • 03/06/2023

O método de propriedade da interface IADsOctetList define a propriedade descrita na


tabela a seguir. Para obter mais informações, consulte métodos de propriedade
interface.

Propriedades
OctetList

Uma sequência ordenada de matrizes de bytes.

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT

syntax

// C++ method syntax


HRESULT get_OctetList(
[out] VARIANT* retVal
);
HRESULT put_OctetList(
[in] VARIANT vOctetList
);

Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsOctetList é definido como 7B28B80F-4680-11D1-A3B4-


00C04FB950DC
Confira também
IADsOctetList

ADS_OCTET_LIST

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interface IADsPath (iads.h)
Artigo14/03/2023

A interface IADsPath fornece métodos para um cliente ADSI acessar o atributo Path .

Você pode chamar os métodos de propriedade dessa interface para obter e modificar o
atributo.

Herança
A interface IADsPath herda da interface IDispatch.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Métodos de propriedade IADsPath

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos de propriedade IADsPath
Artigo • 03/06/2023

O método de propriedade da interface IADsPath define a propriedade descrita na


tabela a seguir. Para obter mais informações, consulte Métodos de Propriedade de
Interface.

Propriedades
Caminho

Caminho de um diretório do sistema de arquivos.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_Path(
[out] BSTR* retval
);
HRESULT put_Path(
[in] BSTR bstrPath
);

Tipo

Tipo de arquivo do sistema de arquivos.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_Type(
[out] LONG* retVal
);
HRESULT put_Type(
[in] LONG lnType
);
VolumeName

Nome de um volume existente do sistema de arquivos.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_VolumeName(
[out] BSTR* retval
);
HRESULT put_VolumeName(
[in] BSTR bstrVolumeName
);

Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsPath é definido como B287FCD5-4080-11D1-A3AC-


00C04FB950DC

Confira também
IADsPath

ADS_PATH

Comentários
Esta página foi útil? ツ Yes ト No
Obter ajuda no Microsoft Q&A
Interface IADsPostalAddress (iads.h)
Artigo14/03/2023

A interface IADsPostalAddress fornece métodos para um cliente ADSI acessar o


atributo Endereço Postal .

Você pode chamar os métodos de propriedade dessa interface para obter e modificar o
atributo.

Herança
A interface IADsPostalAddress herda da interface IDispatch.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Métodos da propriedade IADsPostalAddress

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos da propriedade
IADsPostalAddress
Artigo • 13/06/2023

O método de propriedade da interface IADsPostalAddress define a propriedade


descrita na tabela a seguir. Para obter mais informações, consulte Métodos de
propriedade de interface.

Propriedades
PostalAddress

Uma matriz de seis cadeias de caracteres que contém o endereço postal do usuário.

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT

syntax

// C++ method syntax


HRESULT get_PostalAddress(
[out] VARIANT* retVal
);
HRESULT put_PostalAddress(
[in] VARIANT vPostalAddress
);

Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll
Requisito Valor

IID IID_IADsPostalAddress é definido como 7ADECF29-4680-11D1-A3B4-


00C04FB950DC

Confira também
IADsPostalAddress

ADS_POSTALADDRESS

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interface IADsReplicaPointer (iads.h)
Artigo14/03/2023

A interface IADsReplicaPointer fornece métodos para um cliente ADSI acessar o


atributo Ponteiro de Réplica .

Você pode chamar os métodos de propriedade dessa interface para obter e modificar o
atributo.

Herança
A interface IADsReplicaPointer herda da interface IDispatch.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Métodos de propriedade IADsReplicaPointer

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos de propriedade
IADsReplicaPointer
Artigo • 03/06/2023

O método de propriedade da interface IADsReplicaPointer define a propriedade


descrita na tabela a seguir. Para obter mais informações, consulte métodos de
propriedade interface.

Propriedades
Count

O número de réplicas existentes.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_Count(
[out] LONG* retval
);
HRESULT put_Count(
[in] LONG lnCount
);

ReplicaAddressHints

Um endereço de rede sugerido como uma referência provável a um nó que leva ao


servidor de nome.

Tipo de acesso: leitura/gravação

Tipo de dados de script: VARIANT

syntax

// C++ method syntax


HRESULT get_ReplicaAddressHints(
[out] VARIANT* retval
);
HRESULT put_ReplicaAddressHints(
[in] VARIANT vReplicaAddressHints
);

ReplicaNumber

Número de identificação da réplica.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_ReplicaNumber(
[out] LONG* retval
);
HRESULT put_ReplicaNumber(
[in] LONG lnReplicaNumber
);

ReplicaType

Tipo de réplica (mestre, secundário ou somente leitura).)

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_ReplicaType(
[out] LONG* retval
);
HRESULT put_ReplicaType(
[in] LONG lnType
);

ServerName

Nome do servidor de nome que contém a réplica.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax
// C++ method syntax
HRESULT get_ServerName(
[out] BSTR* retVal
);
HRESULT put_ServerName(
[in] BSTR bstrServerName
);

Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsReplicaPointer é definido como F60FB803-4080-11D1-A3AC-


00C04FB950DC

Confira também
IADsReplicaPointer

ADS_REPLICAPOINTER

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interface IADsTimestamp (iads.h)
Artigo14/03/2023

A interface IADsTimestamp fornece métodos para um cliente ADSI acessar o atributo


Timestamp .

Você pode chamar os métodos de propriedade dessa interface para obter e modificar o
atributo.

Herança
A interface IADsTimestamp herda da interface IDispatch.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Métodos da propriedade IADsTimestamp

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos de propriedade
IADsTimestamp
Artigo • 12/06/2023

O método de propriedade da interface IADsTimestamp define a propriedade descrita


na tabela a seguir. Para obter mais informações, consulte Métodos de propriedade de
interface.

Propriedades
EventID

Um identificador de evento.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_EventID(
[out] LONG* retval
);
HRESULT put_EventID(
[in] LONG lnEventID
);

WholeSeconds

Número de segundos com valor zero sendo 12:00, janeiro de 1970, UTC.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_WholeSeconds(
[out] LONG* retVal
);
HRESULT put_WholeSeconds(
[in] LONG lnWholeSeconds
);
Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsTimestamp é definido como B2F5A901-4080-11D1-A3AC-


00C04FB950DC

Confira também
IADsTimestamp

ADS_TIMESTAMP

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Interface IADsTypedName (iads.h)
Artigo14/03/2023

A interface IADsTypedName fornece métodos para um cliente ADSI acessar o atributo


Typed Name .

Você pode chamar os métodos de propriedade dessa interface para obter e modificar o
atributo.

Herança
A interface IADsTypedName herda da interface IDispatch.

Requisitos

Cliente mínimo com suporte Windows Vista

Servidor mínimo com suporte Windows Server 2008

Plataforma de Destino Windows

Cabeçalho iads.h

Confira também
Métodos de propriedade IADsTypedName

IDispatch

Comentários
Esta página foi útil?  Yes  No
Métodos de propriedade
IADsTypedName
Artigo • 03/06/2023

O método de propriedade da interface IADsTypedName define a propriedade descrita


na tabela a seguir. Para obter mais informações, consulte métodos de propriedade
interface.

Propriedades
Intervalo

A frequência de referência do objeto.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_Interval(
[out] LONG* retval
);
HRESULT put_Interval(
[in] LONG lnInterval
);

Level

O nível de prioridade associado ao objeto.

Tipo de acesso: leitura/gravação

Tipo de dados de script: LONG

syntax

// C++ method syntax


HRESULT get_Level(
[out] LONG* retval
);
HRESULT put_Level(
[in] LONG lnLevel
);
ObjectName

O nome de um objeto.

Tipo de acesso: leitura/gravação

Tipo de dados de script: BSTR

syntax

// C++ method syntax


HRESULT get_ObjectName(
[out] BSTR* retVal
);
HRESULT put_ObjectName(
[in] BSTR bstrObjectName
);

Requisitos
Requisito Valor

Cliente mínimo com Windows Vista


suporte

Servidor mínimo com Windows Server 2008


suporte

Cabeçalho Iads.h

DLL Activeds.dll

IID IID_IADsTypedName é definido como B371A349-4080-11D1-A3AC-


00C04FB950DC

Confira também
IADsTypedName

ADS_TYPEDNAME

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Provedores de Serviços ADSI
Artigo • 12/06/2023

ADSI inclui os provedores de serviços listados na tabela a seguir.

Provedor de Descrição Para obter mais


serviços informações

LDAP Implementação de namespace compatível com o Provedor ADSI


Lightweight Directory Access Protocol. LDAP

Winnt Implementação de namespace compatível com o Provedor ADSI


Windows. WinNT

Outros provedores de serviços são incluídos como parte de produtos diferentes do


ADSI. Veja a seguir os provedores de serviços ADSI implementados pela Microsoft.

Provedor de serviços Para obter mais informações

IIS Arquitetura do provedor ADSI do IIS

Os métodos e métodos de propriedade expostos por interfaces ADSI não são


compatíveis com todos os provedores de serviços. Como diferentes serviços de diretório
variam nos tipos de objetos e propriedades armazenados, use protocolos diferentes e
autenticação, o ADSI foi projetado para funcionar perfeitamente com provedores de
serviços com suporte. Portanto, há interfaces, métodos e métodos de propriedade que
funcionam com um provedor de serviços, como LDAP, que podem não funcionar em
outro, como WinNT.

Esta seção contém informações específicas do provedor, como o formato ADsPath, uma
listagem de objetos ADSI usados para esse provedor de serviços e informações de tipo
de dados e sintaxe para os provedores de serviços incluídos no ADSI. Há também uma
descrição resumida das interfaces ADSI compatíveis com cada provedor incluído no
ADSI.

No ADSI, diferentes provedores são associados a DLLs diferentes. O provedor LDAP está
associado a Adsldp.dll, Adsldpc.dll e Adsmsext.dll. O provedor WinNT está associado a
Adsnt.dll. O provedor ROUTER está associado a Activeds.dll.

7 Observação

Não suponha que os provedores ADSI padrão sejam thread-safe. Os


desenvolvedores de aplicativos multithread devem coordenar o acesso entre
threads por meio do uso adequado de objetos de sincronização, como semáforos,
mutexes, seções críticas e assim por diante.

Para obter mais informações sobre provedores de serviços ADSI, consulte AdsI Router
and Provider Support of ADSI interfaces.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Provedor ADSI LDAP
Artigo • 13/06/2023

O Provedor ADSI LDAP implementa um conjunto de objetos ADSI que dão suporte a
várias interfaces ADSI. Para acessar o provedor LDAP, associe a qualquer um dos objetos
LDAP ADSI, usando o LDAP ADsPath.

Você deve ter Adsldp.dll, Adsldpc.dll, Adsmsext.dll e Activeds.dll instalados no


computador cliente para trabalhar com o provedor.

7 Observação

O provedor LDAP ADSI padrão não pode ser considerado completamente thread-
safe. Os gravadores de aplicativos multithread devem coordenar corretamente o
acesso entre threads por meio do uso adequado de objetos de sincronização,
como semáforos, mutexes, seções críticas e assim por diante.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


LDAP ADsPath
Artigo • 13/06/2023

O ADsPath do provedor LDAP da Microsoft requer o seguinte formato.

C++

LDAP://HostName[:PortNumber][/DistinguishedName]

7 Observação

Os caracteres de colchete esquerdo e direito ([ ]) indicam parâmetros opcionais;


não é uma parte literal da cadeia de caracteres de associação.

O "HostName" pode ser um nome de computador, um endereço IP ou um nome de


domínio. Um nome de servidor também pode ser especificado na cadeia de caracteres
de associação. A maioria dos provedores LDAP segue um modelo que exige que um
nome de servidor seja especificado.

O "PortNumber" especifica a porta a ser usada para a conexão. Se nenhum número de


porta for especificado, o provedor LDAP usará o número da porta padrão. O número da
porta padrão será 389 se não estiver usando uma conexão SSL ou 636 se estiver usando
uma conexão SSL.

O "DistinguishedName" especifica o nome diferenciado de um objeto específico. Um


nome diferenciado para um determinado objeto tem a garantia de ser exclusivo.

A tabela a seguir lista exemplos de cadeias de caracteres de associação.

Exemplo de ADsPath LDAP Descrição

LDAP: Associar à raiz do namespace LDAP.

LDAP://server01 Associar a um servidor específico.

LDAP://server01:390 Associar a um servidor específico usando o


número da porta especificado.

LDAP://CN=Jeff Associar a um objeto específico.


Smith,CN=users,DC=fabrikam,DC=com
Exemplo de ADsPath LDAP Descrição

LDAP://server01/CN=Jeff Associar a um objeto específico por meio de um


Smith,CN=users,DC=fabrikam,DC=com servidor específico.

Se a autenticação Kerberos for necessária para a conclusão bem-sucedida de uma


solicitação de diretório específica, a cadeia de caracteres de associação deverá usar um
ADsPath sem servidor, como LDAP://CN=Jeff Smith,CN=users,DC=fabrikam,DC=com ou
deve usar um ADsPath com um nome de servidor DNS totalmente qualificado, como
LDAP://server01.fabrikam.com/CN=Jeff Smith,CN=users,DC=fabrikam, DC=com. A
associação ao servidor usando um nome NETBIOS simples ou um nome DNS curto, por
exemplo, usando o nome server01 em vez de server01.fabrikam.com, não tem garantia
de produzir autenticação Kerberos.

Para obter mais informações e exemplos de cadeias de caracteres de associação LDAP,


bem como uma descrição de caracteres especiais que podem ser usados em cadeias de
caracteres de associação LDAP, consulte LDAP ADsPath.

Windows 2000 com SP1 e posterior: Com o provedor LDAP, se uma cadeia de
caracteres de associação incluir um nome de servidor, você poderá aumentar o
desempenho usando o sinalizador ADS_SERVER_BIND com a função ADsOpenObject
ou o método IADsOpenDSObject::OpenDSObject . O sinalizador ADS_SERVER_BIND
indica que um nome de servidor foi especificado, o que permite que ADSI evite tráfego
de rede adicional e desnecessário.

Caracteres especiais LDAP


O LDAP tem vários caracteres especiais que são reservados para uso pela API LDAP. A
lista de caracteres especiais pode ser encontrada em Nomes Diferenciados. Para usar
um desses caracteres em um ADsPath sem gerar um erro, o caractere deve ser
precedido por um caractere de barra invertida (\). Isso é conhecido como escape do
caractere. Por exemplo, se um nome de usuário for fornecido na forma de "
<sobrenome>,< nome>", a vírgula no valor do nome deverá ser escapada. A cadeia de
caracteres resultante teria esta aparência:

C++

LDAP://CN=Smith\,Jeff,CN=users,DC=fabrikam,DC=com
O caractere de escape também pode ser especificado por seu código de caractere
hexadecimal de dois dígitos. Isso é mostrado no exemplo a seguir.

C++

LDAP://CN=Smith\2CJeff,CN=users,DC=fabrikam,DC=com

Caracteres não imprimíveis, como o feed de linha e o retorno de carro, devem ser
escapados e especificados pelo código de caractere hexadecimal de dois dígitos. Isso é
mostrado no exemplo a seguir.

C++

LDAP://CN=Line\0AFeed,CN=users,DC=fabrikam,DC=com

Para obter mais informações


Para obter mais informações sobre a notação de nome diferenciado usada pelos
serviços de diretório compatíveis com LDAP, consulte
https://www.ietf.org/rfc/rfc1779.txt .

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Mapeamento de tipo de dados entre o
Active Directory e o LDAP
Artigo • 03/06/2023

A tabela a seguir mapeia o nome da sintaxe amigável para o valor de sintaxe LDAP
correspondente OID e ADSTYPEENUM .

Nome da sintaxe OID de sintaxe LDAP Tipo de dados ADSTYPEENUM


amigável

AccessPointDN 1.3.6.1.4.1.1466.115.121.1.2 ADSTYPE_CASE_IGNORE_STRING

AttributeTypeDescription 1.3.6.1.4.1.1466.115.121.1.3 ADSTYPE_CASE_IGNORE_STRING

Áudio 1.3.6.1.4.1.1466.115.121.1.4 ADSTYPE_OCTET_STRING

Binário 1.3.6.1.4.1.1466.115.121.1.5 ADSTYPE_OCTET_STRING

BitString 1.3.6.1.4.1.1466.115.121.1.6 ADSTYPE_CASE_IGNORE_STRING

Boolean 1.3.6.1.4.1.1466.115.121.1.7 ADSTYPE_BOOLEAN

CaseExactString 1.2.840.113556.1.4.1362 ADSTYPE_CASE_EXACT_STRING

CaseIgnoreString 1.2.840.113556.1.4.1221 ADSTYPE_CASE_IGNORE_STRING

Certificado 1.3.6.1.4.1.1466.115.121.1.8 ADSTYPE_OCTET_STRING

CertificateList 1.3.6.1.4.1.1466.115.121.1.9 ADSTYPE_OCTET_STRING

CertificatePair 1.3.6.1.4.1.1466.115.121.1.10 ADSTYPE_OCTET_STRING

País/Região 1.3.6.1.4.1.1466.115.121.1.11 ADSTYPE_CASE_IGNORE_STRING

DataQualitySyntax 1.3.6.1.4.1.1466.115.121.1.13 ADSTYPE_CASE_IGNORE_STRING

Deliverymethod 1.3.6.1.4.1.1466.115.121.1.14 ADSTYPE_CASE_IGNORE_STRING

DirectoryString 1.3.6.1.4.1.1466.115.121.1.15 ADSTYPE_CASE_IGNORE_STRING

DN 1.3.6.1.4.1.1466.115.121.1.12 ADSTYPE_DN_STRING

DSAQualitySyntax 1.3.6.1.4.1.1466.115.121.1.19 ADSTYPE_CASE_IGNORE_STRING

EnhancedGuide 1.3.6.1.4.1.1466.115.121.1.21 ADSTYPE_CASE_IGNORE_STRING

FacsimileTelephoneNumber 1.3.6.1.4.1.1466.115.121.1.22 ADSTYPE_CASE_IGNORE_STRING

Fax 1.3.6.1.4.1.1466.115.121.1.23 ADSTYPE_OCTET_STRING


Nome da sintaxe OID de sintaxe LDAP Tipo de dados ADSTYPEENUM
amigável

GeneralizedTime 1.3.6.1.4.1.1466.115.121.1.24 ADSTYPE_UTC_TIME

Tempo (somente o servidor 1.3.6.1.4.1.1466.115.121.1.24 ADSTYPE_UTC_TIME


do site faz isso)

Guia 1.3.6.1.4.1.1466.115.121.1.25 ADSTYPE_CASE_IGNORE_STRING

IA5String 1.3.6.1.4.1.1466.115.121.1.26 ADSTYPE_CASE_IGNORE_STRING

INTEGER 1.3.6.1.4.1.1466.115.121.1.27 ADSTYPE_INTEGER

INTEGER8 (não em LDAP, 1.2.840.113556.1.4.906 ADSTYPE_LARGE_INTEGER


NTDS)

JPEG 1.3.6.1.4.1.1466.115.121.1.28 ADSTYPE_OCTET_STRING

MailPreference 1.3.6.1.4.1.1466.115.121.1.32 ADSTYPE_CASE_IGNORE_STRING

NameAndOptionalUID 1.3.6.1.4.1.1466.115.121.1.34 ADSTYPE_CASE_IGNORE_STRING

NumericString 1.3.6.1.4.1.1466.115.121.1.36 ADSTYPE_NUMERIC_STRING

ObjectClassDescription 1.3.6.1.4.1.1466.115.121.1.37 ADSTYPE_CASE_IGNORE_STRING

OctetString (não em RFC) 1.3.6.1.4.1.1466.115.121.1.40 ADSTYPE_OCTET_STRING

OID 1.3.6.1.4.1.1466.115.121.1.38 ADSTYPE_CASE_IGNORE_STRING

ORName 1.2.840.113556.1.4.1221 ADSTYPE_CASE_IGNORE_STRING

OtherMailbox 1.3.6.1.4.1.1466.115.121.1.39 ADSTYPE_CASE_IGNORE_STRING

PostalAddress 1.3.6.1.4.1.1466.115.121.1.41 ADSTYPE_CASE_IGNORE_STRING

PresentationAddress 1.3.6.1.4.1.1466.115.121.1.43 ADSTYPE_CASE_IGNORE_STRING

PrintableString 1.3.6.1.4.1.1466.115.121.1.44 ADSTYPE_PRINTABLE_STRING

ObjectSecurityDescriptor 1.2.840.113556.1.4.907 ADSTYPE_NT_SECURITY_DESCRIPTOR

TelephoneNumber 1.3.6.1.4.1.1466.115.121.1.50 ADSTYPE_CASE_IGNORE_STRING

TeletexTerminalIdentifier 1.3.6.1.4.1.1466.115.121.1.51 ADSTYPE_OCTET_STRING

TelexNumber 1.3.6.1.4.1.1466.115.121.1.52 ADSTYPE_CASE_IGNORE_STRING

UTCTime 1.3.6.1.4.1.1466.115.121.1.53 ADSTYPE_UTC_TIME


Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Objetos ADSI de LDAP
Artigo • 13/06/2023

A tabela a seguir lista objetos COM comumente usados para o provedor LDAP no ADSI,
juntamente com as interfaces ADSI compatíveis.

Objeto ADSI Descrição Interfaces com suporte

Classe Um objeto ADSI que representa uma Iads


definição de classe no esquema. IADsClass

GenObject Um objeto ADSI que representa os recursos Iads


genéricos de e fornece serviços comuns para IADsContainer
a maioria dos outros objetos ADSI para o IDirectoryObject
provedor LDAP. Idirectorysearch
IADsPropertyList
IADsObjectOptions
IADsDeleteOps

Grupo Um objeto ADSI que representa um grupo. IADsGroup

Groupcollection Um objeto ADSI que representa uma coleção IADsMembers


de grupos.

Localidade Um objeto ADSI que representa localidades IADsLocality


geográficas de um usuário, organização e
assim por diante.

Namespace Um objeto ADSI que representa o namespace IADsContainer


LDAP. Iads
IADsOpenDSObject

NameTranslate Um objeto ADSI que fornece os serviços para IADsNameTranslate


traduzir entradas do ADsPath de um formato
para outro.

Organização Um objeto ADSI que representa uma IADsO


organização.

Organizationalunit Um objeto ADSI que representa uma unidade IADsOU


organizacional.

Caminho Um objeto ADSI que representa o ADsPath. IADsPathname

PrintQueue Um objeto ADSI que representa uma fila de IADsPrintQueue


impressão. IADsPrintQueueOperations

Propriedade Um objeto ADSI que representa a definição Iads


de atributo no esquema. IADsProperty
Objeto ADSI Descrição Interfaces com suporte

Rootdse Um objeto ADSI que representa o DSE raiz. Iads


IADsPropertyList

Esquema Um objeto ADSI que representa o contêiner Iads


de esquema. IADsContainer

Sintaxe Um objeto ADSI que representa a sintaxe do Iads


atributo. IADsSyntax

Usuário Um objeto ADSI que representa uma conta Iadsuser


de usuário.

Usercollection Um objeto ADSI que implementa IADsMembers


IADsMembers para manter e gerenciar uma
coleção de contas de usuário.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Objeto de sintaxe LDAP
Artigo • 03/06/2023

O provedor LDAP usa o mapeamento a seguir entre a sintaxe LDAP e a sintaxe ADSI.

Sintaxe LDAP Sintaxe ADSI (Automação)

Adspath VT_BSTR

Boolean VT_BOOL

Contador VT_I4

EmailAddress VT_BSTR

FaxNumber VT_BSTR

Integer VT_I4

Intervalo VT_I4

Lista VT_VARIANT (VT_BSTR | VT_ARRAY)

NetAddress VT_BSTR

OctetString VT_VARIANT

Caminho VT_BSTR

PhoneNumber VT_BSTR

PostalAddress VT_BSTR

SmallInterval VT_I4

String VT_BSTR

Hora VT_DATE

Comentários

ツ ト
ツ Yes ト No
Esta página foi útil?

Obter ajuda no Microsoft Q&A


Objeto de usuário LDAP
Artigo • 03/06/2023

Os tópicos a seguir são discutidos para o objeto de usuário LDAP:

Mapeamento entre propriedades iadsUser e atributos do Active Directory


Criação de usuário com o provedor LDAP ADSI
Configurando e alterando senhas de usuário com o provedor LDAP
Exemplos de Gerenciamento de Usuários no Active Directory

Além disso, o objeto de usuário no Active Directory contém muito mais propriedades do
que as listadas na seção IADsUser . Como o Esquema do Active Directory é extensível,
outros fornecedores também podem adicionar atributos adicionais a uma classe.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Mapeamento entre propriedades
IADsUser e atributos do Active Directory
Artigo • 13/06/2023

Quando aplicável, uma propriedade do objeto de usuário ADSI é mapeada para um


atributo apropriado do Active Directory. As propriedades do objeto de usuário ADSI
estão associadas aos métodos de propriedade IADsUser .

A tabela a seguir lista o mapeamento entre as propriedades IADsUser para o provedor


LDAP e o atributo do Active Directory correspondente.

Propriedade IADsUser Atributo do Active Directory

Conta Desabilitada ADS_UF_ACCOUNTDISABLE sinalizador no atributo


userAccountControl .

AccountExpirationDate accountExpires

BadLoginAddress Sem suporte.

BadLoginCount badPwdCount

department Departamento

Descrição Descrição

Divisão Divisão

Emailaddress mail

Employeeid Employeeid

FaxNumber facsimileTelephoneNumber

Firstname givenName

FullName displayName

GraceLoginsAllowed Sem suporte.

GraceLoginsRemaining Sem suporte.

HomeDirectory homeDirectory

Homepage wWWHomePage

IsAccountLocked Lockouttime

Idiomas Sem suporte.


Propriedade IADsUser Atributo do Active Directory

LastFailedLogin badPasswordTime

LastLogin lastLogon

LastLogoff lastLogoff

Lastname sn

LoginHours logonHours

LoginScript scriptPath

LoginWorkstations userWorkstations

Gerente manager

MaxLogins Sem suporte.

MaxStorage maxStorage

NamePrefix personalTitle

NameSuffix generationQualifier

OfficeLocations physicalDeliveryOfficeName

OtherName middleName

PasswordExpirationDate Definir usando o Editor de Política de Grupo

PasswordLastChanged pwdLastSet

PasswordMinimumLength Definir usando o Editor de Política de Grupo

PasswordRequired ADS_UF_PASSWD_NOTREQD sinalizador no atributo


userAccountControl .

Imagem thumbnailPhoto

PostalAddresses postalAddress

PostalCodes Postalcode

Perfil profilePath

RequireUniquePassword Definir usando o Editor de Política de Grupo

SeeAlso seeAlso

TelephoneHome Homephone

TelephoneMobile Móvel
Propriedade IADsUser Atributo do Active Directory

Telephonenumber telephoneNumber

TelephonePager pager

Título título

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Criação de usuário com o provedor
LDAP ADSI
Artigo • 03/06/2023

Com o provedor LDAP ADSI, você só pode criar uma conta de usuário global. As contas
locais residem no banco de dados SAM e devem ser criadas usando o provedor WinNT.
Para obter mais informações sobre como criar um objeto de usuário com o provedor
WinNT, consulte o Objeto de Usuário winNT.

Para criar um objeto de usuário

1. Associar ao contêiner em que o objeto de usuário residirá e obterá a interface


IADsContainer ou IDirectoryObject para o contêiner.

2. Use o método IADsContainer.Create ou IDirectoryObject::CreateDSObject para


criar o objeto de usuário.

3. Os atributos mínimos necessários para criar um objeto de usuário dependerão do


serviço de diretório usado. Para obter mais informações sobre como criar um
usuário do Active Directory, consulte Criando um usuário.

4. Se a interface IADsContainer for usada, o novo objeto não será realmente criado
até que o método IADs.SetInfo seja chamado.

Se a interface IDirectoryObject for usada, o novo objeto será criado quando o


método CreateDSObject for chamado. Os atributos mínimos, incluindo o
objectClass, devem ser especificados na matriz ADS_ATTR_INFO passada para o
método CreateDSObject .

Exemplo 1
O exemplo de código a seguir cria uma conta de usuário com os atributos padrão.

VB

Dim ou As IADs
Dim usr as IADsUser

On Error GoTo Cleanup

Set ou = GetObject("LDAP://OU=Finance,DC=Fabrikam,DC=COM")
Set usr = ou.Create("user", "cn=Jeff Smith")
usr.Put "samAccountName", "jeffsmith"
usr.SetInfo

Cleanup:
If (Err.Number <> 0) Then
MsgBox ("An error has occurred. " & Err.Number)
End If
Set ou = Nothing
Set usr = Nothing

Exemplo 2
O exemplo de código a seguir cria uma conta de usuário com os atributos padrão. Para
fins de brevidade, a verificação de erros é omitida.

C++

#include <activeds.h>

int main()
{
HRESULT hr = CoInitialize(NULL);

IADsContainer *pCont;
IADsUser *pUser;

LPWSTR adsPath = L"LDAP://serv1/CN=Users,dc=Fabrikam,dc=com";


LPWSTR usrPass = NULL;
LPWSTR usrName = NULL;

// Add code to securely get the user name and password or leave
// as NULL to use the current security context.

hr = ADsOpenObject(adsPath,
usrName,
usrPass,
ADS_SECURE_AUTHENTICATION,
IID_IADsContainer,
(void**)&pCont);

IDispatch *pDisp;
hr = pCont->Create(CComBSTR("user"), CComBSTR("cn=Jeff Smith"), &pDisp);
pCont->Release();

hr = pDisp->QueryInterface(IID_IADsUser,(void**)&pUser);
pDisp->Release();

VARIANT var;
VariantInit(&var);
V_BSTR(&var) = L"jeffsmith";
V_VT(&var)=VT_BSTR;
hr = pUser->Put(CComBSTR("samAccountName"), var);
hr = pUser->SetInfo();

VariantClear(&var);
pUser->Release();

CoUninitialize();

return 0;
}

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Configurando e alterando senhas de
usuário com o provedor LDAP
Artigo • 12/06/2023

Para definir uma senha de usuário, use o método IADsUser.SetPassword .

O provedor LDAP para Active Directory usa um dos três processos para definir a senha
(diretórios LDAP de terceiros, como iPlanet, não usam esse processo de autenticação de
senha). O método pode variar de acordo com a configuração de rede. Os métodos de
senha definidos ocorrem na seguinte ordem:

Primeiro, o provedor LDAP tenta usar o LDAP em uma conexão SSL de 128 bits.
Para que o LDAP SSL opere com êxito, o servidor LDAP deve ter o certificado de
autenticação de servidor apropriado instalado e os clientes que executam o código
ADSI devem confiar na autoridade que emitiu esses certificados. O servidor e o
cliente devem dar suporte à criptografia de 128 bits.
Segundo, se a conexão SSL não for bem-sucedida, o provedor LDAP tentará usar
Kerberos. No Windows 2000, o Kerberos pode não dar suporte à autenticação
entre florestas. Melhorias posteriores no Kerberos dão suporte à autenticação
entre florestas.
Em terceiro lugar, se o Kerberos não for bem-sucedido, o provedor LDAP tentará
uma chamada à API NetUserSetInfo . Em versões anteriores, ADSI chamou
NetUserSetInfo no contexto de segurança no qual o thread estava em execução, e
não o contexto de segurança especificado na chamada para
IADsOpenDSObject.OpenDSObject ou ADsOpenObject. Em versões posteriores,
isso foi alterado para que o provedor LDAP ADSI representasse o usuário
especificado na chamada OpenDSObject ao chamar NetUserSetInfo.

Para alterar uma senha de usuário, use o método IADsUser.ChangePassword . Assim


como SetPassword, esse método pode usar vários processos para alterar a senha. Os
métodos de alteração de senha ocorrem na seguinte ordem:

Primeiro, o provedor LDAP tenta usar o LDAP em uma conexão SSL de 128 bits.
Segundo, se a conexão 128-SSL não for bem-sucedida, o provedor LDAP tentará
uma chamada à API NetUserChangePassword . Assim como SetPassword, em
versões anteriores, o provedor LDAP ADSI representa as credenciais do usuário
passadas usando o método IADsOpenDSObject.OpenDSObject ou a função
ADsOpenObject .
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Exemplos de Gerenciamento de
Usuários no Active Directory
Artigo • 13/06/2023

Os tópicos a seguir discutem os processos de gerenciamento de usuários no Active


Directory:

Conta Desabilitada (Provedor LDAP)


Expiração da conta (provedor LDAP)
Bloqueio de conta (provedor LDAP)
Senha Nunca Expira (Provedor LDAP)
Usuário não pode alterar senha (provedor LDAP)
O usuário deve alterar a senha no próximo logon (provedor LDAP)

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Conta desabilitada (Provedor LDAP)
Artigo • 03/06/2023

Para desabilitar uma conta de usuário, defina a propriedade AccountDisabled como


TRUE na interface IADsUser . Isso é semelhante ao provedor WinNT. Os exemplos de
código a seguir mostram como desabilitar uma conta de usuário.

Exemplo 1
VB

Dim usr As IADsUser


On Error GoTo Cleanup

Set usr = GetObject("LDAP:// CN=JeffSmith, OU=Sales, DC=Fabrikam, DC=Com")


usr.AccountDisabled = TRUE ' Disable the account.
usr.SetInfo

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If

Set usr = Nothing

Exemplo 2
C++

IADsUser *pUser = NULL;

HRESULT hr = S_OK;
LPWSTR adsPath;
adsPath=L"LDAP://serv1/cn=Jeff Smith,cn=Users, dc=Fabrikam, dc=com";
hr = ADsGetObject(adsPath,IID_IADsUser,(void**)&pUser);

if(FAILED(hr)){return;}

hr = pUser->put_AccountDisabled(true);
hr = pUser->SetInfo();
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Expiração da conta (provedor LDAP)
Artigo • 03/06/2023

Para definir a data de validade da conta, defina a propriedade


IADsUser.AccountExpirationDate como o valor de data desejado. Para desabilitar a data
de validade da conta, defina o atributo accountExpires como zero. Os exemplos de
código a seguir mostram como definir a data de validade.

VB

Public Sub SetUserAccountExpirationDate(User As IADsUser, ExpirationDate As


Date)
If 0 = ExpirationDate Then
' Disable the account expiration date.
User.Put "accountExpires", 0
Else
' Set the new account expiration date.
User.AccountExpirationDate = ExpirationDate
End If

User.SetInfo

End Sub

C++

/***************************************************************************

SetUserAccountExpirationDate()

***************************************************************************/

HRESULT SetUserAccountExpirationDate(IADsUser *pUser, DATE date)


{
if(!pUser)
{
return E_INVALIDARG;
}

HRESULT hr;

if(!date || date < 0)


{
// Account never expires. Set the accountExpires attribute to zero.
VARIANT var;
VariantInit(&var);
V_I4(&var) = 0;
V_VT(&var) = VT_I4;
hr = pUser->Put(CComBSTR("accountExpires"), var);

VariantClear(&var);
}
else
{
// Account expires on date.
hr = pUser->put_AccountExpirationDate(date);
}

if(S_OK == hr)
{
hr = pUser->SetInfo();
}

return hr;
}

7 Observação

O atributo accountExpires contém a data de expiração da conta. O snap-in


Usuários e Computadores do Active Directory MMC exibe a data em que a conta
expirará no final. Ou seja, o snap-in Usuários e Computadores do Active Directory
MMC exibirá a data de validade da conta como um dia antes da data contida no
atributo accountExpires.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Bloqueio de conta (provedor LDAP)
Artigo • 13/06/2023

Quando o número de tentativas de logon com falha é excedido, a conta de usuário é


bloqueada por um período de tempo especificado pelo atributo lockoutDuration . A
propriedade IADsUser.IsAccountLocked parece ser a propriedade a ser usada para ler e
modificar o estado de bloqueio de uma conta de usuário, mas o provedor ADSI LDAP
não dá suporte com precisão à propriedade IsAccountLocked . Para obter e definir
dados de bloqueio de conta precisos, use o provedor WinNT. Para obter mais
informações sobre como usar a propriedade IsAccountLocked com o provedor WinNT,
consulte Bloqueio de conta (Provedor WinNT).

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Senha Nunca Expira (Provedor LDAP)
Artigo • 03/06/2023

Para habilitar a opção de senha nunca expira usando o provedor LDAP, defina o
sinalizador ADS_UF_DONT_EXPIRE_PASSWD no atributo userAccountControl do
usuário.

VB

Const ADS_UF_DONT_EXPIRE_PASSWD = &H10000

Set usr = GetObject("LDAP://CN=jeffsmith,OU=Sales,DC=Fabrikam,DC=Com")


flag = usr.Get("userAccountControl")
newFlag = flag Or ADS_UF_DONT_EXPIRE_PASSWD
usr.Put "userAccountControl", newFlag
usr.SetInfo

C++

#include <activeds.h>

IADsUser *pUser;
VARIANT var;
VariantInit(&var);

HRESULT hr = S_OK;
LPWSTR adsPath = L"LDAP://serv1/cn=Jeff Smith,cn=Users,dc=Fabrikam,dc=com";
hr = ADsGetObject(adsPath, IID_IADsUser, (void**)&pUser);

hr = pUser->Get(_bstr_t("userAccountControl"), &var);

V_I4(&var) |= ADS_UF_DONT_EXPIRE_PASSWD;
hr = pUser->Put(_bstr_t("userAccountControl"), var);

hr = pUser->SetInfo();
VariantClear(&var);
hr = pUser->Release();

Comentários
Esta página foi útil? ツ Yes ト No
Obter ajuda no Microsoft Q&A
O usuário não pode alterar a senha
(provedor LDAP)
Artigo • 13/06/2023

A capacidade de um usuário alterar sua própria senha é uma permissão que pode ser
concedida ou negada. Para obter mais informações sobre como ler e modificar essa
permissão programaticamente usando o provedor LDAP, consulte:

O usuário de leitura não pode alterar a senha (provedor LDAP)


Modificar o usuário não pode alterar a senha (provedor LDAP)

É mais fácil ler e modificar a configuração Usuário Não Pode Alterar Senha usando o
provedor WinNT. Para obter mais informações, consulte User Cannot Change Password
(Provedor WinNT).

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


O usuário de leitura não pode alterar
senha (provedor LDAP)
Artigo • 13/06/2023

A capacidade de um usuário alterar sua senha é uma permissão que pode ser concedida
ou negada.

Para determinar se a permissão alterar senha é concedida ou negada

1. Associar ao objeto de usuário.

2. Obtenha o objeto IADsSecurityDescriptor da propriedade ntSecurityDescriptor


do objeto user.

3. Obtenha uma interface IADsAccessControlList para o descritor de segurança da


propriedade IADsSecurityDescriptor.DiscretionaryAcl .

4. Enumerar as ACE (entradas de controle de acesso) para o objeto e pesquisar os


ACEs que têm o GUID de senha de alteração ({AB721A53-1E2F-11D0-9819-
00AA0040529B}) para a propriedade IADsAccessControlEntry.ObjectType e as
entidades de segurança conhecidas "Everyone" ou "NT AUTHORITY\SELF" para a
propriedade IADsAccessControlEntry.Trustee .

7 Observação

As cadeias de caracteres "Todos" e "NT AUTHORITY\SELF" são localizadas com


base no idioma do primeiro controlador de domínio no domínio. Portanto, as
cadeias de caracteres não devem ser usadas diretamente. Os nomes de conta
devem ser obtidos em tempo de execução chamando a função
LookupAccountSid com o SID para as entidades de segurança conhecidas
"Todos" ("S-1-1-0") e "NT AUTHORITY\SELF" ("S-1-5-10"). Os seguintes
exemplos de código GetSidAccountName, GetSidAccountName_Everyone e
GetSidAccountName_Self do C++ mostram como fazer isso.

5. Se os ACEs "Everyone" e "NT AUTHORITY\SELF" tiverem o valor


ADS_ACETYPE_ACCESS_DENIED_OBJECT para a propriedade
IADsAccessControlEntry.AceType , a permissão será negada.
Código de exemplo
O exemplo de código a seguir mostra como determinar se o usuário não pode alterar a
permissão de senha usando o provedor LDAP.

C++

/***************************************************************************

GetSidAccountName()

Retrieves the account name for the specified SID.

pSid - Pointer to the SID that the account name should be retrieved for.

pbstrAccountName - Pointer to a BSTR that receives the account name. The


caller must free this with SysFreeString when it is no longer required.

***************************************************************************/

HRESULT GetSidAccountName(PSID pSid, BSTR *pbstrAccountName)


{
if(!pbstrAccountName)
{
return E_INVALIDARG;
}

HRESULT hr = E_FAIL;
BOOL fReturn;

WCHAR wszAccountName[MAX_PATH];
DWORD dwAccountName;
WCHAR wszDomainName[MAX_PATH];
DWORD dwDomainName;
SID_NAME_USE SidNameUse;
DWORD dwSidSize;

dwAccountName = MAX_PATH;
dwDomainName = MAX_PATH;
dwSidSize = SECURITY_MAX_SID_SIZE;

/*
Get the account name for the specified SID.
*/
fReturn = LookupAccountSidW(
NULL,
pSid,
wszAccountName,
&dwAccountName,
wszDomainName,
&dwDomainName,
&SidNameUse);
if(fReturn)
{
CComBSTR sbstrReturn;

if(lstrlenW(wszDomainName) > 0)
{
sbstrReturn = wszDomainName;
sbstrReturn += "\\";
sbstrReturn += wszAccountName;
}
else
{
sbstrReturn = wszAccountName;
}

*pbstrAccountName = sbstrReturn.Detach();
hr = S_OK;
}

return hr;
}

/***************************************************************************

GetSidAccountName_Everyone()

Retrieves the local account name for the "World", also known as
"Everyone", account.

pbstrAccountName - Pointer to a BSTR that receives the account name. The


caller must free this with SysFreeString when it is no longer required.

***************************************************************************/

HRESULT GetSidAccountName_Everyone(BSTR *pbstrAccountName)


{
if(!pbstrAccountName)
{
return E_INVALIDARG;
}

HRESULT hr = E_FAIL;
BOOL fReturn;
PSID psidAlloc;

// Create the SID for "Everyone".


SID_IDENTIFIER_AUTHORITY SidAuth = SECURITY_WORLD_SID_AUTHORITY;
fReturn = AllocateAndInitializeSid(
&SidAuth,
1,
SECURITY_WORLD_RID,
0, 0, 0, 0, 0, 0, 0,
&psidAlloc);
if(fReturn)
{
hr = GetSidAccountName(psidAlloc, pbstrAccountName);
LocalFree(psidAlloc);
}

return hr;
}

/***************************************************************************

GetSidAccountName_Self()

Retrieves the local account name for the "NT AUTHORITY\SELF" account.

pbstrAccountName - Pointer to a BSTR that receives the account name. The


caller must free this with SysFreeString when it is no longer required.

***************************************************************************/

HRESULT GetSidAccountName_Self(BSTR *pbstrAccountName)


{
HRESULT hr = E_FAIL;
BOOL fReturn;
PSID psidAlloc;

// Create the SID for "Everyone".


SID_IDENTIFIER_AUTHORITY SidAuth = SECURITY_NT_AUTHORITY;
fReturn = AllocateAndInitializeSid(
&SidAuth,
1,
SECURITY_PRINCIPAL_SELF_RID,
0, 0, 0, 0, 0, 0, 0,
&psidAlloc);
if(fReturn)
{
hr = GetSidAccountName(psidAlloc, pbstrAccountName);

LocalFree(psidAlloc);
}

return hr;
}

#define CHANGE_PASSWORD_GUID_W L"{AB721A53-1E2F-11D0-9819-00AA0040529B}"

/***************************************************************************

GetObjectACE()

Retrieves the IADsAccessControlEntry for the ACE that matches the


specified object type and trustee in the specified
IADsAccessControlList.
Returns a value other than S_OK if the ACE is not found.

pACL - Pointer to an IADsAccessControlList object that will be searched.


pwszObject - Pointer to a null-terminated Unicode string that contains
the object type to find.

pwszTrustee - Pointer to a null-terminated Unicode string that contains


the trustee to find.

ppACE - Pointer to an IADsAccessControlEntry pointer that receives the


ACE if successful. This receives NULL if not successful.

***************************************************************************/

HRESULT GetObjectACE(IADsAccessControlList* pACL,


LPCWSTR pwszObject,
LPCWSTR pwszTrustee,
IADsAccessControlEntry** ppACE)
{
if(NULL == pACL || NULL == pwszObject)
{
return E_INVALIDARG;
}

*ppACE = NULL;

HRESULT hr;
IUnknown *pUnk;
hr = pACL->get__NewEnum(&pUnk);
if(FAILED(hr))
{
return hr;
}

IEnumVARIANT *pEnum;

hr = pUnk->QueryInterface(IID_IEnumVARIANT, (LPVOID*)&pEnum);
if(SUCCEEDED(hr))
{
ULONG ulFetched;
BOOL fEveryone = FALSE;
BOOL fSelf = FALSE;
CComVariant svarACE;

for(hr = pEnum->Next(1, &svarACE, &ulFetched);


S_OK == hr && 1 == ulFetched;
hr = pEnum->Next(1, &svarACE, &ulFetched))
{
if(VT_DISPATCH == svarACE.vt)
{
IADsAccessControlEntry *pACE;

hr = svarACE.pdispVal-
>QueryInterface(IID_IADsAccessControlEntry, (void**)&pACE);
if(SUCCEEDED(hr))
{
CComBSTR sbstrObjectType;
hr = pACE->get_ObjectType(&sbstrObjectType);
if(SUCCEEDED(hr))
{
if(0 == lstrcmpiW(pwszObject, sbstrObjectType))
{
CComBSTR sbstrTrustee;

hr = pACE->get_Trustee(&sbstrTrustee);
if(SUCCEEDED(hr) && (0 ==
lstrcmpiW(sbstrTrustee, pwszTrustee)))
{
*ppACE = pACE;
break;
}
}
}

pACE->Release();
}
}
}

pEnum->Release();
}

return hr;
}

/***************************************************************************

UserCannotChangePassword()

Retrieves the "User Cannot Change Password" privilege using the LDAP
provider. This is determined by the presence and value of the change
password GUID ACE for the Everyone and Self trustees. The default result
of this function is that the user can change their password unless the
two ACEs specifically deny the privilege.

pwszUserDN - A null-terminated Unicode string that contains the LDAP


ADsPath of the user object to verify.

pwszUsername - A null-terminated Unicode string that contains the user


name to use for authorization. If this is NULL, the credentials of the
current user are used.

pwszPassword - A null-terminated Unicode string that contains the


password to use for authorization. This is ignored if pwszUsername is
NULL.

pfCannotChangePassword - Receives the setting for the privilege.


Receives nonzero if the user cannot change their password or zero if
the can change their password.

***************************************************************************/
HRESULT UserCannotChangePassword(LPCWSTR pwszUserDN,
LPCWSTR pwszUsername,
LPCWSTR pwszPassword,
BOOL *pfCannotChangePassword)
{
HRESULT hr;

CComBSTR sbstrEveryone;
hr = GetSidAccountName_Everyone(&sbstrEveryone);
if(FAILED(hr))
{
return hr;
}

CComBSTR sbstrSelf;
hr = GetSidAccountName_Self(&sbstrSelf);
if(FAILED(hr))
{
return hr;
}

if(NULL == pwszUserDN)
{
return E_INVALIDARG;
}

IADs *pads;
*pfCannotChangePassword = FALSE;

hr = ADsOpenObject( pwszUserDN,
pwszUsername,
pwszPassword,
ADS_SECURE_AUTHENTICATION,
IID_IADs,
(LPVOID*)&pads);

if(SUCCEEDED(hr))
{
CComVariant svar;

hr = pads->Get(CComBSTR("ntSecurityDescriptor"), &svar);
if(SUCCEEDED(hr))
{
IADsSecurityDescriptor *psd;

hr = svar.pdispVal->QueryInterface(IID_IADsSecurityDescriptor,
(LPVOID*)&psd);
if(SUCCEEDED(hr))
{
IDispatch *pDisp;

hr = psd->get_DiscretionaryAcl(&pDisp);
if(SUCCEEDED(hr))
{
IADsAccessControlList *pACL;
hr = pDisp->QueryInterface(IID_IADsAccessControlList,
(void**)&pACL);
if(SUCCEEDED(hr))
{
BOOL fEveryone = FALSE;
BOOL fSelf = FALSE;
IADsAccessControlEntry *pACEEveryone = NULL;
IADsAccessControlEntry *pACESelf = NULL;

// Get the ACE for everyone.


hr = GetObjectACE(pACL, CHANGE_PASSWORD_GUID_W,
sbstrEveryone, &pACEEveryone);

// Get the ACE for self.


hr = GetObjectACE(pACL, CHANGE_PASSWORD_GUID_W,
sbstrSelf, &pACESelf);

if(pACEEveryone && pACESelf)


{
LONG lAceType;

hr = pACEEveryone->get_AceType(&lAceType);
if(SUCCEEDED(hr) &&
(ADS_ACETYPE_ACCESS_DENIED_OBJECT == lAceType))
{
fEveryone = TRUE;
}

hr = pACESelf->get_AceType(&lAceType);
if(SUCCEEDED(hr) &&
(ADS_ACETYPE_ACCESS_DENIED_OBJECT == lAceType))
{
fSelf = TRUE;
}
}

if(fEveryone && fSelf)


{
*pfCannotChangePassword = TRUE;
}
else
{
*pfCannotChangePassword = FALSE;
}
}

pDisp->Release();
}

psd->Release();
}
}

pads->Release();
}

return hr;
}

O exemplo de código a seguir mostra como determinar a Permissão De Usuário Não


Pode Alterar Senha usando o provedor LDAP.

7 Observação

O exemplo de código a seguir só funciona para domínios em que o idioma


primário é inglês, porque as cadeias de caracteres "Todos" e "NT AUTHORITY\SELF"
são localizadas com base no idioma do primeiro controlador de domínio no
domínio. Não há nenhuma maneira no Visual Basic de obter os nomes de conta de
uma entidade de segurança conhecida sem chamar a função LookupAccountSid .
Se estiver usando o Visual Basic, é sugerido que você use o provedor WinNT para
determinar a Permissão De Usuário Não Pode Alterar Senha, conforme mostrado
em Leitura Usuário Não Pode Alterar Senha (Provedor WinNT).

VB

Const CHANGE_PASSWORD_GUID = "{AB721A53-1E2F-11D0-9819-00AA0040529B}"


Const ADS_ACETYPE_ACCESS_DENIED_OBJECT = &H6

Function UserCannotChangePassword(strUserDN As String, strUsername As


String, strPassword As String) As Boolean
UserCannotChangePassword = False

Dim oUser As IADs


Dim oSecDesc As IADsSecurityDescriptor
Dim oACL As IADsAccessControlList
Dim oACE As IADsAccessControlEntry
Dim fEveryone As Boolean
Dim fSelf As Boolean

fEveryone = False
fSelf = False

If "" <> strUsername Then


Dim dso As IADsOpenDSObject

' Bind to the group with the specified user name and password.
Set dso = GetObject("LDAP:")
Set oUser = dso.OpenDSObject(strUserDN, strUsername, strPassword, 1)
Else
' Bind to the group with the current credentials.
Set oUser = GetObject(strUserDN)
End If

Set oSecDesc = oUser.Get("ntSecurityDescriptor")


Set oACL = oSecDesc.DiscretionaryAcl

For Each oACE In oACL


If UCase(oACE.ObjectType) = UCase(CHANGE_PASSWORD_GUID) Then
If oACE.Trustee = "Everyone" And oACE.AceType =
ADS_ACETYPE_ACCESS_DENIED_OBJECT Then
fEveryone = True
End If

If oACE.Trustee = "NT AUTHORITY\SELF" And oACE.AceType =


ADS_ACETYPE_ACCESS_DENIED_OBJECT Then
fSelf = True
End If
End If
Next

If fSelf And fEveryone Then


UserCannotChangePassword = True
Else
UserCannotChangePassword = False
End If
End Function

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Modificar o usuário não pode alterar a
senha (provedor LDAP)
Artigo • 12/06/2023

A capacidade de um usuário alterar sua própria senha é uma permissão que pode ser
concedida ou negada. Para negar essa permissão, defina duas ACEs na DACL (lista de
controle de acesso discricionário) do descritor de segurança do objeto de usuário com o
tipo ace ADS_ACETYPE_ACCESS_DENIED_OBJECT . Uma ACE nega a permissão ao
usuário e outra ACE nega a permissão ao grupo Todos. Ambas as ACEs são ACEs de
negação específicas do objeto que especificam o GUID da permissão estendida para
alterar senhas. Para conceder essa permissão, defina os mesmos ACEs com o tipo de ace
ADS_ACETYPE_ACCESS_ALLOWED_OBJECT .

O procedimento a seguir descreve como modificar ou adicionar ACEs para essa


permissão.

Para modificar ou adicionar as ACEs para essa permissão

1. Associar ao objeto de usuário.

2. Obtenha o objeto IADsSecurityDescriptor da propriedade ntSecurityDescriptor


do objeto user.

3. Obtenha uma interface IADsAccessControlList para o descritor de segurança da


propriedade IADsSecurityDescriptor.DiscretionaryAcl .

4. Enumerar as ACEs para o objeto e pesquisar os ACEs que têm o GUID de alteração
de senha ({AB721A53-1E2F-11D0-9819-00AA0040529B}) para a propriedade
IADsAccessControlEntry.ObjectType e "Everyone" ou "NT AUTHORITY\SELF" para
a propriedade IADsAccessControlEntry.Trustee .

7 Observação

As cadeias de caracteres "Todos" e "NT AUTHORITY\SELF" são localizadas com


base no idioma do primeiro controlador de domínio no domínio. Por isso, as
cadeias de caracteres não devem ser usadas diretamente. Os nomes de conta
devem ser obtidos em tempo de execução chamando a função
LookupAccountSid com o SID para entidades de segurança conhecidas
"Todos" ("S-1-1-0") e "NT AUTHORITY\SELF" ("S-1-5-10"). As funções de
exemplo GetSidAccountName, GetSidAccountName_Everyone e
GetSidAccountName_Self C++ mostradas em Ler Usuário Não Pode Alterar
Senha (Provedor LDAP) demonstram como fazer isso.

5. Modifique a propriedade IADsAccessControlEntry.AceType dos ACEs que foram


encontrados para ADS_ACETYPE_ACCESS_DENIED_OBJECT se o usuário não puder
alterar sua senha ou ADS_ACETYPE_ACCESS_ALLOWED_OBJECT se o usuário
puder alterar sua senha.

6. Se a ACE "Todos" não for encontrada, crie um novo objeto


IADsAccessControlEntry que contenha os valores de propriedade mostrados na
tabela abaixo e adicione a nova entrada à ACL com o método
IADsAccessControlList.AddAce .

7. Se o ACE "NT AUTHORITY\SELF" não for encontrado, crie um novo objeto


IADsAccessControlEntry com os mesmos valores de propriedade mostrados na
tabela abaixo, exceto que a propriedade Trustee contém o nome da conta para
SID "S-1-5-10" ("NT AUTHORITY\SELF"). Adicione a entrada à ACL com o método
IADsAccessControlList.AddAce .

8. Para atualizar a propriedade ntSecurityDescriptor do objeto , chame o método


IADs.Put com o mesmo IADsSecurityDescriptor obtido na Etapa 2.

9. Confirme as alterações locais no servidor com o método IADs.SetInfo .

10. Se um dos ACEs tiver sido criado, você deverá reordenar a ACL para que os ACEs
estejam na ordem correta. Para fazer isso, chame a função GetNamedSecurityInfo
com o LDAP ADsPath do objeto e, em seguida, a função SetNamedSecurityInfo
com a mesma DACL. Essa reordenação ocorrerá automaticamente quando os ACEs
forem adicionados.

A tabela a seguir lista os valores da propriedade do objeto IADsAccessControlEntry .

Propriedade Valor
IADsAccessControlEntry

AccessMask ADS_RIGHT_DS_CONTROL_ACCESS

Acetype ADS_ACETYPE_ACCESS_DENIED_OBJECT se o usuário não puder


alterar sua senha ou ADS_ACETYPE_ACCESS_ALLOWED_OBJECT se o
usuário puder alterar sua senha.

AceFlags 0
Propriedade Valor
IADsAccessControlEntry

Sinalizadores ADS_FLAG_OBJECT_TYPE_PRESENT

Objecttype "{AB721A53-1E2F-11D0-9819-00AA0040529B}", que é o GUID de


alteração de senha no formulário de cadeia de caracteres.

Inheritedobjecttype Não usado

Administrador Nome da conta para SID "S-1-1-0" (Todos).

Código de exemplo
O exemplo de código a seguir mostra como obter uma interface para alterar uma DACL.
A interface IADsObjectOptions pode ser usada definindo a opção
ADS_SECURITY_INFO_DACL .

7 Observação

Para usar o código documentado neste exemplo, você precisará ser um


Administrador. Se você não for um Administrador, precisará adicionar mais código
que usará uma interface que permitirá que um usuário altere a maneira como o
cache do lado do cliente é liberado de volta para o Serviço Domínio do Active
Directory.

C++

//
// Obtain an IADsObjectOptions interface from the object whose
// DACL you wish to modify.
//
long CanReadSetDACL = ADS_SECURITY_INFO_DACL;

CComPtr<IADsObjectOptions> spObjOps;

hr = pads->QueryInterface(IID_IADsObjectOptions, (void**)&spObjOps);

if(SUCCEEDED(hr))

//
// Set the option mask you want to change. In this case
// we want to change the objects security information, so we'll
// use the ADS_OPTION_SECURITY_MASK. Since we want to modify the
// DACL, we'll set the variant to ADS_SEDCURITY_INFO_DACL flag.
//

CComVariant svar;
svar = CanReadSetDACL;
hr = spObjOps->SetOption(ADS_OPTION_SECURITY_MASK, svar);

}
//
// The smart pointer declared for pObjOptions can be released
// or it will be destroyed and released once the pointer goes
// out of scope.
//

O exemplo de código a seguir mostra como modificar a permissão User Cannot Change
Password usando o provedor LDAP. Este exemplo de código usa a função de utilitário
GetObjectACE definida acima.

Este exemplo usa as funções de exemplo GetSidAccountName_Everyone e


GetSidAccountName_Self C++ mostradas em Ler Usuário Não Pode Alterar Senha
(Provedor LDAP).

C++

#include <aclapi.h>

#define CHANGE_PASSWORD_GUID_W L"{AB721A53-1E2F-11D0-9819-00AA0040529B}"

/***************************************************************************

CreateACE()

Creates an ACE and returns the IDispatch pointer for the ACE. This
pointer can be passed directly to IADsAccessControlList::AddAce.

bstrTrustee - Contains the Trustee for the ACE.

bstrObjectType - Contains the ObjectType for the ACE.

lAccessMask - Contains the AccessMask for the ACE.

lACEType - Contains the ACEType for the ACE.

lACEFlags - Contains the ACEFlags for the ACE.

lFlags - Contains the Flags for the ACE.

***************************************************************************/
IDispatch* CreateACE(BSTR bstrTrustee,
BSTR bstrObjectType,
long lAccessMask,
long lACEType,
long lACEFlags,
long lFlags)
{
HRESULT hr;
IDispatch *pDisp = NULL;
IADsAccessControlEntry *pACE = NULL;

hr = CoCreateInstance(CLSID_AccessControlEntry,
NULL,
CLSCTX_INPROC_SERVER,
IID_IADsAccessControlEntry,
(void**)&pACE);
if(SUCCEEDED(hr))
{
hr = pACE->put_Trustee(bstrTrustee);
hr = pACE->put_ObjectType(bstrObjectType);
hr = pACE->put_AccessMask(lAccessMask);
hr = pACE->put_AceType(lACEType);
hr = pACE->put_AceFlags(lACEFlags);
hr = pACE->put_Flags(lFlags);

hr = pACE->QueryInterface(IID_IDispatch, (LPVOID*)&pDisp);

pACE->Release();
}

return pDisp;
}

/***************************************************************************

ReorderACEs()

Causes the ACEs of an object DACL to be reordered properly. The ACEs are
automatically put in the proper order when they are added to the DACL.
On older systems however, this does not occur automatically, so this
function is necessary so the deny ACEs are ordered in the list before
the allow ACEs.

pwszDN - A null-terminated Unicode string that contains the LDAP


ADsPath of the DS object to reorder the DACL for.

***************************************************************************/

HRESULT ReorderACEs(LPCWSTR pwszDN)


{
HRESULT hr = E_FAIL;
DWORD dwResult;
ACL *pdacl;
PSECURITY_DESCRIPTOR psd;
dwResult = GetNamedSecurityInfoW( (LPWSTR)pwszDN,
SE_DS_OBJECT_ALL,
DACL_SECURITY_INFORMATION,
NULL,
NULL,
&pdacl,
NULL,
&psd);

if(ERROR_SUCCESS == dwResult)
{
dwResult = SetNamedSecurityInfoW( (LPWSTR)pwszDN,
SE_DS_OBJECT_ALL,
DACL_SECURITY_INFORMATION,
NULL,
NULL,
pdacl,
NULL);

LocalFree(psd);

if(ERROR_SUCCESS == dwResult)
{
hr = S_OK;
}
}

return hr;
}

/***************************************************************************

SetUserCannotChangePassword()

Sets the "User Cannot Change Password" permission using the LDAP
provider
to the specified setting. To do this, find the existing
ACEs and modify the AceType. If the ACE is not found, a new one of the
proper type is created and added. The ACEs should always be present, but
it is possible that the default DACL excludes them, so this situation
will be handled correctly.

pwszUserDN - A null-terminated Unicode string that contains the LDAP


ADsPath of the user object to modify.

pwszUsername - A null-terminated Unicode string that contains the user


name to use for authorization. If this is NULL, the credentials of the
current user are used.

pwszPassword - A null-terminated Unicode string that contains the


password to use for authorization. This is ignored if pwszUsername is
NULL.

fCannotChangePassword - Contains the new setting for the privilege.


Contains nonzero if the user cannot change their password or zero if
the can change their password.

***************************************************************************/

HRESULT SetUserCannotChangePassword(LPCWSTR pwszUserDN,


LPCWSTR pwszUsername,
LPCWSTR pwszPassword,
BOOL fCannotChangePassword)
{
HRESULT hr;

CComBSTR sbstrEveryone;
hr = GetSidAccountName_Everyone(&sbstrEveryone);
if(FAILED(hr))
{
return hr;
}

CComBSTR sbstrSelf;
hr = GetSidAccountName_Self(&sbstrSelf);
if(FAILED(hr))
{
return hr;
}

if(NULL == pwszUserDN)
{
return E_INVALIDARG;
}

IADs *pads;

hr = ADsOpenObject( pwszUserDN,
pwszUsername,
pwszPassword,
ADS_SECURE_AUTHENTICATION,
IID_IADs,
(LPVOID*)&pads);

if(SUCCEEDED(hr))
{
CComBSTR sbstrSecDesc = "ntSecurityDescriptor";
CComVariant svar;

hr = pads->Get(sbstrSecDesc, &svar);
if(SUCCEEDED(hr))
{
IADsSecurityDescriptor *psd;

hr = svar.pdispVal->QueryInterface(IID_IADsSecurityDescriptor,
(LPVOID*)&psd);
if(SUCCEEDED(hr))
{
IDispatch *pDisp;
hr = psd->get_DiscretionaryAcl(&pDisp);
if(SUCCEEDED(hr))
{
IADsAccessControlList *pACL;

hr = pDisp->QueryInterface(IID_IADsAccessControlList,
(void**)&pACL);
if(SUCCEEDED(hr))
{
BOOL fMustReorder = FALSE;
/*
Get the existing ACE for the change password
permission
for Everyone. If it exists, just modify the existing
ACE. If it does not exist, create a new one and add
it
to the ACL.
*/
IADsAccessControlEntry *pACEEveryone = NULL;
hr = GetObjectACE(pACL, CHANGE_PASSWORD_GUID_W,
sbstrEveryone, &pACEEveryone);
if(pACEEveryone)
{
hr = pACEEveryone-
>put_AceType(fCannotChangePassword ?
ADS_ACETYPE_ACCESS_DENIED_OBJECT :
ADS_ACETYPE_ACCESS_ALLOWED_OBJECT);

pACEEveryone->Release();
}
else
{
IDispatch *pDispEveryone = NULL;

pDispEveryone = CreateACE(sbstrEveryone,
CComBSTR(CHANGE_PASSWORD_GUID_W),
ADS_RIGHT_DS_CONTROL_ACCESS,
fCannotChangePassword ?
ADS_ACETYPE_ACCESS_DENIED_OBJECT :
ADS_ACETYPE_ACCESS_ALLOWED_OBJECT,
0,
ADS_FLAG_OBJECT_TYPE_PRESENT);

if(pDispEveryone)
{
//add the new ACE for everyone
hr = pACL->AddAce(pDispEveryone);

pDispEveryone->Release();

fMustReorder = TRUE;
}
}
/*
Get the existing ACE for the change password
permission
for Self. If it exists, just modify the existing
ACE. If it does not exist, create a new one and add
it
to the ACL.
*/
IADsAccessControlEntry *pACESelf = NULL;
hr = GetObjectACE(pACL, CHANGE_PASSWORD_GUID_W,
sbstrSelf, &pACESelf);
if(pACESelf)
{
hr = pACESelf->put_AceType(fCannotChangePassword
?
ADS_ACETYPE_ACCESS_DENIED_OBJECT :
ADS_ACETYPE_ACCESS_ALLOWED_OBJECT);

pACESelf->Release();
}
else
{
IDispatch *pDispSelf = NULL;

pDispSelf = CreateACE(sbstrSelf,
CComBSTR(CHANGE_PASSWORD_GUID_W),
ADS_RIGHT_DS_CONTROL_ACCESS,
fCannotChangePassword ?
ADS_ACETYPE_ACCESS_DENIED_OBJECT :
ADS_ACETYPE_ACCESS_ALLOWED_OBJECT,
0,
ADS_FLAG_OBJECT_TYPE_PRESENT);

if(pDispSelf)
{
//add the new ACE for self
hr = pACL->AddAce(pDispSelf);

pDispSelf->Release();

fMustReorder = TRUE;
}
}

//update the security descriptor property


hr = pads->Put(sbstrSecDesc, svar);

//commit the changes


hr = pads->SetInfo();

if(fMustReorder)
{
ReorderACEs(pwszUserDN);
}
pACL->Release();
}

pDisp->Release();
}

psd->Release();
}
}
}

return hr;
}

O exemplo de código a seguir mostra como modificar a permissão User Cannot Change
Password usando o provedor LDAP.

7 Observação

O exemplo a seguir só funcionará em domínios em que o idioma primário é inglês


porque as cadeias de caracteres "Todos" e "NT AUTHORITY\SELF" são localizadas
com base no idioma do primeiro controlador de domínio no domínio. Não há
como o Visual Basic obter os nomes de conta de uma entidade de segurança
conhecida sem chamar a função LookupAccountSid . Se estiver usando o Visual
Basic, é recomendável que você use o provedor WinNT para modificar a Permissão
de Usuário Não Pode Alterar Senha, conforme mostrado em Modificando o
usuário não pode alterar senha (Provedor WinNT).

VB

'***************************************************************************
***
'
' SetUserCannotChangePassword
'
' Sets the "User Cannot Change Password" permission using the LDAP
provider
' to the specified setting. This is accomplished by finding the existing
' ACEs and modifying the AceType. The ACEs should always be present, but
' it is possible that the default DACL excludes them. This function will
not
' work correctly if both ACEs are not present.
'
' strUserDN - A string that contains the LDAP ADsPath of the user object
to
' modify.
'
' strUsername - A string that contains the user name to use for
' authorization. If this is an empty string, the credentials of the
current
' user are used.
'
' strPassword - A string that contains the password to use for
authorization.
' This is ignored if strUsername is empty.
'
' fCannotChangePassword - Contains the new setting for the privilege.
' Contains True if the user cannot change their password or False if
' the can change their password.
'
'***************************************************************************
***
Sub SetUserCannotChangePassword(strUserDN As String, strUsername As String,
strPassword As String, fUserCannotChangePassword As Boolean)
Dim oUser As IADs
Dim oSecDesc As IADsSecurityDescriptor
Dim oACL As IADsAccessControlList
Dim oACE As IADsAccessControlEntry

fEveryone = False
fSelf = False

If "" <> strUsername Then


Dim dso As IADsOpenDSObject

' Bind to the group with the specified user name and password.
Set dso = GetObject("LDAP:")
Set oUser = dso.OpenDSObject(strUserDN, strUsername, strPassword, 1)
Else
' Bind to the group with the current credentials.
Set oUser = GetObject(strUserDN)
End If

Set oSecDesc = oUser.Get("ntSecurityDescriptor")


Set oACL = oSecDesc.DiscretionaryAcl

' Modify the existing entries.


For Each oACE In oACL
If UCase(oACE.ObjectType) = UCase(CHANGE_PASSWORD_GUID) Then
If oACE.Trustee = "Everyone" Then
' Modify the ace type of the entry.
If fUserCannotChangePassword Then
oACE.AceType = ADS_ACETYPE_ACCESS_DENIED_OBJECT
Else
oACE.AceType = ADS_ACETYPE_ACCESS_ALLOWED_OBJECT
End If
End If

If oACE.Trustee = "NT AUTHORITY\SELF" Then


' Modify the ace type of the entry.
If fUserCannotChangePassword Then
oACE.AceType = ADS_ACETYPE_ACCESS_DENIED_OBJECT
Else
oACE.AceType = ADS_ACETYPE_ACCESS_ALLOWED_OBJECT
End If
End If
End If
Next

' Update the ntSecurityDescriptor property.


oUser.Put "ntSecurityDescriptor", oSecDesc

' Commit the changes to the server.


oUser.SetInfo
End Sub

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


O usuário deve alterar a senha no
próximo logon (provedor LDAP)
Artigo • 13/06/2023

Para forçar um usuário a alterar sua senha no próximo logon, defina o atributo
pwdLastSet como zero (0). Para remover esse requisito, defina o atributo pwdLastSet
como -1. O atributo pwdLastSet não pode ser definido como qualquer outro valor,
exceto pelo sistema.

O exemplo de código a seguir mostra como definir a opção "O usuário deve alterar a
senha no próximo logon".

VB

Dim usr as IADs

Set usr = GetObject("LDAP://CN=Jeff Smith,OU=Sales,DC=Fabrikam,DC=Com")


usr.Put "pwdLastSet", CLng(0)
usr.SetInfo

O exemplo de código a seguir mostra como definir a opção "O usuário deve alterar a
senha no próximo logon".

C++

/***************************************************************************

SetUserMustChangePassword()

***************************************************************************/

HRESULT SetUserMustChangePassword(LPCWSTR pwszUserADsPath,


LPCWSTR pwszUsername,
LPCWSTR pwszPassword)
{
IADs *pUser;
HRESULT hr;

hr = ADsOpenObject(pwszUserADsPath,
pwszUsername,
pwszPassword,
ADS_SECURE_AUTHENTICATION,
IID_IADs,
(void**)&pUser);

if(SUCCEEDED(hr))
{
VARIANT var;
VariantInit(&var);
V_I4(&var) = 0;
V_VT(&var) = VT_I4;
hr = pUser->Put(CComBSTR("pwdLastSet"), var);
hr = pUser->SetInfo();

VariantClear(&var);
pUser->Release();
}

return hr;
}

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Provedor ADSI WinNT
Artigo • 03/06/2023

O provedor MICROSOFT ADSI implementa um conjunto de objetos ADSI para dar


suporte a várias interfaces ADSI. O nome do namespace para o provedor de Windows é
"WinNT" e esse provedor é comumente chamado de provedor WinNT. Para acessar o
provedor WinNT, associe qualquer um dos objetos ADSI do WinNT usando o WinNT
AdsPath.

O provedor WinNT está incluído no componente do sistema ADSI para Windows e


Windows Server.

7 Observação

O provedor WinNT padrão não pode ser considerado completamente thread-safe.


Os gravadores de aplicativos multithreaded devem lidar com o multithreading para
coordenar corretamente qualquer acesso entre threads por meio do uso adequado
de objetos de sincronização, como semáforos, mutexes, seções críticas e assim por
diante.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


WinNT ADsPath
Artigo • 13/06/2023

A cadeia de caracteres ADsPath para o provedor ADSI WinNT pode ser uma das
seguintes formas:

C++

WinNT:
WinNT://<domain name>
WinNT://<domain name>/<server>
WinNT://<domain name>/<path>
WinNT://<domain name>/<object name>
WinNT://<domain name>/<object name>,<object class>
WinNT://<server>
WinNT://<server>/<object name>
WinNT://<server>/<object name>,<object class>

O nome de domínio pode ser um nome NETBIOS ou um nome DNS.

O servidor é o nome de um servidor específico dentro do domínio.

O caminho é o caminho de no objeto , como "printserver1/printer2".

O nome do objeto é o nome de um objeto específico.

A classe de objeto é o nome da classe do objeto nomeado. Um exemplo desse uso seria
"WinNT://MyServer/JeffSmith,user". Especificar um nome de classe pode melhorar o
desempenho da operação de associação.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Objetos ADSI do WinNT
Artigo • 02/09/2023

O provedor ADSI WinNT implementa os seguintes objetos COM para dar suporte a
recursos e serviços de várias interfaces ADSI.

Objeto ADSI Descrição Interfaces com suporte

Classe Um objeto ADSI que Iads


representa uma IADsClass
definição de classe.

Computador Um objeto ADSI que Iads


representa um IADsComputer
computador. IADsComputerOperations
IADsContainer
IADsPropertyList

Domínio Um objeto ADSI que Iads


representa um domínio IADsDomain
pela rede. IADsContainer
IADsPropertyList

FileService Um objeto ADSI que Iads


representa um serviço IADsFileService
de arquivo. IADsFileServiceOperations
IADsContainer
IADsPropertyList

Fileshare Um objeto ADSI que Iads


representa um IADsFileShare
compartilhamento de IADsPropertyList
arquivos.

FPNWFileService Um objeto ADSI que Iads


representa um serviço IADsFileService
de arquivo. IADsFileServiceOperations
IADsContainer

FPNWFileShare Um objeto ADSI que Iads


representa um IADsFileShare
compartilhamento de IADsPropertyList
arquivos.

FPNWResource Um objeto ADSI que Iads


representa um recurso. IADsResource
IADsPropertyList
Objeto ADSI Descrição Interfaces com suporte

FPNWResourcesCollection Um objeto ADSI que IADsCollection


representa uma coleção
de recursos.

FPNWSession Um objeto ADSI que Iads


representa uma sessão. IADsSession
IADsPropertyList

FPNWSessionsCollection Um objeto ADSI que IADsCollection


representa uma coleção
de sessões.

Grupo Um objeto ADSI que Iads


representa um grupo. IADsGroup
IADsPropertyList
Nota: GetInfo não pode ser usado para
grupos que contêm membros que são
entidades de segurança wellKnown no
escopo do WinNT.

Groupcollection Um objeto ADSI que Iads


representa uma coleção IADsMembers
de grupos.

LocalGroup Um objeto ADSI que Iads


representa um grupo IADsGroup
local. IADsPropertyList

LocalgroupCollection Um objeto ADSI que Iads


representa uma coleção IADsMembers
de grupos locais.

Namespace Um objeto ADSI que Iads


representa o namespace IADsContainer
WinNT. IADsOpenDSObject

PrintJob Um objeto ADSI que Iads


representa um trabalho IADsPrintJob
de impressão. IADsPrintJobOperations
IADsPropertyList

PrintJobsCollection Um objeto ADSI que IADsCollection


representa uma coleção
de trabalhos de
impressão.

PrintQueue Um objeto ADSI que Iads


representa uma fila de IADsPrintQueue
impressão. IADsPrintQueueOperations
Objeto ADSI Descrição Interfaces com suporte

IADsPropertyList

Propriedade Um objeto ADSI que Iads


representa uma IADsProperty
definição de atributo.

Recurso Um objeto ADSI que Iads


representa um recurso. IADsResource
IADsPropertyList

ResourcesCollection Um objeto ADSI que IADsCollection


representa uma coleção
de recursos.

Esquema Um objeto ADSI que Iads


representa o contêiner IADsContainer
de esquema.

Serviço Um objeto ADSI que Iads


representa um serviço. IADsService
IADsServiceOperations
IADsPropertyList

Sessão Um objeto ADSI que Iads


representa uma sessão. IADsSession
IADsPropertyList

SessionsCollection Um objeto ADSI que IADsCollection


representa uma coleção
de sessões.

Sintaxe Um objeto ADSI que Iads


representa a sintaxe de IADsSyntax
um atributo.

Usuário Um objeto ADSI que Iads


representa uma conta de Iadsuser
usuário. IADsPropertyList

UserGroupCollection Um objeto ADSI que IADsMembers


representa uma coleção
de grupos de usuários.

Comentários
Esta página foi útil?  Yes  No
Obter ajuda no Microsoft Q&A
Esquema WinNT
Artigo • 03/06/2023

O esquema WinNT define o conjunto de objetos ADSI e sua hierarquia de classe para
uma rede Windows NT 4.0. Os objetos ADSI do WinNT incluem Usuário, Computador,
Domínio, Grupo, Recurso, Sessão, Serviço e outros. A seção Hierarquia de Classe de
Objeto WinNT a seguir discute as relações hierárquicas entre esses objetos.

Cada objeto implementa um conjunto de interfaces ADSI. No entanto, de uma interface


implementada, nem todas as propriedades e métodos têm suporte. As Propriedades
Obrigatórias e Opcionais do Esquema WinNT listam as propriedades compatíveis com
as classes de objeto WinNT.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Hierarquia de classe de objeto WinNT
Artigo • 13/06/2023

A hierarquia da classe de objeto WinNT começa a partir do objeto Namespace.

Classe Object Descrição

Namespace Contêiner de objeto de nível superior.

Domínio O domínio Windows NT.

Usuário Conta de usuário.

Grupo Conta de grupo para gerenciar direitos de acesso.

UserGroupCollection Um conjunto de grupos de usuários implementando IADsMembers.

Groupcollection Um conjunto de outros grupos que implementam IADsMembers.

Computador Windows NT servidor ou estação de trabalho 4.0.

PrintJob Imprimir trabalho na fila de impressão.

PrintJobsCollection Um conjunto de trabalhos de impressão.

PrintQueue Fila de impressão em um spooler de impressora.

Serviço Aplicativo em execução como um serviço.

FileService Serviços que acessam o sistema de arquivos.

FileShare Ponto de compartilhamento de arquivos.

Recurso Um recurso no serviço.

Session Uma conexão de serviço de arquivo ativo.

Usuário Conta de usuário local.

Grupo Grupo local.

Usercollection Coleção de usuários locais.

Groupcollection Coleção de grupos locais.

Esquema Contêiner de esquema WinNT.

Classe Definição de classe de esquema.

Propriedade Definição de atributo de esquema.


Classe Object Descrição

Sintaxe Sintaxe de uma propriedade.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Propriedades obrigatórias e opcionais
do esquema WinNT
Artigo • 13/06/2023

A tabela a seguir lista as propriedades de objeto com suporte (ou seja, os métodos de
propriedade de interface ADSI relacionados) no provedor WinNT. Uma propriedade
pode ser opcional ou obrigatória.

Para obter detalhes sobre as propriedades com suporte, consulte as propriedades das
interfaces listadas em Objetos ADSI do WinNT.

Classe Object Propriedades com suporte Necessário?

Computador DivisionOwner Opcional Opcional


OperatingSystem Opcional
OperatingSystemVersion Opcional
Processador Opcional
ProcessorCount Opcional

Domínio MinPasswordLengthMinPasswordAge Opcional Opcional


MaxPasswordAge Opcional
MaxBadPasswordsAllowed Opcional
PasswordHistoryLength Opcional
AutoUnlockInterval Opcional
LockoutObservationInterval Opcional

FileService HostComputerDisplayName Opcional Opcional


Versão Opcional
Servicetype Opcional
StartType Opcional
Caminho Opcional
ErrorControl Opcional
LoadOrderGroup Opcional
Descrição Opcional
MaxUserCount Opcional
ServiceAccountName Opcional
Dependências

FileShare CurrentUserCountDescription Opcional Opcional


HostComputer Opcional
Caminho Obrigatório
MaxUserCount Obrigatório
Classe Object Propriedades com suporte Necessário?

FPNWFileService HostComputerDisplayName Opcional Opcional


Versão Opcional
Servicetype Opcional
StartType Opcional
Caminho Opcional
ErrorControl Opcional
LoadOrderGroup Opcional
ServiceAccountName Opcional
Dependências Opcional
Descrição
MaxUserCount

FPNWFileShare CurrentUserCountHostComputer Opcional Opcional


Caminho Obrigatório
MaxUserCount Obrigatório

FPNWResource UserPath Opcional Opcional


LockCount Opcional

FPNWSession UserComputer Opcional Opcional


ConnectTime Opcional

Grupo DescriptionobjectSid Opcional Opcional

Namespace IADs (todos os métodos e propriedades.)

PrintJob HostPrintQueueUser Opcional Opcional


TimeSubmitted Opcional
Totalpages Opcional
Tamanho Opcional
Descrição Opcional
Prioridade Opcional
StartTime Opcional
UntilTime Opcional
Notificar Opcional
TimeElapsed Opcional
PagesPrinted Opcional
Posição Opcional
Ação
Objectguid
Classe Object Propriedades com suporte Necessário?

PrintQueue PrinterPathPrinterName Obrigatório


Modelo Obrigatório
Datatype Obrigatório
Printprocessor Obrigatório
PrintDevices Obrigatório
Descrição Opcional
HostComputer Opcional
Localidade Opcional
StartTime Opcional
UntilTime Opcional
DefaultJobPriority Opcional
JobCount Opcional
Prioridade Opcional
Atributos Opcional
BannerPage Opcional
ObjectGuid Opcional
Ação Opcional

Recurso UserPath Opcional Opcional


LockCount Opcional

Serviço HostComputerLoadOrderGroup Opcional Opcional


ServiceAccountName Opcional
Dependências Opcional
StartType Obrigatório
Servicetype Obrigatório
DisplayName Obrigatório
Caminho Obrigatório
ErrorControl Obrigatório

Sessão ComputerConnectTime Opcional Opcional


IdleTime Opcional
Usuário Opcional
Classe Object Propriedades com suporte Necessário?

Usuário AccountExpirationDateAutoUnlockInterval Opcional Opcional


BadPasswordAttempts Opcional
Descrição Opcional
FullName Opcional
HomeDirectory Opcional
UserFlags Opcional
LockoutObservationInterval Opcional
LoginHours Opcional
LastLogin Opcional
LastLogoff Opcional
LoginScript Opcional
LoginWorkstations Opcional
MinPasswordAge Opcional
MinPasswordLength Opcional
MaxBadPasswordsAllowed Opcional
MaxLogins Opcional
MaxPasswordAge Opcional
MaxStorage Opcional
Objectsid Opcional
Parâmetros Opcional
PasswordAge Opcional
PasswordExpirationDate Opcional
PasswordExpired Opcional
PasswordHistoryLength Opcional
PrimaryGroupID Opcional
Perfil Opcional
Opcional

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Objeto de usuário WinNT
Artigo • 13/06/2023

O objeto Usuário WinNT representa uma conta de usuário em um domínio Windows NT


4.0. O objeto exibe recursos especiais. Em uma instância, ele não dá suporte a todos os
métodos de propriedade da interface IADsUser . Em uma segunda instância, ele dá
suporte a algumas propriedades personalizadas que só podem ser acessadas com o
método IADs.Get ou IADs.Put .

Para obter mais informações sobre objetos de usuário WinNT, consulte:

Propriedades de IADsUser sem suporte


Propriedades de usuário personalizadas do WinNT
Exemplos de gerenciamento de conta de usuário do WinNT

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Propriedades de IADsUser sem suporte
Artigo • 13/06/2023

A interface IADsUser implementada pelo provedor WINNT ADSI dá suporte a todas as


propriedades IADsUser , exceto as seguintes. Para obter e/ou modificar essas
propriedades, use o provedor LDAP.

BadLoginAddress
department
Divisão
Emailaddress
Employeeid
FaxNumber
Firstname
GraceLoginsAllowed
GraceLoginsRemaining
Homepage
Idiomas
LastFailedLogin
Lastname
Gerente
NamePrefix
NameSuffix
OfficeLocations
OtherName
PasswordLastChanged
Imagem
PostalAddresses
CepCódigos
RequireUniquePassword
SeeAlso
TelephoneHome
TelephoneMobile
Telephonenumber
TelephonePager
Título
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Propriedades de usuário personalizadas
do WinNT
Artigo • 12/06/2023

O provedor WinNT disponibiliza as seguintes propriedades personalizadas para a classe


User. Eles podem ser acessados por meio dos métodos IADs.Get e IADs.Put . Para obter
mais informações, consulte a estrutura USER_INFO_3 .

Propriedade Tipo Descrição

HomeDirDrive String Home Directory Drive do usuário. Esse é um ponteiro para uma
cadeia de caracteres Unicode que especifica o caminho do
diretório base. A cadeia de caracteres pode ser nula. Veja o
exemplo neste tópico.

Objectsid Cadeia de SID do objeto do usuário. Para obter um exemplo de como


caracteres recuperar o SID do objeto usando o provedor WinNT, consulte
de octeto SID de objeto (Provedor WinNT)

Parâmetros String Parâmetros do usuário. Aponta para uma cadeia de caracteres


Unicode que é reservada para uso por aplicativos. Essa cadeia de
caracteres pode ser uma cadeia de caracteres nula ou pode ter
qualquer número de caracteres antes do caractere nulo de
terminação. Os produtos da Microsoft usam esse membro para
armazenar dados de configuração do usuário. Essa propriedade
só pode ser modificada por um aplicativo durante a instalação.

PasswordAge Hora Duração do tempo da senha em uso. Essa propriedade indica o


número de segundos decorridos desde a última alteração da
senha.

PasswordExpired Inteiro Informa quando a senha expirou. Quando você usar Get, ele
retornará zero se a senha não tiver expirado ou diferente de zero
se tiver expirado. Veja o exemplo neste tópico.

PrimaryGroupID Inteiro ID de grupo principal do usuário, por exemplo, ID do grupo de


usuários de domínio. Veja o exemplo neste tópico.

UserFlags Inteiro Sinalizador de usuário definido em ADS_USER_FLAG_ENUM. Para


obter um exemplo de como usar UserFlags, consulte Password
Never Expires (Provedor WinNT)

Este exemplo mostra como definir o Diretório home drive de um usuário.


VB

Dim usr As Object

Set usr = GetObject("WinNT://Fabrikam/jsmith,user")


usr.HomeDirectory = "UserHomeDirHere"
usr.HomeDirDrive = "HomeDirDriveHere"
usr.SetInfo

Este exemplo mostra como usar PasswordExpired para forçar um usuário a alterar a
senha no próximo logon.

VB

Dim usr As Object

Set usr = GetObject("WinNT://Fabrikam/jsmith,user")


usr.Put "PasswordExpired", CLng(1)
usr.SetInfo

'--- Clear this flag so that the user does not have to change the password
at next logon.

usr.Put "PasswordExpired", CLng(0)


usr.SetInfo

Este exemplo mostra como obter o grupo primário do usuário.

VB

Dim usr As Object


Dim grpPrimaryID As Object

Set usr = GetObject("WinNT://Fabrikam/jsmith,user")


grpPrimaryID = usr.Get("PrimaryGroupID")

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Exemplos de gerenciamento de conta
de usuário do WinNT
Artigo • 13/06/2023

Os exemplos de código a seguir mostram como trabalhar com algumas das


propriedades do usuário usando o provedor WinNT:

Conta desabilitada (Provedor WinNT)


Expiração da conta (Provedor WinNT)
Bloqueio de conta (Provedor WinNT)
SID do objeto (Provedor WinNT)
Senha Nunca Expira (Provedor WinNT)
O usuário não pode alterar a senha (provedor WinNT)
O usuário deve alterar a senha no próximo logon (provedor WinNT)

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Conta desabilitada (Provedor WinNT)
Artigo • 03/06/2023

Ao usar o provedor WinNT, uma conta pode ser habilitada ou desabilitada usando a
propriedade IADsUser.AccountDisabled .

Exemplo 1
O exemplo de código a seguir mostra como desabilitar uma conta usando Visual Basic
com ADSI.

VB

Dim usr as IADsUser


On Error GoTo Cleanup

Set usr = GetObject("WinNT://Fabrikam/JeffSmith")


usr.AccountDisabled = TRUE ' Disable the account.
usr.SetInfo

Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set usr = Nothing

Exemplo 2
O exemplo de código a seguir mostra como desabilitar uma conta usando C++ com
ADSI.

C++

IADsUser *pUser;

HRESULT hr = S_OK;
LPWSTR adsPath;
adsPath=L"WinNT://Fabrikam/JeffSmith";
hr = ADsGetObject(adsPath, IID_IADsUser, (void**)&pUser);

hr = pUser->put_AccountDisabled(TRUE);
hr = pUser->SetInfo();
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Expiração da conta (provedor WinNT)
Artigo • 12/06/2023

Ao usar o provedor WinNT, a data de validade da conta pode ser definida usando a
propriedade IADsUser.AccountExpirationDate .

Para definir a data de validade da conta, defina a propriedade


IADsUser.AccountExpirationDate como o valor de data desejado. Para definir a data de
validade da conta como nunca expirar, defina essa propriedade como "1º de janeiro de
1970".

Exemplo 1
O exemplo de código a seguir mostra como definir a data de validade da conta usando
o Visual Basic com ADSI.

VB

Dim usr As IADsUser

Set usr = GetObject("WinNT://Fabrikam/JeffSmith")


usr.AccountExpirationDate = "05/06/1998"
usr.SetInfo

' Set the account to never expire.


usr.AccountExpirationDate = "01/01/1970"
usr.SetInfo

Exemplo 2
O exemplo de código a seguir mostra como definir a data de validade da conta usando
C++ com ADSI.

C++

void SetUserAccountExpirationDate(IADsUser *pUser, DATE date)


{
if(!pUser) return;

HRESULT hr = S_OK;
hr = pUser->put_AccountExpirationDate(date); // Set the account to
expires on date.

hr = pUser->SetInfo();
hr = pUser->Release();
return;
}

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Bloqueio de Conta (Provedor WinNT)
Artigo • 03/06/2023

Quando o número de tentativas de logon com falha é excedido, a conta de usuário fica
bloqueada pelo número de minutos especificado pelo atributo lockoutDuration . A
propriedade IADsUser.IsAccountLocked parece ser a propriedade a ser usada para ler e
modificar o estado de bloqueio de uma conta de usuário, mas o provedor WINNT ADSI
tem restrições que limitam o uso da propriedade IsAccountLocked .

Redefinindo o status de bloqueio da conta


Ao usar o provedor WinNT, a propriedade IsAccountLocked só pode ser definida como
FALSE, o que desbloqueia a conta. A tentativa de definir a propriedade
IsAccountLocked como TRUE falhará. Somente o sistema pode bloquear uma conta.

O exemplo de código a seguir demonstra como usar Visual Basic com ADSI para
desbloquear uma conta de usuário.

VB

Public Sub UnlockAccount(AccountDN As String)


Dim usr As IADsUser

' Bind to the user account.


Set usr = GetObject("WinNT://" + AccountDN)

' Set the IsAccountLocked property to False


usr.IsAccountLocked = False

' Flush the cached attributes to the server.


usr.SetInfo
End Sub

O exemplo de código a seguir demonstra como usar o C++ com ADSI para desbloquear
uma conta de usuário.

C++

HRESULT UnlockAccount(LPCWSTR pwszUserDN)


{
if(!pwszUserDN)
{
return E_INVALIDARG;
}
// Build the ADsPath.
CComBSTR sbstr = "WinNT://";
sbstr += pwszUserDN;

HRESULT hr;
CComPtr<IADsUser> spADsUser;

// Bind to the object.


hr = ADsOpenObject(sbstr,
NULL,
NULL,
ADS_SECURE_AUTHENTICATION,
IID_IADsUser,
(void**)&spADsUser);
if(S_OK != hr)
{
return hr;
}

// Set the IsAccountLocked property to FALSE;


hr = spADsUser->put_IsAccountLocked(VARIANT_FALSE);

// Commit the changes to the server.


hr = spADsUser->SetInfo();

return hr;
}

Lendo o status de bloqueio da conta


Com o provedor WinNT, a propriedade IsAccountLocked pode ser usada para
determinar se uma conta está bloqueada. Se uma conta for bloqueada, a propriedade
IsAccountLocked conterá TRUE. Se uma conta não estiver bloqueada, a propriedade
IsAccountLocked conterá FALSE.

O exemplo de código a seguir demonstra como usar Visual Basic com ADSI para
determinar se uma conta está bloqueada.

VB

Public Function IsAccountLocked(AccountDN As String) As Boolean


Dim oUser As IADsUser

' Bind to the object.


Set oUser = GetObject("WinNT://" + AccountDN)

' Get the IsAccountLocked property.


IsAccountLocked = oUser.IsAccountLocked
End Function
O exemplo de código a seguir demonstra como usar C++ com ADSI para determinar se
uma conta está bloqueada.

C++

HRESULT IsAccountLocked(LPCWSTR pwszUserDN, BOOL *pfLocked)


{
if(!pwszUserDN || !pfLocked)
{
return E_INVALIDARG;
}

*pfLocked = FALSE;

// Build the ADsPath.


CComBSTR sbstr = "WinNT://";
sbstr += pwszUserDN;

HRESULT hr;
CComPtr<IADsUser> spADsUser;

// Bind to the object.


hr = ADsOpenObject(sbstr,
NULL,
NULL,
ADS_SECURE_AUTHENTICATION,
IID_IADsUser,
(void**)&spADsUser);
if(S_OK != hr)
{
return hr;
}

VARIANT_BOOL vfLocked;
hr = spADsUser>get_IsAccountLocked(&vfLocked);
if(S_OK != hr)
{
return hr;
}

*pfLocked = (vfLocked != 0);

return hr;
}

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


SID do objeto (Provedor WinNT)
Artigo • 03/06/2023

O SID (identificador de segurança do usuário) pode ser recuperado usando o atributo


objectSID . O objectSID é retornado como uma matriz VARIANT de caracteres que
formam a cadeia de caracteres SID.

Código de exemplo
VB

sid = usr.Get("objectSID")
For i = LBound(sid) To UBound(sid)
Debug.Print sid(i)
Next

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Senha Nunca Expira (Provedor WinNT)
Artigo • 13/06/2023

Para habilitar essa opção usando o provedor WINNT ADSI, defina o sinalizador
ADS_UF_DONT_EXPIRE_PASSWD (0x10000) no atributo UserFlags .

7 Observação

Para o Windows 2000 e posterior, use o provedor ADSI LDAP para operações de
gerenciamento de usuário, conforme mostrado. Para obter mais informações,
consulte Password Never Expires (Provedor LDAP).

Exemplo 1
O exemplo de código a seguir mostra como definir a opção de senha nunca expira
usando o Visual Basic com ADSI.

VB

Const ADS_UF_DONT_EXPIRE_PASSWD = &H10000


Dim usr as IADs

Set usr = GetObject("WinNT://Fabrikam/JeffSmith")


oldFlags = usr.Get("UserFlags")
newFlags = oldFlags Or ADS_UF_DONT_EXPIRE_PASSWD
usr.Put "UserFlags", newFlags
usr.SetInfo

Exemplo 2
O exemplo de código a seguir mostra como definir a opção de senha nunca expira
usando C++ com ADSI.

C++

#include <activeds.h>

IADsUser *pUser = NULL;


VARIANT var;
VariantInit(&var);
HRESULT hr = S_OK;
LPWSTR adsPath;
adsPath = L"WinNT://Fabrikam/JeffSmith";
hr = ADsGetObject(adsPath,IID_IADsUser, (void**)&pUser);

CComBSTR sbstrUserFlags = "UserFlags";


hr = pUser->Get(sbstrUserFlags, &var);

V_I4(&var) |= ADS_UF_DONT_EXPIRE_PASSWD;
hr = pUser->Put(sbstrUserFlags, var);

hr = pUser->SetInfo();

VariantClear(&var);

pUser->Release();

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


O usuário não pode alterar a senha
(provedor WinNT)
Artigo • 12/06/2023

A capacidade de um usuário alterar sua senha é uma permissão que pode ser concedida
ou negada. Para obter mais informações sobre como ler e modificar essa permissão
programaticamente usando o provedor WinNT, consulte:

O usuário de leitura não pode alterar a senha (provedor WinNT)


Modificar o usuário não pode alterar a senha (provedor WinNT)

O atributo userFlags do objeto user só está disponível ao usar o provedor WinNT.

Também é possível ler e modificar essa permissão usando o provedor LDAP. Para obter
mais informações, consulte User Cannot Change Password (Provedor LDAP).

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


O usuário de leitura não pode alterar a
senha (provedor WinNT)
Artigo • 13/06/2023

A capacidade de um usuário alterar sua própria senha é uma permissão que pode ser
concedida ou negada. Para determinar se o usuário recebeu essa permissão com o
provedor WinNT, leia o sinalizador ADS_UF_PASSWD_CANT_CHANGE da propriedade
userFlags do objeto user. O sinalizador ADS_UF_PASSWD_CANT_CHANGE é definido
na enumeração ADS_USER_FLAG_ENUM .

Código de exemplo
O exemplo de código a seguir mostra como obter o sinalizador
ADS_UF_PASSWD_CANT_CHANGE da propriedade userFlags de um objeto de usuário.

VB

Const ADS_UF_PASSWD_CANT_CHANGE = &H40

Function UserCannotChangePassword(strDomain As String, strUser As String,


strUserCred As String, strPassword As String) As Boolean
UserCannotChangePassword = False

Dim oUser As IADs

strPath = "WinNT://" + strDomain + "/" + strUser

If "" <> strUserCred Then


Dim dso As IADsOpenDSObject

' Bind to the group with the specified user name and password.
Set dso = GetObject("WinNT:")
Set oUser = dso.OpenDSObject(strPath, strUserCred, strPassword, 1)
Else
' Bind to the group with the current credentials.
Set oUser = GetObject(strPath)
End If

If (oUser.Get("userFlags") And ADS_UF_PASSWD_CANT_CHANGE) <> 0 Then


UserCannotChangePassword = True
Else
UserCannotChangePassword = False
End If
End Function
O exemplo de código a seguir mostra como obter o sinalizador
ADS_UF_PASSWD_CANT_CHANGE da propriedade userFlags de um objeto de usuário.

C++

//**************************************************************************
*
//
// UserCannotChangePassword()
//
//**************************************************************************
*

HRESULT UserCannotChangePassword(LPCWSTR pwszDomain,


LPCWSTR pwszUser,
LPCWSTR pwszUserCred,
LPCWSTR pwszPassword,
BOOL *pfCannotChangePassword)
{
if(NULL == pwszDomain || NULL == pwszUser)
{
return E_INVALIDARG;
}

*pfCannotChangePassword = FALSE;

HRESULT hr;
IADs *pads;

CComBSTR sbstrADsPath = L"WinNT://";


sbstrADsPath += pwszDomain;
sbstrADsPath += "/";
sbstrADsPath += pwszUser;

hr = ADsOpenObject( sbstrADsPath,
pwszUserCred,
pwszPassword,
ADS_SECURE_AUTHENTICATION,
IID_IADs,
(void**)&pads);

if(SUCCEEDED(hr))
{
CComVariant svar;

hr = pads->Get(CComBSTR("userFlags"), &svar);
if(SUCCEEDED(hr))
{
if(ADS_UF_PASSWD_CANT_CHANGE & svar.lVal)
{
*pfCannotChangePassword = TRUE;
}
else
{
*pfCannotChangePassword = FALSE;
}
}

pads->Release();
}

return hr;
}

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Modificar o usuário não pode alterar a
senha (provedor WinNT)
Artigo • 13/06/2023

A capacidade de um usuário alterar sua própria senha é uma permissão que pode ser
concedida ou negada. Para negar essa permissão, adicione o sinalizador
ADS_UF_PASSWD_CANT_CHANGE à propriedade userFlags do objeto user. Para
conceder essa permissão, remova o sinalizador ADS_UF_PASSWD_CANT_CHANGE da
propriedade userFlags do objeto user.

Código de exemplo
O exemplo de código a seguir mostra como alterar o sinalizador
ADS_UF_PASSWD_CANT_CHANGE da propriedade userFlags de um objeto user.

VB

Const ADS_UF_PASSWD_CANT_CHANGE = &H40

Sub SetUserCannotChangePassword(strDomain As String, strUser As String,


strUserCred As String, strPassword As String, fUserCannotChangePassword As
Boolean)
Dim oUser As IADs

strPath = "WinNT://" + strDomain + "/" + strUser

If "" <> strUserCred Then


Dim dso As IADsOpenDSObject

' Bind to the group with the specified user name and password.
Set dso = GetObject("WinNT:")
Set oUser = dso.OpenDSObject(strPath, strUserCred, strPassword, 1)
Else
' Bind to the group with the current credentials.
Set oUser = GetObject(strPath)
End If

lUserFlags = oUser.Get("userFlags")

If fUserCannotChangePassword Then
lUserFlags = lUserFlags Or ADS_UF_PASSWD_CANT_CHANGE
Else
lUserFlags = lUserFlags And Not ADS_UF_PASSWD_CANT_CHANGE
End If

' Modify the userFlags property.


oUser.Put "userFlags", lUserFlags
' Commit the changes to the server.
oUser.SetInfo
End Sub

O exemplo de código a seguir mostra como alterar o sinalizador


ADS_UF_PASSWD_CANT_CHANGE da propriedade userFlags de um objeto user.

C++

//**************************************************************************
*
// SetUserCannotChangePassword()
//**************************************************************************
*

HRESULT SetUserCannotChangePassword(LPCWSTR pwszDomain,


LPCWSTR pwszUser,
LPCWSTR pwszUserCred,
LPCWSTR pwszPassword,
BOOL fCannotChangePassword)
{
if(NULL == pwszDomain ||
NULL == pwszUser)
{
return E_INVALIDARG;
}

HRESULT hr;
IADs *pads;

CComBSTR sbstrADsPath = L"WinNT://";


sbstrADsPath += pwszDomain;
sbstrADsPath += "/";
sbstrADsPath += pwszUser;

hr = ADsOpenObject( sbstrADsPath,
pwszUserCred,
pwszPassword,
ADS_SECURE_AUTHENTICATION,
IID_IADs,
(void**)&pads);

if(SUCCEEDED(hr))
{
CComBSTR sbstrPropName = "userFlags";
CComVariant svar;

hr = pads->Get(sbstrPropName, &svar);
if(SUCCEEDED(hr))
{
if(fCannotChangePassword)
{
svar.lVal |= ADS_UF_PASSWD_CANT_CHANGE;
}
else
{
svar.lVal &= ~ADS_UF_PASSWD_CANT_CHANGE;
}

// Perform the change.


hr = pads->Put(sbstrPropName, svar);

// Commit the change.


hr = pads->SetInfo();
}

pads->Release();
}

return hr;
}

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


O usuário deve alterar a senha no
próximo logon (provedor WinNT)
Artigo • 13/06/2023

Para habilitar essa opção, defina o atributo PasswordExpired do usuário como um (1).
Definir esse atributo como zero (0) permite que o usuário faça logon sem alterar a
senha.

Exemplo 1
O exemplo de código a seguir mostra como definir a opção alterar senha na próxima
opção de logon usando o Visual Basic com ADSI.

VB

Set usr = GetObject("WinNT://Fabrikam/jeffsmith,user")


usr.Put "PasswordExpired", CLng(1) ' User must change password.
usr.SetInfo

Exemplo 2
O exemplo de código a seguir mostra como definir a opção alterar senha na próxima
opção de logon usando C++ com ADSI.

C++

IADsUser *pUser = NULL;


HRESULT hr;

hr=ADsGetObject(L"WinNT://Fabrikam/jeffsmith,user",
IID_IADsUser,
(void**)&pUser);
VARIANT var;
VariantInit(&var);
V_I4(&var)=1;
V_VT(&var)=VT_I4;
hr = pUser->Put(_bstr_t("PasswordExpired"),var); // User must change
password.
hr = pUser->SetInfo();

VariantClear(&var);
pUser->Release();
Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Roteador ADSI
Artigo • 13/06/2023

O roteador ADSI fica entre um cliente e os provedores ADSI. Ele implementa um


conjunto principal de objetos que oferecem recursos e serviços básicos comuns a todos
os provedores. Portanto, qualquer recurso com suporte no roteador também tem
suporte em qualquer um dos provedores, a menos que o provedor escolha o contrário.
O módulo de roteador ADSI corresponde a Activeds.dll.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Objetos ADSI implementados na
camada do roteador
Artigo • 13/06/2023

A tabela a seguir apresenta uma breve descrição dos objetos COM implementados no
roteador ADSI.

Objeto ADSI Descrição Interfaces com suporte

Accesscontrolentry Um objeto ADSI que representa uma ACE IADsAccessControlEntry


(entrada de controle de acesso).

Accesscontrollist Um objeto ADSI que representa uma ACL (lista IADsAccessControlList


de controle de acesso).

ADsNamespaces Um objeto ADSI que representa o contêiner de Iads


vários namespaces. IADsContainer
IADsNamespaces

LargeInteger Um objeto ADSI que representa um inteiro Iadslargeinteger


grande.

Propertyentry Um objeto ADSI que representa uma entrada de IADsPropertyEntry


propriedade.

PropertyValue Um objeto ADSI que representa um valor de IADsPropertyValue


propriedade.

PropertyValue2 Um objeto ADSI que representa um valor de IADsPropertyValue2


propriedade.

SecurityDescriptor Um objeto ADSI que representa um descritor de IADsSecurityDescriptor


segurança.

Comentários
Esta página foi útil? ツ Yes ト No
Obter ajuda no Microsoft Q&A
Suporte ao provedor de interfaces ADSI
Artigo • 12/06/2023

A tabela a seguir lista uma breve descrição das interfaces compatíveis com os
provedores incluídos no ADSI para Windows 2000 e cliente DS. Uma entrada marcada
com "Sim" indica que pelo menos um objeto ADSI do provedor especificado dá suporte
à interface associada. "Não" indica que nenhum objeto do provedor dá suporte à
interface nesta versão. No futuro, as interfaces atualmente sem suporte podem se tornar
compatíveis com os provedores fornecidos pelo sistema.

Para obter mais informações sobre detalhes de implementação específicos do provedor


ADSI, consulte:

Provedor LDAP ADSI


Provedor ADSI WinNT
ROTEADOR ADSI

Para obter mais informações sobre qual propriedade ou método tem suporte para cada
interface, clique no nome da interface apropriado na primeira coluna da tabela.

Nome da Interface LDAP Winnt

Iads Yes Yes

IADsAccessControlEntry Yes No

IADsAccessControlList Yes No

IADsAcl No No

IADsBackLink No No

IADsCaseIgnoreList No No

IADsClass Yes Yes

IADsCollection No Yes

IADsComputer No Yes

IADsComputerOperations No Yes

IADsContainer Yes Yes

IADsDeleteOps Yes No

IADsDomain No Yes
Nome da Interface LDAP Winnt

IADsEmail No No

IADsExtension Yes Yes

IADsFaxNumber No No

IADsFileService No Yes

IADsFileServiceOperations No Yes

IADsFileShare No Yes

IADsGroup Yes Yes

IADsHold No No

Iadslargeinteger Yes No

IADsLocality Yes No

IADsMembers Yes Yes

IADsNamespaces Yes Yes

IADsNetAddress No No

IADsO Yes No

IADsObjectOptions Yes No

IADsOctetList No No

IADsOpenDSObject Yes Yes

IADSOU Yes No

IADsPath No No

IADsPathName Yes Yes

IADsPostalAddress No No

IADsPrintJob No Yes

IADsPrintJobOperations No Yes

IADsPrintQueue Yes Yes

IADsPrintQueueOperations Yes Yes

IADsProperty Yes Yes


Nome da Interface LDAP Winnt

IADsPropertyEntry Yes Yes

IADsPropertyList Yes Yes

IADsPropertyValue Yes Yes

IADsPropertyValue2 Yes Yes

IADsReplicaPointer No No

IADsResource No Yes

IADsSecurityDescriptor Yes No

IADsService No Yes

IADsServiceOperations No Yes

IADsSession No Yes

IADsSyntax Yes Yes

IADsTimestamp No No

IADsTypedName No No

Iadsuser Yes Yes

IDirectoryObject Yes No

Idirectorysearch Yes No

Suporte do provedor para IADsUser


Propriedade LDAP Winnt

Conta Desabilitada Com suporte Com suporte

AccountExpirationDate Com suporte Com suporte

BadLoginAddress Sem suporte Sem suporte

BadLoginCount Com suporte Com suporte

department Com suporte Sem suporte

Descrição Com suporte Com suporte


Propriedade LDAP Winnt

Divisão Com suporte Sem suporte

Emailaddress Com suporte Sem suporte

Employeeid Com suporte Sem suporte

FaxNumber Com suporte Sem suporte

Firstname Com suporte Sem suporte

FullName Com suporte Com suporte

GraceLoginsAllowed Sem suporte Sem suporte

GraceLoginsRemaining Sem suporte Sem suporte

HomeDirectory Com suporte Com suporte

Homepage Com suporte Sem suporte

IsAccountLocked Com suporte Com suporte

Idiomas Sem suporte Sem suporte

LastFailedLogin Com suporte Sem suporte

LastLogin Com suporte Com suporte

LastLogoff Com suporte Com suporte

Lastname Com suporte Sem suporte

LoginHours Com suporte Com suporte

LoginScript Com suporte Com suporte

LoginWorkstations Com suporte Com suporte

Gerente Com suporte Sem suporte

MaxLogins Sem suporte Sem suporte

MaxStorage Com suporte Com suporte

NamePrefix Com suporte Sem suporte

NameSuffix Com suporte Sem suporte

OfficeLocations Com suporte Sem suporte

OtherName Com suporte Sem suporte


Propriedade LDAP Winnt

PasswordExpirationDate Sem suporte Com suporte

PasswordLastChanged Com suporte Sem suporte

PasswordMinimumLength Sem suporte Com suporte

PasswordRequired Com suporte Com suporte

Imagem Com suporte Sem suporte

PostalAddresses Com suporte Sem suporte

PostalCodes Com suporte Sem suporte

Perfil Com suporte Com suporte

RequireUniquePassword Sem suporte Sem suporte

SeeAlso Com suporte Sem suporte

TelephoneHome Com suporte Sem suporte

TelephoneMobile Com suporte Sem suporte

Telephonenumber Com suporte Sem suporte

TelephonePager Com suporte Sem suporte

Título Com suporte Sem suporte

Suporte do provedor para IADsComputer


Propriedades LDAP Winnt

ComputerID Interface sem suporte Sem suporte

department Interface sem suporte Sem suporte

Descrição Interface sem suporte Sem suporte

Divisão Interface sem suporte Com suporte

Local Interface sem suporte Sem suporte

MemorySize Interface sem suporte Sem suporte

Modelo Interface sem suporte Sem suporte


Propriedades LDAP Winnt

NetAddresses Interface sem suporte Sem suporte

Operatingsystem Interface sem suporte Com suporte

OperatingSystemVersion Interface sem suporte Com suporte

Proprietário Interface sem suporte Com suporte

PrimaryUser Interface sem suporte Sem suporte

Processador Interface sem suporte Com suporte

Processorcount Interface sem suporte Com suporte

Role Interface sem suporte Sem suporte

Site Interface sem suporte Sem suporte

StorageCapacity Interface sem suporte Sem suporte

Suporte do provedor para


IADsComputerOperations
Propriedade LDAP Winnt

Desligamento Interface sem suporte Não implementado

Status Interface sem suporte Não implementado

Suporte do provedor para IADsDomain


Propriedade LDAP Winnt

IsWorkgroup Interface sem suporte Não implementado

MinPasswordLength Interface sem suporte Com suporte

MinPasswordAge Interface sem suporte Com suporte

MaxpasswordAge Interface sem suporte Com suporte


Propriedade LDAP Winnt

MaxBadPasswordsAllowed Interface sem suporte Com suporte

PasswordHistoryLength Interface sem suporte Com suporte

PasswordAttributes Interface sem suporte Sem suporte

AutoUnlockInterval Interface sem suporte Com suporte

LockoutObservationInterval Interface sem suporte Com suporte

Suporte do provedor para IADsFileService


Propriedade LDAP Winnt

Descrição Interface sem suporte Com suporte

MaxUserCount Interface sem suporte Com suporte

Suporte do provedor para IADsGroup


Propriedade LDAP Winnt

Descrição Com suporte Com suporte

Suporte do provedor para IADsClass


Propriedade LDAP Winnt

PrimaryInterface Com suporte Com suporte

CLSID Com suporte Com suporte

OID Com suporte Com suporte

Resumo Com suporte Com suporte

Auxiliar Com suporte Com suporte


Propriedade LDAP Winnt

MandatoryProperties Com suporte Com suporte

OptionalProperties Com suporte Com suporte

NamingProperties Com suporte Não implementado

DerivedFrom Com suporte Sem suporte

AuxDerivedFrom Com suporte Sem suporte

PossibleSuperiors Com suporte Com suporte

Contenção Com suporte para leitura Com suporte

Recipiente Com suporte para leitura Com suporte

HelpFileName Com suporte Com suporte

HelpFileContext Com suporte Com suporte

Método LDAP Winnt

Qualificadores Não implementado Não implementado

Suporte do provedor para IADsProperty


Propriedade LDAP Winnt

OID Com suporte Com suporte

Syntax Com suporte Com suporte

MaxRange Com suporte Com suporte

MinRange Com suporte Com suporte

Multivalorado Com suporte Com suporte

Suporte do provedor para IADsSyntax


Propriedade LDAP Winnt
Propriedade LDAP Winnt

OleAutoDataType Com suporte Com suporte

Suporte do provedor para IADsContainer


Propriedade LDAP Winnt

Count Não implementado Não implementado

Dicas Com suporte Não implementado

Filter Com suporte Com suporte

Suporte do provedor para IADsNamespaces


Propriedade LDAP Winnt

defaultContainer Com suporte Com suporte

Suporte do provedor para


IADsAccessControlEntry
Propriedade LDAP Winnt

AccessMask Com suporte Sem suporte

AccessType Com suporte Sem suporte

AccessFlags Com suporte Sem suporte

Sinalizadores Com suporte Sem suporte

Objecttype Com suporte Sem suporte

Inheritedobjecttype Com suporte Sem suporte

Administrador Com suporte Sem suporte


Suporte do provedor para
IADsAccessControlList
Propriedade LDAP Winnt

AceCount Com suporte Sem suporte

AceRevision Com suporte Sem suporte

Método LDAP Winnt

AddAce Com suporte Sem suporte

CopyAccessList Com suporte Sem suporte

RemoveAce Com suporte Sem suporte

get__NewEnum Com suporte Sem suporte

Suporte do provedor para


IADsSecurityDescriptor
Propriedade LDAP Winnt

Control Com suporte Sem suporte

DaclDefaulted Com suporte Sem suporte

Discretionaryacl Com suporte Sem suporte

Grupo Com suporte Sem suporte

GroupDefaulted Com suporte Sem suporte

Proprietário Com suporte Sem suporte

OwnerDefaulted Com suporte Sem suporte

SaclDefaulted Com suporte Sem suporte

Systemacl Com suporte Sem suporte

Método LDAP Winnt


Propriedade LDAP Winnt

CopySecurityDescriptor Com suporte Sem suporte

Suporte do provedor para IADsObjectOptions


Método LDAP Winnt

Getoption Com suporte Interface sem suporte

Setoption Com suporte Interface sem suporte

Suporte do provedor para IADsCollection


Método LDAP Winnt

Adicionar Interface sem suporte Sem suporte

get__NewEnum Interface sem suporte Com suporte

Getobject Interface sem suporte Com suporte

Remover Interface sem suporte Com suporte

Suporte do provedor para IADsMembers


Propriedade LDAP Winnt

Count Com suporte para GroupCollection, mas não para Sem suporte
UserCollection

Filter Com suporte Com suporte

Método LDAP Winnt

get__NewEnum Com suporte Com suporte


Suporte do provedor para IADsPathname
Propriedade LDAP Winnt

EscapedMode Com suporte Com suporte

Método LDAP Winnt

Configurar Com suporte Com suporte

SetDisplayType Com suporte Com suporte

Recuperar Com suporte Com suporte

GetNumElements Com suporte Com suporte

GetElement Com suporte Com suporte

GetEscapedElement Com suporte Sem suporte

RemoveLeafElement Com suporte Com suporte

CopyPath Com suporte Com suporte

Suporte do provedor para IADsPrintQueue


Propriedade LDAP Winnt

PrinterPath Com suporte Sem suporte

Modelo Com suporte Com suporte.

Datatype Sem suporte Com suporte

Printprocessor Sem suporte Com suporte

Descrição Com suporte Com suporte

Local Com suporte Com suporte

Starttime Com suporte Com suporte

UntilTime Com suporte Com suporte

DefaultJobPriority Sem suporte Com suporte

Priority Com suporte Com suporte


Propriedade LDAP Winnt

BannerPage Com suporte Com suporte

PrintDevices Com suporte Com suporte

NetAddresses Sem suporte Sem suporte

Suporte do provedor para


IADsPrintQueueOperations
Propriedade LDAP Winnt

Status Com suporte Com suporte

Método LDAP Winnt

Pausa Com suporte Com suporte.

PrintJobs Com suporte Com suporte

Purga Com suporte Com suporte

Retomar Com suporte Com suporte

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Códigos de erro ADSI
Artigo • 13/06/2023

Todos os códigos de erro ADSI são retornados como valores COM HRESULT . Eles
podem ser agrupados nos quatro tipos a seguir:

Códigos de erro COM genéricos


Códigos de erro ADSI genéricos
Códigos de erro win32 para ADSI
Códigos de erro LDAP para ADSI

Além disso, determinadas interfaces fornecem informações de erro adicionais,


conhecidas como mensagens de erro estendidas ADSI, que podem ser obtidas usando a
função ADsGetLastError .

Por fim, o código de exemplo C++ mostrado nesta seção mostra como trabalhar
mensagens de erro ADSI.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Códigos de erro COM genéricos
Artigo • 12/06/2023

Códigos de erro COM genéricos expressam a operação status conforme produzido por
todos os módulos COM. A tabela a seguir contém alguns exemplos desses códigos de
erro em qualquer plataforma Win32.

Código do Erro Valor hexadecimais Descrição

E_ABORT 0x80004004 Operação anulada.

E_FAIL 0x80004005 Erro não especificado.

E_NOINTERFACE 0x80004002 Interface sem suporte.

E_NOTIMPL 0x80004001 Não implementado.

E_POINTER 0x80004003 Ponteiro inválido.

E_UNEXPECTED 0x8000FFFF Falha catastrófica.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Códigos de erro ADSI genéricos
Artigo • 13/06/2023

Esses tipos de códigos de erro podem ser retornados por qualquer um dos provedores
de sistema ADSI para representar mensagens de erro específicas do ADSI. Eles têm o
código de instalação 5 com bits de severidade definidos como true ou false. Quando o
bit de severidade é definido como true, isso resulta em valores de erro do formulário
0x80005xxx e mensagens de erro do formulário E_ADS_*. Quando o bit de gravidade é
definido como false, isso resulta em valores de erro do formulário 0x00005xxx e as
mensagens de erro são do formulário S_ADS_* .

A tabela a seguir lista códigos de erro ADSI genéricos definidos em Adserr.h.

Valor Código Descrição Ação corretiva

0x00005011L S_ADS_ERRORSOCCURRED Durante uma Verifique se a


consulta, preferência de pesquisa
ocorreu um pode ser definida
ou mais legalmente e, se for o
erros. caso, que ela está
definida corretamente.

0x00005012L S_ADS_NOMORE_ROWS A operação Vá para o restante do


de pesquisa programa.
atingiu a
última linha.

0x00005013L S_ADS_NOMORE_COLUMNS A operação Vá para a próxima linha.


de pesquisa
atingiu a
última coluna
da linha
atual.

0x80005000L E_ADS_BAD_PATHNAME Um nome de Verifique se o objeto


caminho existe no servidor de
ADSI inválido diretório e marcar para
foi passado. erros de digitação do
caminho.

0x80005001L E_ADS_INVALID_DOMAIN_OBJECT Um objeto de Verifique o caminho do


domínio ADSI objeto de domínio.
desconhecido
foi solicitado.
Valor Código Descrição Ação corretiva

0x80005002L E_ADS_INVALID_USER_OBJECT Um objeto de Verifique a existência do


usuário ADSI objeto de usuário,
desconhecido marcar para erros de
foi solicitado. digitação do caminho e
os direitos de acesso do
usuário.

0x80005003L E_ADS_INVALID_COMPUTER_OBJECT Um objeto de Verifique a existência do


computador objeto de computador,
ADSI marcar para erros de
desconhecido digitação do caminho e
foi solicitado. os direitos de acesso do
computador.

0x80005004L E_ADS_UNKNOWN_OBJECT Um objeto Verifique o nome e os


ADSI direitos de acesso ao
desconhecido objeto.
foi solicitado.

0x80005005L E_ADS_PROPERTY_NOT_SET A
propriedade
ADSI
especificada
não foi
definida.

0x80005006L E_ADS_PROPERTY_NOT_SUPPORTED Não há Verifique se a


suporte para propriedade correta está
a definida.
propriedade
ADSI
especificada.

0x80005007L E_ADS_PROPERTY_INVALID A Verifique os parâmetros


propriedade passados para a
ADSI chamada de método.
especificada
é inválida

0x80005008L E_ADS_BAD_PARAMETER Um ou mais


parâmetros
de entrada
são inválidos.
Valor Código Descrição Ação corretiva

0x80005009L E_ADS_OBJECT_UNBOUND O objeto Chame GetInfo em um


ADSI objeto recém-criado
especificado após SetInfo ter sido
não está chamado.
associado a
um recurso
remoto.

0x8000500AL E_ADS_PROPERTY_NOT_MODIFIED O objeto


ADSI
especificado
não foi
modificado.

0x8000500BL E_ADS_PROPERTY_MODIFIED O objeto


ADSI
especificado
foi
modificado.

0x8000500CL E_ADS_CANT_CONVERT_DATATYPE O tipo de Verifique se o tipo de


dados não dados correto é usado
pode ser e/ou se há dados de
convertido esquema suficientes
em/de um disponíveis para
tipo de dados executar a conversão de
DS nativo. tipo de dados.

0x8000500DL E_ADS_PROPERTY_NOT_FOUND A Verifique se GetInfo foi


propriedade chamado implicitamente
não pode ser ou explicitamente. Se o
encontrada atributo for um atributo
no cache. operacional, ele deverá
ser recuperado
explicitamente com
GetInfoEx em vez de
GetInfo. Se o problema
persistir, a propriedade
não foi definida no
servidor.

0x8000500EL E_ADS_OBJECT_EXISTS O objeto Use um nome diferente


ADSI existe. para criar o objeto.
Valor Código Descrição Ação corretiva

0x8000500FL E_ADS_SCHEMA_VIOLATION A tentativa


de ação viola
as regras de
esquema de
serviço de
diretório.

0x80005010L E_ADS_COLUMN_NOT_SET A coluna


especificada
no ADSI não
foi definida.

0x80005014L E_ADS_INVALID_FILTER O filtro de Use o formato correto


pesquisa do filtro aceito pelo
especificado servidor de diretório.
é inválido.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Códigos de erro Win32 para ADSI
Artigo • 13/06/2023

Códigos de erro Standard Win32 também são usados para retornar mensagens de erro
ADSI. Especificamente, o provedor LDAP ADSI mapeia todos os códigos de erro LDAP
para códigos de erro Win32. Os valores HRESULT desses códigos de erro são do
formato 0x8007XXXX, em que os últimos quatro dígitos hexadecimal, XXXX,
correspondem aos valores DWORD do código de erro Win32 apropriado. Por exemplo,
o valor de erro ADSI 0x80072020 fornece o valor de erro Win32 de 0x2020 em
hexadecimal ou 8224 em decimal.

Para converter o valor HRESULT de um código de erro ADSI, retornado pelo aplicativo,
para o valor DWORD de erro do Win32 correspondente, conforme definido nos
arquivos de cabeçalho acima, use o procedimento a seguir.

A maioria dos códigos de erro Win32 para ADSI são definidos em Winerror.h ou
Lmerr.h. Os valores de erro são listados como valores decimais nesses arquivos.

Para converter o valor HRESULT de um código de erro ADSI para o valor DWORD do
erro Win32 correspondente

1. Converta o valor HRESULT em um número hexadecimal se começar com um valor


decimal como você pode obter de um aplicativo do Visual Basic.
2. Solte a 0x8007 parte produza o restante.
3. Converta o restante em um número decimal.
4. Procure o restante decimal em Winerror.h.
5. Se não for encontrado em Winerror.h, subtraia 2100 do restante decimal e procure
o resultado em Lmerr.h.

O ADSI 2.0 mapeia os códigos de erro LDAP para um conjunto de códigos de erro
Win32 diferentes daquele usado em ADSI para Windows 2000 e cliente DS. As
diferenças são listadas em:

Códigos de erro win32


Códigos de erro win32 para ADSI 2.0

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Códigos de erro win32
Artigo • 03/06/2023

A tabela a seguir lista as mensagens de erro LDAP para ADSI.

Valor do Mensagem LDAP Mensagem Win32 Descrição


erro ADSI

0L LDAP_SUCCESS NO_ERROR Êxito na


operação.

0x80070005L LDAP_INSUFFICIENT_RIGHTS ERROR_ACCESS_DENIED O usuário não


tem direitos de
acesso
suficientes.

0x80070008L LDAP_NO_MEMORY ERROR_NOT_ENOUGH_MEMORY O sistema está


sem memória.

0x8007001fL LDAP_OTHER ERROR_GEN_FAILURE Erro


desconhecido.

0x800700eaL LDAP_PARTIAL_RESULTS ERROR_MORE_DATA Resultados


parciais e
indicações
recebidas.

0x800700eaL LDAP_MORE_RESULTS_TO_RETURN ERROR_MORE_DATA Mais resultados


devem ser
retornados.

0x800704c7L LDAP_USER_CANCELLED ERROR_CANCELLED O usuário


cancelou a
operação.

0x800704c9L LDAP_CONNECT_ERROR ERROR_CONNECTION_REFUSED Não é possível


estabelecer a
conexão.

0x8007052eL LDAP_INVALID_CREDENTIALS ERROR_LOGON_FAILURE A credencial


fornecida não é
válida.

0x800705b4L LDAP_TIMEOUT ERROR_TIMEOUT A pesquisa


atingiu o tempo
limite.

0x80071392L LDAP_ALREADY_EXISTS ERROR_OBJECT_ALREADY_EXISTS O objeto já


existe.

0x8007200aL LDAP_NO_SUCH_ATTRIBUTE ERROR_DS_NO_ATTRIBUTE_OR_VALUE O atributo


solicitado não
existe.

0x8007200bL LDAP_INVALID_SYNTAX ERROR_DS_INVALID_ATTRIBUTE_SYNTAX A sintaxe não é


válida.

0x8007200cL LDAP_UNDEFINED_TYPE ERROR_DS_ATTRIBUTE_TYPE_UNDEFINED Tipo não


definido.
Valor do Mensagem LDAP Mensagem Win32 Descrição
erro ADSI

0x8007200dL LDAP_ATTRIBUTE_OR_VALUE_EXISTS ERROR_DS_ATTRIBUTE_OR_VALUE_EXISTS O atributo existe


ou o valor foi
atribuído.

0x8007200eL LDAP_BUSY ERROR_DS_BUSY O servidor está


ocupado.

0x8007200fL LDAP_UNAVAILABLE ERROR_DS_UNAVAILABLE O servidor não


está disponível.

0x80072014L LDAP_OBJECT_CLASS_VIOLATION ERROR_DS_OBJ_CLASS_VIOLATION Violação de


classe de objeto.

0x80072015L LDAP_NOT_ALLOWED_ON_NONLEAF ERROR_DS_CANT_ON_NON_LEAF A operação não é


permitida em um
objeto não folha.

0x80072016L LDAP_NOT_ALLOWED_ON_RDN ERROR_DS_CANT_ON_RDN A operação não é


permitida em um
RDN.

0x80072017L LDAP_NO_OBJECT_CLASS_MODS ERROR_DS_CANT_MOD_OBJ_CLASS Não é possível


modificar a
classe de objeto.

0x80072020L LDAP_OPERATIONS_ERROR ERROR_DS_OPERATIONS_ERROR Erro de operação.

0x80072021L LDAP_PROTOCOL_ERROR ERROR_DS_PROTOCOL_ERROR Erro de


protocolo.

0x80072022L LDAP_TIMELIMIT_EXCEEDED ERROR_DS_TIMELIMIT_EXCEEDED Limite de tempo


excedido.

0x80072023L LDAP_SIZELIMIT_EXCEEDED ERROR_DS_SIZELIMIT_EXCEEDED Limite de


tamanho
excedido.

0x80072024L LDAP_ADMIN_LIMIT_EXCEEDED ERROR_DS_ADMIN_LIMIT_EXCEEDED Limite de


administração
excedido no
servidor.

0x80072025L LDAP_COMPARE_FALSE ERROR_DS_COMPARE_FALSE Comparar FALSE


gerado.

0x80072026L LDAP_COMPARE_TRUE ERROR_DS_COMPARE_TRUE Comparar TRUE


gerado.

0x80072027L LDAP_AUTH_METHOD_NOT_SUPPORTED ERROR_DS_AUTH_METHOD_NOT_SUPPORTED Não há suporte


ao método de
autenticação.

0x80072028L LDAP_STRONG_AUTH_REQUIRED ERROR_DS_STRONG_AUTH_REQUIRED A autenticação


forte é
necessária.

0x80072029L LDAP_INAPPROPRIATE_AUTH ERROR_DS_INAPPROPRIATE_AUTH A autenticação é


inadequada.
Valor do Mensagem LDAP Mensagem Win32 Descrição
erro ADSI

0x8007202aL LDAP_AUTH_UNKNOWN ERROR_DS_AUTH_UNKNOWN Erro de


autenticação
desconhecido.

0x8007202bL LDAP_REFERRAL ERROR_DS_REFERRAL Não é possível


resolver a
indicação.

0x8007202cL LDAP_UNAVAILABLE_CRIT_EXTENSION ERROR_DS_UNAVAILABLE_CRIT_EXTENSION A extensão crítica


não está
disponível.

0x8007202dL LDAP_CONFIDENTIALITY_REQUIRED ERROR_DS_CONFIDENTIALITY_REQUIRED A


confidencialidade
é necessária.

0x8007202eL LDAP_INAPPROPRIATE_MATCHING ERROR_DS_INAPPROPRIATE_MATCHING Houve uma


correspondência
inapropriada.

0x8007202fL LDAP_CONSTRAINT_VIOLATION ERROR_DS_CONSTRAINT_VIOLATION Houve uma


violação de
restrição.

0x80072030L LDAP_NO_SUCH_OBJECT ERROR_DS_NO_SUCH_OBJECT O objeto não


existe.

0x80072031L LDAP_ALIAS_PROBLEM ERROR_DS_ALIAS_PROBLEM O alias não é


válido.

0x80072032L LDAP_INVALID_DN_SYNTAX ERROR_DS_INVALID_DN_SYNTAX O nome


diferenciado tem
sintaxe que não é
válida.

0x80072033L LDAP_IS_LEAF ERROR_DS_IS_LEAF O objeto é uma


folha.

0x80072034L LDAP_ALIAS_DEREF_PROBLEM ERROR_DS_ALIAS_DEREF_PROBLEM Não é possível


desreferenciar o
alias.

0x80072035L LDAP_UNWILLING_TO_PERFORM ERROR_DS_UNWILLING_TO_PERFORM O servidor não


pode executar a
operação.

0x80072036L LDAP_LOOP_DETECT ERROR_DS_LOOP_DETECT Loop foi


detectado.

0x80072037L LDAP_NAMING_VIOLATION ERROR_DS_NAMING_VIOLATION Houve uma


violação de
nomenclatura.

0x80072038L LDAP_RESULTS_TOO_LARGE ERROR_DS_OBJECT_RESULTS_TOO_LARGE O conjunto de


resultados é
muito grande.
Valor do Mensagem LDAP Mensagem Win32 Descrição
erro ADSI

0x80072039L LDAP_AFFECTS_MULTIPLE_DSAS ERROR_DS_AFFECTS_MULTIPLE_DSAS Vários agentes


de serviço de
diretórios são
afetados.

0x8007203aL LDAP_SERVER_DOWN ERROR_DS_SERVER_DOWN Não é possível


contatar o
servidor LDAP.

0x8007203bL LDAP_LOCAL_ERROR ERROR_DS_LOCAL_ERROR Erro local.

0x8007203cL LDAP_ENCODING_ERROR ERROR_DS_ENCODING_ERROR Erro de


codificação.

0x8007203dL LDAP_DECODING_ERROR ERROR_DS_DECODING_ERROR Erro de


decodificação.

0x8007203eL LDAP_FILTER_ERROR ERROR_DS_FILTER_UNKNOWN O filtro de


pesquisa está
inválido.

0x8007203fL LDAP_PARAM_ERROR ERROR_DS_PARAM_ERROR Um parâmetro


ruim foi passado
para uma função.

0x80072040L LDAP_NOT_SUPPORTED ERROR_DS_NOT_SUPPORTED Recurso sem


suporte.

0x80072041L LDAP_NO_RESULTS_RETURNED ERROR_DS_NO_RESULTS_RETURNED Os resultados


não são
retornados.

0x80072042L LDAP_CONTROL_NOT_FOUND ERROR_DS_CONTROL_NOT_FOUND O controle não


foi encontrado.

0x80072043L LDAP_CLIENT_LOOP ERROR_DS_CLIENT_LOOP O loop do cliente


foi detectado.

0x80072044L LDAP_REFERRAL_LIMIT_EXCEEDED ERROR_DS_REFERRAL_LIMIT_EXCEEDED Limite de


referência
excedido.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Códigos de erro win32 para ADSI 2.0
Artigo • 03/06/2023

A tabela a seguir lista as mensagens de erro LDAP para ADSI 2.0.

Valor do Mensagem LDAP Mensagem do Win32 Descrição


erro ADSI

0 LDAP_SUCCESS NO_ERROR Êxito na


operação.

0x80070002 LDAP_NO_SUCH_OBJECT ERROR_FILE_NOT_FOUND O objeto não


existe.

0x80070005 LDAP_AUTH_METHOD_NOT_SUPPORTED ERROR_ACCESS_DENIED Método de


autenticação
sem suporte.

0x80070005 LDAP_STRONG_AUTH_REQUIRED ERROR_ACCESS_DENIED Requer


autenticação
forte.

0x80070005 LDAP_INAPPROPRIATE_AUTH ERROR_ACCESS_DENIED Autenticação


inadequada.

0x80070005 LDAP_INSUFFICIENT_RIGHTS ERROR_ACCESS_DENIED O usuário tem


direitos de
acesso
insuficientes.

0x80070005 LDAP_AUTH_UNKNOWN ERROR_ACCESS_DENIED Erro de


autenticação
desconhecido.

0x80070008 LDAP_NO_MEMORY ERROR_NOT_ENOUGH_MEMORY O sistema está


sem memória.

0x8007001F LDAP_OTHER ERROR_GEN_FAILURE Ocorreu um


erro
desconhecido.

0x8007001F LDAP_LOCAL_ERROR ERROR_GEN_FAILURE Erro local.

0x80070037 LDAP_UNAVAILABLE ERROR_DEV_NOT_EXIST O servidor não


está disponível.

0x8007003A LDAP_SERVER_DOWN ERROR_BAD_NET_RESP Não é possível


contatar o
servidor LDAP.

0x8007003B LDAP_ENCODING_ERROR ERROR_UNEXP_NET_ERR Erro de


codificação.
Valor do Mensagem LDAP Mensagem do Win32 Descrição
erro ADSI

0x8007003B LDAP_DECODING_ERROR ERROR_UNEXP_NET_ERR Erro de


decodificação.

0x80070044 LDAP_ADMIN_LIMIT_EXCEEDED ERROR_TOO_MANY_NAMES Limite de


administração
excedido no
servidor.

0x80070056 LDAP_INVALID_CREDENTIALS ERROR_INVALID_PASSWORD Credencial não


válida.

0x80070057 LDAP_INVALID_DN_SYNTAX ERROR_INVALID_PARAMETER O nome


diferenciado
tem sintaxe que
não é válida.

0x80070057 LDAP_NAMING_VIOLATION ERROR_INVALID_PARAMETER Violação de


nomenclatura.

0x80070057 LDAP_OBJECT_CLASS_VIOLATION ERROR_INVALID_PARAMETER Violação da


classe de objeto.

0x80070057 LDAP_FILTER_ERROR ERROR_INVALID_PARAMETER O filtro de


pesquisa é ruim.

0x80070057 LDAP_PARAM_ERROR ERROR_INVALID_PARAMETER O parâmetro


inválido foi
passado para
uma rotina.

0X8007006E LDAP_OPERATIONS_ERROR ERROR_OPEN_FAILED Erro de


operação.

0x8007007A LDAP_RESULTS_TOO_LARGE ERROR_INSUFFICIENT_BUFFER O conjunto de


resultados é
muito grande.

0x8007007B LDAP_INVALID_SYNTAX ERROR_INVALID_NAME Sintaxe não


válida.

0x8007007C LDAP_PROTOCOL_ERROR ERROR_INVALID_LEVEL Erro de


protocolo.

0x800700B7 LDAP_ALREADY_EXISTS ERROR_ALREADY_EXISTS O objeto já


existe.

0x800700EA LDAP_PARTIAL_RESULTS ERROR_MORE_DATA Resultados


parciais e
indicações
recebidas.

0x800700EA LDAP_BUSY ERROR_BUSY O servidor está


ocupado.
Valor do Mensagem LDAP Mensagem do Win32 Descrição
erro ADSI

0x800703EB LDAP_UNWILLING_TO_PERFORM ERROR_CAN_NOT_COMPLETE O servidor não


pode executar a
operação.

0x8007041D LDAP_TIMEOUT ERROR_SERVICE_REQUEST_TIMEOUT Tempo limite de


pesquisa.

0x800704B8 LDAP_COMPARE_FALSE ERROR_EXTENDED_ERROR Comparar FALSE


gerado.

0x800704B8 LDAP_COMPARE_TRUE ERROR_EXTENDED_ERROR Comparar TRUE


gerado.

0x800704B8 LDAP_REFERRAL ERROR_EXTENDED_ERROR Não é possível


resolver a
indicação.

0x800704B8 LDAP_UNAVAILABLE_CRIT_EXTENSION ERROR_EXTENDED_ERROR A extensão


crítica não está
disponível.

0x800704B8 LDAP_NO_SUCH_ATTRIBUTE ERROR_EXTENDED_ERROR O atributo


solicitado não
existe.

0x800704B8 LDAP_UNDEFINED_TYPE ERROR_EXTENDED_ERROR O tipo não está


definido.

0x800704B8 LDAP_INAPPROPRIATE_MATCHING ERROR_EXTENDED_ERROR Houve uma


correspondência
inapropriada.

0x800704B8 LDAP_CONSTRAINT_VIOLATION ERROR_EXTENDED_ERROR Houve uma


violação de
restrição.

0x800704B8 LDAP_ATTRIBUTE_OR_VALUE_EXISTS ERROR_EXTENDED_ERROR O atributo existe


ou o valor foi
atribuído.

0x800704B8 LDAP_ALIAS_PROBLEM ERROR_EXTENDED_ERROR O alias não é


válido.

0x800704B8 LDAP_IS_LEAF ERROR_EXTENDED_ERROR Objeto é uma


folha.

0x800704B8 LDAP_ALIAS_DEREF_PROBLEM ERROR_EXTENDED_ERROR Não é possível


desreferenciar o
alias.

0x800704B8 LDAP_LOOP_DETECT ERROR_EXTENDED_ERROR Loop foi


detectado.
Valor do Mensagem LDAP Mensagem do Win32 Descrição
erro ADSI

0x800704B8 LDAP_NOT_ALLOWED_ON_NONLEAF ERROR_EXTENDED_ERROR A operação não


é permitida em
um objeto não
folha.

0x800704B8 LDAP_NOT_ALLOWED_ON_RDN ERROR_EXTENDED_ERROR A operação não


é permitida no
RDN.

0x800704B8 LDAP_NO_OBJECT_CLASS_MODS ERROR_EXTENDED_ERROR Não é possível


modificar a
classe de objeto.

0x800704B8 LDAP_AFFECTS_MULTIPLE_DSAS ERROR_EXTENDED_ERROR Vários agentes


de serviço de
diretórios são
afetados.

0x800704C7 LDAP_USER_CANCELLED ERROR_CANCELLED O usuário


cancelou a
operação.

0x80070718 LDAP_TIMELIMIT_EXCEEDED ERROR_NOT_ENOUGH_QUOTA Limite de tempo


excedido.

0x80070718 LDAP_SIZELIMIT_EXCEEDED ERROR_NOT_ENOUGH_QUOTA Limite de


tamanho
excedido.

No ADSI 2.0, várias mensagens de erro LDAP são mapeadas para um código de erro Win32 como
ERROR_EXTENDED_ERROR. Chame ADsGetLastError para recuperar a cadeia de caracteres de
erro retornada pelo servidor. Para obter mais informações, consulte ADSI Extended Error
Messages abaixo.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Códigos de erro LDAP para ADSI
Artigo • 13/06/2023

Quando um servidor LDAP gera um erro e passa o erro para o cliente, o erro é
convertido em uma cadeia de caracteres pelo cliente LDAP.

Esse método é semelhante aos códigos de erro win32 para ADSI. Neste exemplo, o
código de erro do cliente é o erro WIN32 0x80072020.

Para determinar os códigos de erro LDAP para ADSI

1. Remova o 8007 do código de erro WIN32. No exemplo, o valor hex restante é


2020.
2. Converta o valor hex restante em um valor decimal. No exemplo, o valor hexáx
restante 2020 é convertido no valor decimal 8224.
3. Pesquise no arquivo WinError.h a definição do valor decimal. No exemplo, 8224L
corresponde ao erro ERROR_DS_OPERATIONS_ERROR.
4. Substitua o prefixo ERROR_DS por LDAP_. No exemplo, a nova definição é
LDAP_OPERATIONS_ERROR.
5. Pesquise no arquivo Winldap.h o valor da definição de erro LDAP. No exemplo, o
valor de LDAP_OPERATIONS_ERROR no arquivo Winldap.h é 0x01.

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Mensagens de erro estendidas ADSI
Artigo • 13/06/2023

Além dos valores HRESULT , vários provedores de sistema ADSI (principalmente LDAP)
retornam dados de erro adicionais para operações executadas pelas seguintes
interfaces:

Iads
IADsContainer
IDirectoryObject
Idirectorysearch

Uma parte desses dados de erro estendidos é a cadeia de caracteres enviada pelo
servidor como parte do resultado da mensagem.

Chame ADsGetLastError para recuperar essas mensagens de erro estendidas. O


primeiro parâmetro dessa função, lpError, é um valor DWORD . Para um servidor do
Active Directory, ADSI tenta mapear uma mensagem de erro LDAP para um código de
erro Win32 apropriado e atribui o valor do código de erro Win32 ao lpError. Falha ao
resolve o mapeamento, ADSI atribui ERROR_INVALID_DATA ao lpError, como faz com
qualquer outro servidor de diretório. Em todos os casos, ADSI retransmite fielmente a
cadeia de caracteres da descrição do erro do servidor para o cliente por meio de
lpErrorBuf, o segundo parâmetro da função ADsGetLastError .

Comentários
Esta página foi útil? ツ Yes ト No

Obter ajuda no Microsoft Q&A


Exemplo de código para trabalhar com
mensagens de erro ADSI
Artigo • 03/06/2023

O exemplo de código a seguir mostra como recuperar uma mensagem de erro ADSI.

C++

CString GetErrorMessage( HRESULT hr )


{
BOOL bRet;
CString s;
LPTSTR lpBuffer=NULL;

if ( SUCCEEDED(hr) )
{
return _T("Success");
}

if ( hr & 0x00005000) // standard ADSI Errors


{
s = GetADSIError(hr);
}
else if ( HRESULT_FACILITY(hr)==FACILITY_WIN32 )
{

/////////////////////////////////////////////
// Retrieve the Win32 Error message
/////////////////////////////////////////////

bRet = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL, hr,
MAKELANGID(LANG_NEUTRAL,
SUBLANG_SYS_DEFAULT),
(LPTSTR) &lpBuffer, 0, NULL);

if ( !bRet )
{
s.Format(_T("Error %ld"), hr );
}

if ( lpBuffer )
{
s = lpBuffer;
LocalFree( lpBuffer );
}
}
else // Non Win32 Error
{
s.Format("%X", hr );
return s;
}

//////////////////////////////////////////////////////////////////
//
// Extended error message may be returned.
//
// IADs, IADsContainer, IDirectoryObject or IDirectorySearch may
// return this extended error message
//
/////////////////////////////////////////////////////////////////
WCHAR szBuffer[MAX_PATH];
WCHAR szName[MAX_PATH];
DWORD dwError;

hr = ADsGetLastError( &dwError, szBuffer,


(sizeof(szBuffer)/sizeof(WCHAR))-1,
szName, (sizeof(szName)/sizeof(WCHAR))-1 );

if ( SUCCEEDED(hr) && dwError != ERROR_INVALID_DATA &&


wcslen(szBuffer))
{
USES_CONVERSION;
s += _T(" -- Extended Error --- ");
s += OLE2T(szName);
s += _T(" : ");
s += OLE2T( szBuffer );
}

return s;
}

typedef struct tagADSERRMSG


{
HRESULT hr;
LPCTSTR pszError;
}ADSERRMSG;

#define ADDADSERROR(x) x, _T(#x)

ADSERRMSG adsErr[] =
{
ADDADSERROR(E_ADS_BAD_PATHNAME),
ADDADSERROR(E_ADS_INVALID_DOMAIN_OBJECT),
ADDADSERROR(E_ADS_INVALID_USER_OBJECT),
ADDADSERROR(E_ADS_INVALID_COMPUTER_OBJECT),
ADDADSERROR(E_ADS_UNKNOWN_OBJECT),
ADDADSERROR(E_ADS_PROPERTY_NOT_SET),
ADDADSERROR(E_ADS_PROPERTY_NOT_SUPPORTED),
ADDADSERROR(E_ADS_PROPERTY_INVALID),
ADDADSERROR(E_ADS_BAD_PARAMETER),
ADDADSERROR(E_ADS_OBJECT_UNBOUND),
ADDADSERROR(E_ADS_PROPERTY_NOT_MODIFIED),
ADDADSERROR(E_ADS_PROPERTY_MODIFIED),
ADDADSERROR(E_ADS_CANT_CONVERT_DATATYPE),
ADDADSERROR(E_ADS_PROPERTY_NOT_FOUND),
ADDADSERROR(E_ADS_OBJECT_EXISTS),
ADDADSERROR(E_ADS_SCHEMA_VIOLATION),
ADDADSERROR(E_ADS_COLUMN_NOT_SET),
ADDADSERROR(E_ADS_INVALID_FILTER),
ADDADSERROR(0),
};

/////////////////////////////////////////////
//
// Error message specific to ADSI
//
////////////////////////////////////////////
CString GetADSIError( HRESULT hr )
{
CString s;

if ( hr & 0x00005000 )
{
int idx=0;
while (adsErr[idx].hr != 0 )
{
if ( adsErr[idx].hr == hr )
{
return adsErr[idx].pszError;
}
idx++;
}
}

return _T("");

Comentários
ツ Yes ト No
Esta página foi útil?

Obter ajuda no Microsoft Q&A

Você também pode gostar