Escolar Documentos
Profissional Documentos
Cultura Documentos
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.
7 Observação
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.
Nesta seção
Sobre ADSI
Usando ADSI
Referência ADSI
Tópicos relacionados
O Component Object Model
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:
Comentários
Esta página foi útil? ツ Yes ト No
Comentários
Esta página foi útil? ツ Yes ト No
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.
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
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
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.
HTML
<html>
<body>
</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
Comentários
Esta página foi útil? ツ Yes ト No
7 Observação
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.
1. Siga as etapas anteriores para criar um projeto executável padrão do Visual Basic.
VB
'------------------------------------------------------------
' This code example is used to set the FullName and Description
'------------------------------------------------------------
Dim usr As IADsUser
Comentários
Esta página foi útil? ツ Yes ト No
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:
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:
C++
#include "stdafx.h"
#include "activeds.h"
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 );
if ( !SUCCEEDED(hr) )
{
return 0;
}
if ( !SUCCEEDED(hr) )
{
return 0;
}
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
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.
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.
Comentários
Esta página foi útil? ツ Yes ト No
7 Observação
Tópicos Avançados
Comentários
Esta página foi útil? ツ Yes ト No
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:
Comentários
Esta página foi útil? ツ Yes ト No
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
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
Tópicos relacionados
Associação a objetos do Active Directory
Comentários
Esta página foi útil? ツ Yes ト No
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.
"progID://DN"
"LDAP://DC=Fabrikam,DC=Com"
Associando o objeto
Veja como associar o objeto de domínio neste cenário:
VB
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")
Tópicos relacionados
Criando uma unidade organizacional
Comentários
Esta página foi útil? ツ Yes ト No
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
VB
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
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
VB
Set usr =
salesOU.MoveHere("LDAP://CN=jeffsmith,CN=Users,DC=fabrikam,DC=com",
vbNullString)
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
Terry Adams foi contratado para a organização Fabrikam Sales. Seu relatório direto é
Patrick Hines.
VB
usr.SetPassword "seahorse"
usr.AccountDisabled = False
usr.SetInfo
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.
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
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.
Tópicos relacionados
Adicionando usuários a um grupo
Comentários
Esta página foi útil? ツ Yes ト No
VB
Tópicos relacionados
Criando um novo grupo
Comentários
Esta página foi útil? ツ Yes ト No
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.
Comentários
Esta página foi útil? ツ Yes ト No
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")
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
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)
Tópicos relacionados
Pesquisando objetos
Comentários
Esta página foi útil? ツ Yes ト No
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.
VB
VB
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
Comentários
Esta página foi útil? ツ Yes ト No
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
Agora, Joe pode mover Julie para a unidade organizacional de Vendas e Suporte.
VB
Lembre-se de que o vínculo de relatório direto do gerente entre Julie Bankert e Chris
Gray é atualizado automaticamente pelo Active Directory.
1. Abra o Visual Basic versão 6.0 e, quando solicitado para o tipo de projeto,
selecione Projeto de Dados.
11. Na janela do projeto, clique com o botão direito do mouse em Projeto de Dados e
selecione DadosPropriedades do Projeto.
Tópicos relacionados
Unindo dados heterogêneos
Comentários
Esta página foi útil? ツ Yes ト No
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.
SQL
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:
Digite e execute:
SQL
SQL
Tópicos relacionados
Criando e executando uma exibição
Comentários
Esta página foi útil? ツ Yes ト No
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.
SQL
SQL
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
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
SQL
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
SQL
Comentários
Esta página foi útil? ツ Yes ト No
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
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
Comentários
Esta página foi útil? ツ Yes ト No
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
sec.DiscretionaryAcl = acl
ou.Put "ntSecurityDescriptor", Array(sec)
' Use SetInfo to commit the data to Active Directory.
ou.SetInfo
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.
Comentários
Esta página foi útil? ツ Yes ト No
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
usr.SetInfo
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.
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
Para obter mais informações sobre scripts com ADSI, com tutoriais de script, exemplos e
ferramentas, consulte:
Comentários
Esta página foi útil? ツ Yes ト No
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:
Comentários
Esta página foi útil? ツ Yes ト No
VB
Sub AdsiErr()
Dim s
Dim e
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.
(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
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 .
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:
Comentários
Esta página foi útil? ツ Yes ト No
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.
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.
Referência do programador OLE 2, Volume Dois. Redmond, WA: Microsoft Press, 1994.
Comentários
Esta página foi útil? ツ Yes ト No
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
Comentários
Esta página foi útil? ツ Yes ト No
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
Recurso Benefício
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++.
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
Problema
%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\
%LOCALAPPDATA%\Microsoft\Windows\SchCache
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
%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
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.
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.
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
Sinalizador Valor
TRACE_LEVEL_ERROR 0x00000002
TRACE_LEVEL_INFORMATION 0x00000004
tracelog.exe -stopsessionname
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.
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.
HKEY_LOCAL_MACHINE\Sistema\Currentcontrolset\Serviços\Adsi\Rastreamento\
cscript.exe
HKEY_LOCAL_MACHINE\Sistema\Currentcontrolset\Serviços\Adsi\Rastreamento\
cscript.exe
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.
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.
Comentários
Esta página foi útil? ツ Yes ト No
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.
Interface Descriçã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
C++
C:\public\documents\adsi\adsi_spec.doc
C++
CN=John,OU=Marketing,O=Fabrikam
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.
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
Comentários
Esta página foi útil? ツ Yes ト No
7 Observação
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.
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++.
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.
Comentários
Esta página foi útil? ツ Yes ト No
À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.
Comentários
Esta página foi útil? ツ Yes ト No
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 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 .
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.
7 Observação
Comentários
Esta página foi útil? ツ Yes ト No
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.
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.
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:
Comentários
Esta página foi útil? ツ Yes ト No
Comentários
Esta página foi útil? ツ Yes ト No
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.
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
VB
Set x = GetObject("ADs:")
For Each provider In x
provider.Name
Next
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.
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
Comentários
Esta página foi útil? ツ Yes ト No
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.
syntax
LDAP://fabrikam.com/OU=Sales
Comentários
Esta página foi útil? ツ Yes ト No
Comentários
Esta página foi útil? ツ Yes ト No
Comentários
Esta página foi útil? ツ Yes ト No
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.
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.
// Uninitialize COM.
CoUninitialize();
Comentários
Esta página foi útil? ツ Yes ト No
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.
U Cuidado
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
openDS.OpenDSObject("LDAP://CN=jeffsmith,DC=fabrikam,DC=com",
vbNullString,
vbNullString,
ADS_SECURE_AUTHENTICATION)
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.
A interface IADsOpenDSObject também pode ser usada em C++, mas duplica a função
ADsOpenObject .
C++
IADsOpenDSObject *pDSO;
HRESULT hr;
hr = pDSO-
>OpenDSObject(CComBSTR("LDAP://CN=jeffsmith,DC=fabrikam,DC=com"),
NULL,
NULL,
ADS_SECURE_AUTHENTICATION,
&pDisp);
if(SUCCEEDED(hr))
{
IADs *pObject;
pDisp->Release();
}
pDSO->Release();
}
Confira também
ADS_AUTHENTICATION_ENUM exemplos
IADsOpenDSObject
ADsOpenObject
Comentários
Esta página foi útil? ツ Yes ト No
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.
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
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
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"
Comentários
Esta página foi útil? ツ Yes ト No
VB
' 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)
objName = obj.Get("distinguishedName")
Debug.Print (objName)
objName = obj.Get("distinguishedName")
Debug.Print (objName)
Comentários
Esta página foi útil? ツ Yes ト No
O exemplo de código C++ a seguir mostra uma função que recupera um objeto filho
especificado.
C++
*ppChild = NULL;
HRESULT hr;
IADsContainer *pCont;
hr = pObject->QueryInterface(IID_IADsContainer, (LPVOID*)&pCont);
if(SUCCEEDED(hr))
{
BSTR bstrClass = NULL;
if(pwszClass)
{
bstrClass = SysAllocString(pwszClass);
}
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
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.
C++
*ppParent = NULL;
if(NULL == pObject)
{
return E_INVALIDARG;
}
HRESULT hr;
BSTR bstr;
SysFreeString(bstr);
}
return hr;
}
Comentários
Esta página foi útil? ツ Yes ト No
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.
Comentários
Esta página foi útil? ツ Yes ト No
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 .
Comentários
Esta página foi útil? ツ Yes ト No
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.
Comentários
Esta página foi útil? ツ Yes ト No
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.
Comentários
Esta página foi útil? ツ Yes ト No
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.
Comentários
Esta página foi útil? ツ Yes ト No
Cada objeto ADSI deve dar suporte a essa interface, que serve para:
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.
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:").
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.
Comentários
Esta página foi útil? ツ Yes ト No
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 .
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
Exemplos
O exemplo de código a seguir mostra como acessar a propriedade ADsPath na interface
IADs.
VB
C++
HRESULT hr;
IADs *pUser;
// 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
VB
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set MyUser = Nothing
VB
Comentários
Esta página foi útil? ツ Yes ト No
VB
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
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set usr = Nothing
Comentários
Esta página foi útil? ツ Yes ト No
VB
' 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")
' 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
VB
' 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")
' 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
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
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
' 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()
***************************************************************************/
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
7 Observação
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
C++
#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>
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;
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);
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;
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;
wprintf(L"%s
",varDate.bstrVal);
VariantClear(&varDate);
}
else
{
}
else
{
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");
}
VariantClear(&var);
}
return hr;
}
if (!pObj)
{
return E_INVALIDARG;
}
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();
}
return hr;
}
#ifdef _MBCS
swprintf_s(pszSearchFilter, pszFormat, szFindUser);
#endif _MBCS
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;
}
// Initialize COM.
CoInitialize(NULL);
HRESULT hr = S_OK;
pDS->Release();
}
pObject->Release();
}
}
// Uninitialize COM.
CoUninitialize();
return;
}
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
Set ds = Nothing
Set con = Nothing
Set rs = Nothing
Set Com = Nothing
Set oIADs = Nothing
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)
Comentários
Esta página foi útil? ツ Yes ト No
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.
Comentários
Esta página foi útil? ツ Yes ト No
VB
' 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)
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
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
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++
CoInitialize(NULL);
hr = ADsGetObject(pszADsPath,
IID_IADs,
(void**) &pADs );
if (!SUCCEEDED(hr) )
{
return hr;
}
VARIANT var;
hr = pADs->SetInfo();
pADs->Release();
if (!SUCCEEDED(hr) )
{
return hr;
}
CoUninitialize();
return 0;
}
Comentários
Esta página foi útil? ツ Yes ト No
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.
Comentários
Esta página foi útil? ツ Yes ト No
SetInfo atualiza objetos que já existem no diretório ou cria uma entrada de diretório
para objetos recém-criados.
Comentários
Esta página foi útil? ツ Yes ト No
ADS_ATTR_CLEAR
ADS_ATTR_UPDATE
ADS_ATTR_APPEND
ADS_ATTR_DELETE
7 Observação
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;
ADS_ATTR_INFO attrInfo[2];
DWORD dwReturn;
pDirObject->Release();
}
Comentários
Esta página foi útil? ツ Yes ト No
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?
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.
//////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
// 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();
}
}
VB
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
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.
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.
Exemplos:
VB
PADS_ATTR_INFO pInfo;
// .. IDirectoryObject::GetObjectAttribute
printf("%S\n", pInfo->pADsValues->DNString );
7 Observação
Exemplo:
VB
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.
Hora UTC
VB
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.
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
Boolean
VB
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
Inteiro Grande
VB
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
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
Descritor de Segurança
VB
VB
Debug.Print sd.Control
Debug.Print sd.Group
Debug.Print sd.Owner
Debug.Print sd.Revision
Tópicos relacionados
Sintaxes para atributos do Active Directory
A tabela a seguir mapeia as sintaxes do Active Directory para suas sintaxes ADSI
correspondentes.
2.5.5.14 Distname-Address
Comentários
Esta página foi útil? ツ Yes ト No
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
VB
C++
hr = ADsGetObject(L"LDAP://Fabrikam/Schema", IID_IADsContainer,
(void**) &pSchema );
VB
C++
IADsContainer *pSchema=NULL;
HRESULT hr;
CoInitialize(NULL);
hr = ADsGetObject(L"LDAP://Fabrikam/Schema",
IID_IADsContainer, (void**) &pSchema );
if ( !SUCCEEDED(hr) )
{
return hr;
}
if ( SUCCEEDED(hr) )
{
VARIANT var;
ULONG lFetch;
IADs *pChild=NULL;
VariantInit(&var);
// 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
Comentários
Esta página foi útil? ツ Yes ト No
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.
Comentários
Esta página foi útil? ツ Yes ト No
Enumeração
Funções auxiliares de enumeração
Comentários
Esta página foi útil? ツ Yes ト No
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.
VB
Comentários
Esta página foi útil? ツ Yes ト No
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)) {
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++;
pDispatch = VariantArray[i].pdispVal;
if( SUCCEEDED( hr ) )
{
pObject->get_ADsPath( &bstrADsPath );
printf( "%S\n", bstrADsPath );
}
pObject->Release();
VariantClear( VariantArray + i );
SysFreeString( bstrADsPath );
}
dwObjects += cElementFetched;
}
exitpoint:
if (pEnumVariant) {
ADsFreeEnumerator( pEnumVariant );
}
if (pADsContainer) {
pADsContainer->Release();
}
return(hr);
}
Comentários
ツ Yes ト No
Esta página foi útil?
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:
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
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
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:
Comentários
Esta página foi útil? ツ Yes ト No
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
Comentários
Esta página foi útil? ツ Yes ト No
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
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.
Nunca: o servidor não deve gerar uma indicação para um cliente, embora
reconheça que outro servidor armazena os dados solicitados.
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
Para obter mais informações sobre como usar as opções de busca de referência com
uma interface de pesquisa específica, consulte:
Evite pesquisar texto no meio ou no final de uma cadeia de caracteres, por exemplo,
"cn=*hille*" ou "cn=*larouse".
Comentários
Esta página foi útil? ツ Yes ト No
Para obter mais informações sobre como usar a opção de tempo limite de pesquisa com
uma interface de pesquisa específica, consulte:
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
À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
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:
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 obter mais informações sobre como usar a opção de limite de tamanho de
pesquisa com uma interface de pesquisa específica, consulte:
Comentários
Esta página foi útil? ツ Yes ト No
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:
Comentários
Esta página foi útil? ツ Yes ト No
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.
Para obter mais informações sobre como usar a opção de tempo limite de pesquisa com
uma interface de pesquisa específica, consulte:
Comentários
Esta página foi útil? ツ Yes ト No
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:
Comentários
ツ Yes ト No
ツ Yes ト No
Esta página foi útil?
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.
C++
Exemplo Descrição
range=0-* Recupere todos os valores de propriedade. Isso está sujeito a limites impostos pelo
servidor.
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.
Comentários
Esta página foi útil? ツ Yes ト No
C++
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 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;
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;
VariantClear(&var);
}
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
' 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
' 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
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:
Comentários
Esta página foi útil? ツ Yes ト No
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
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
Comentários
Esta página foi útil? ツ Yes ト No
O exemplo de código a seguir usa o ADO (ActiveX Directory Objects) para recuperar os
membros de um grupo.
VB
oConn.Provider = "ADsDSOObject"
oConn.Properties("ADSI Flag") = 1
oConn.Open()
oComm.ActiveConnection = oConn
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)
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
C++
PADS_ATTR_INFO pAttrInfo;
DWORD dwRetrieved;
LPWSTR pszAttrs[2];
pszAttrs[0] = L"Name";
pszAttrs[1] = L"member;range=0-100";
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.
C++
ADS_SEARCH_HANDLE hSearch;
LPWSTR pszAttrs[2];
pszAttrs[0] = L"Name";
pszAttrs[1] = L"member;range=0-100";
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
C++
//**************************************************************************
*
//
// EnumGroupWithIDirectoryObject()
//
//**************************************************************************
*
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;
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
C++
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;
dwLowRange = 0;
dwHighRange = dwLowRange + (dwStep - 1);
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");
fLastQuery = TRUE;
FreeADsMem(pwszColumnName);
break;
}
else
{
ADS_SEARCH_COLUMN 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];
pSearch->Release();
}
return hr;
}
Comentários
Esta página foi útil? ツ Yes ト No
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
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:
Comentários
Esta página foi útil? ツ Yes ト No
7 Observação
Comentários
Esta página foi útil? ツ Yes ト No
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.
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
& 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++
C++
(&(objectCategory=group)(groupType:1.2.840.113556.1.4.803:=2147483648))
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)
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.
C++
(objectClass=*)
C++
(cn=*bob*)
C++
(cn>='bob')
C++
(&(objectClass=user)(email=*))
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*)))
C++
(!(email=*))
C++
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.
* \2a
( \28
) \29
\ \5c
NUL \00
/ \2f
7 Observação
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
Comentários
Esta página foi útil? ツ Yes ト No
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.
Dialeto LDAP
Dialeto SQL
Comentários
Esta página foi útil? ツ Yes ト No
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.
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.
SQL
SQL
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
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
Comentários
Esta página foi útil? ツ Yes ト No
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:
Uma cadeia de caracteres de dialeto LDAP consiste em quatro partes separadas por
ponto e vírgula (;).
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.
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"
VB
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
Comentários
Esta página foi útil? ツ Yes ト No
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.
Comentários
Esta página foi útil? ツ Yes ト No
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 obter mais informações sobre a sintaxe do filtro de pesquisa, consulte Sintaxe de
Filtro de Pesquisa.
O exemplo de código a seguir mostra esse cenário. Para iniciar a associação ao ADSI,
chame a função ADsOpenObject .
C++
// Interface Pointers.
IDirectorySearch *pDSSearch =NULL;
// Initialize COM.
CoInitialize(0);
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++
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 );
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++
Comentários
Esta página foi útil? ツ Yes ト No
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
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
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
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.
C++
ADS_SEARCHPREF_INFO SearchPref;
SearchPref.dwSearchPref = ADS_SEARCHPREF_PAGESIZE;
SearchPref.vValue.dwType = ADSTYPE_INTEGER;
SearchPref.vValue.Integer = 1000;
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
Por padrão, o cache de resultados está desabilitado. O cache de resultados deverá ser
habilitado se qualquer um dos seguintes itens for verdadeiro:
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
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.
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:
***************************************************************************/
ADS_SEARCHPREF_INFO SearchPrefs[1];
case ADSTYPE_CASE_IGNORE_STRING:
wprintf(L"%s: %s\n\n", rgpwszAttributes[i],
col.pADsValues[0].CaseExactString);
break;
default:
break;
}
return hr;
}
Comentários
Esta página foi útil? ツ Yes ト No
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.
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;
Comentários
Esta página foi útil? ツ Yes ト No
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
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 .
C++
ADS_SEARCHPREF_INFO SearchPref;
SearchPref.dwSearchPref = ADS_SEARCHPREF_SIZE_LIMIT;
SearchPref.vValue.dwType = ADSTYPE_INTEGER;
SearchPref.vValue.Integer = 1000;
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
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
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.
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
syntax
name
sn
department
phone
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
C++
if(FAILED(hr))
{
return;
}
if(FAILED(hr))
{
return;
}
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.
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.
Para obter mais informações sobre o controle VLV LDAP, consulte Pesquisando com o
controle VLV LDAP.
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.
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.
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.
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
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()
***************************************************************************/
/*
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;
}
/***************************************************************************
FreeContextID()
***************************************************************************/
/**************************************************************************
WideCharToLocal()
**************************************************************************/
*pLocal = 0;
#ifdef UNICODE
wcsncpy_s(pLocal, pWide, dwChars);
#else
WideCharToMultiByte( CP_ACP,
0,
pWide,
-1,
pLocal,
dwChars,
NULL,
NULL);
#endif
return lstrlen(pLocal);
}
C++
/***************************************************************************
GetVLVItemCount()
***************************************************************************/
if(!pSearch || !pdwCount)
{
return E_INVALIDARG;
}
*pdwCount = 0;
/*
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;
/*
Allocate or reallocate the buffer if required and copy the context ID
to the buffer.
*/
CopyContextID(pVlv->lpContextID, pVlv->dwContextIDLength, ppContextID);
C++
/***************************************************************************
GetVLVItemText()
***************************************************************************/
if(!pSearch)
{
return E_INVALIDARG;
}
/*
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;
/*
Allocate or reallocate the buffer if required and copy the
context ID
to the buffer.
*/
CopyContextID(pVlv->lpContextID, pVlv->dwContextIDLength,
ppContextID);
pSearch->FreeColumn(&column);
}
return hr;
}
C++
/***************************************************************************
GetVLVItemsByString()
***************************************************************************/
if(!pSearch || (0 == dwNumToRetrieve))
{
return E_INVALIDARG;
}
vlvPref.pszTarget = (LPWSTR)pwszFilter;
vlvPref.dwBeforeCount = 0;
vlvPref.dwAfterCount = dwNumToRetrieve - 1;
vlvPref.dwContentCount = 0;
/*
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;
pSearch->FreeColumn(&column);
}
/*
Allocate or reallocate the buffer if required and copy the context ID
to the buffer.
*/
CopyContextID(pVlv->lpContextID, pVlv->dwContextIDLength, ppContextID);
return hr;
}
Comentários
Esta página foi útil? ツ Yes ト No
Comentários
Esta página foi útil? ツ Yes ト No
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.
Parâmetro Uma coleção opcional para todos os parâmetros a serem fornecidos ao objeto de
comando.
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.
VB
Set con = CreateObject("ADODB.Connection")
con.Provider = "ADsDSOObject"
VB
<%
Set con = Server.CreateObject("ADODB.Connection")
con.Provider = "ADsDSOObject"
%>
VB
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".
O exemplo de código a seguir mostra como as propriedades são definidas antes de criar
o objeto Command .
VB
VB
VB
Propriedade Descrição
nomeada
Propriedade Descrição
nomeada
"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.
"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"
"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.
"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.
"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.
VB
Const ADS_SCOPE_ONELEVEL = 1
Const ADS_CHASE_REFERRALS_EXTERNAL = &H40
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
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")
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
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.
VB
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
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.
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
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:
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
//********************************************************************
//********************************************************************
// global variables and definitions
//********************************************************************
typedef struct
{
DBLENGTH dwLength;
DBSTATUS dwStatus;
BYTE bData[1];
}DBCOLUMNDATA, *PDBCOLUMNDATA;
/*********************************************************************
PrintAllUsers()
*********************************************************************/
if(DB_SEC_E_PERMISSIONDENIED == hr)
{
return hr;
}
if(S_OK != hr)
{
return hr;
}
/*
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;
/*
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;
}
/*
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);
}
PrintAllUsers_cleanup:
if(rgDBColumnInfo)
{
spMalloc->Free(rgDBColumnInfo);
}
if(pStringsBuffer)
{
spMalloc->Free(pStringsBuffer);
}
if(rgBind)
{
spMalloc->Free(rgBind);
}
if(pRowData)
{
spMalloc->Free(pRowData);
}
}
/********************************************************************
PrintRowData()
********************************************************************/
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
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++
cleanup:
if(pwszGuid)
{
FreeADsMem(pwszGuid);
}
if(pwszSearch)
{
delete pwszSearch;
}
Comentários
Esta página foi útil? ツ Yes ト No
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:
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.
SQL
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
SQL
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
Autenticação
Descritores de segurança em arquivos e chaves do registro
Comentários
Esta página foi útil? ツ Yes ト No
7 Observação
VB
' 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
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.
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
Aceflags
Sinalizadores
ACE_OBJECT_TYPE_PRESENT (1)
ACE_INHERITED_OBJECT_TYPE_PRESENT (2)
Objecttype
Inheritedobjecttype
VB
VB
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'
' 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
'
' AccessSystemAcl access type
'
'
' MaximumAllowed access type
'
'
' These are the generic rights
'
'
' AccessMask constants for FILE ACEs
'
Const FILE_READ_DATA = &H1 ' file & pipe
Const FILE_LIST_DIRECTORY = &H1 ' directory
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'
'<<<<<<<<<<<<<<<<<<<<<<<<< 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
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.
Comentários
Esta página foi útil? ツ Yes ト No
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.
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
Comentários
Esta página foi útil? ツ Yes ト No
Um agregador, também conhecido como objeto externo, é um objeto que cria uma
agregação. ADSI é um agregador.
Todas essas soluções são possíveis devido aos serviços fornecidos pelo Gerenciador de
Objetos ADSI, que residem em cada provedor ADSI.
Comentários
Esta página foi útil? ツ Yes ト No
Comentários
Esta página foi útil? ツ Yes ト No
Comentários
Esta página foi útil? ツ Yes ト No
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
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
VB
Dim x as IADsUser
Dim y as IADsExt1
Dim z as IADsExt2
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
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}
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
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 .
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}");
RegCloseKey(hKey);
return S_OK;
Comentários
Esta página foi útil? ツ Yes ト No
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.
C++
x.MyNewMethod( "\\srv\public")
x.MyProperty = "Hello World"
x.OtherMethod()
x.OtherProperty = 4362
Debug.Print x.LastName
Comentários
Esta página foi útil? ツ Yes ト No
A lista a seguir descreve o processo geral para executar uma associação tardia:
Comentários
Esta página foi útil? ツ Yes ト No
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
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
C++
Comentários
Esta página foi útil? ツ Yes ト No
C++
Comentários
Esta página foi útil? ツ Yes ト No
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;
}
return hr;
}
return hr;
return hr;
}
Veja a seguir uma breve revisão das regras de agregação COM e de extensão ADSI.
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á:
Comentários
Esta página foi útil? ツ Yes ト No
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.
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.
Por exemplo:
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
Considere o seguinte:
C++
IADs0 : IDispatch
{
OtherFunc();
}
IADs1 : IDispatch
{
Func0()
Func1();
}
IADs2 : IDispatch
{
Func0()
Func2();
}
VB
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.
VB
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
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 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
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.
Para o Exchange 5.5, a referência ADSI e as informações de uso podem ser encontradas
no guia do Exchange ADSI .
Comentários
Esta página foi útil? ツ Yes ト No
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
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.
C++
HRESULT hr;
IADsDeleteOps *pDeleteOps;
LPWSTR pwszUsername = NULL;
LPWSTR pwszPassword = NULL;
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
Comentários
Esta página foi útil? ツ Yes ト No
C++
VariantInit(&var);
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
C++
// Cleanup.
pIADsPathname->Release();
return (hr);
}
C++
HRESULT SetDistinguishedName(IADs *pIADs)
{
HRESULT hr = S_OK;
CComBSTR sbstrADsPath;
IADsPathname *pIADsPathname = NULL;
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
C++
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
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++
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.
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:
Comentários
Esta página foi útil? ツ Yes ト No
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.
Comentários
Esta página foi útil? ツ Yes ト No
Comentários
Esta página foi útil? ツ Yes ト No
Comentários
Esta página foi útil? ツ Yes ト No
Comentários
Esta página foi útil? ツ Yes ト No
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>.
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
Comentários
Esta página foi útil? ツ Yes ト No
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).
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.
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
Comentários
Esta página foi útil? ツ Yes ト No
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.
Comentários
Esta página foi útil? ツ Yes ト No
HKEY_LOCAL_MACHINE
SOFTWARE
Microsoft
ADs
Providers
provider = <provider namespace>
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>
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>
Comentários
Esta página foi útil? ツ Yes ト No
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
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.
syntax
// 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 :
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.
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
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.
Comentários
Esta página foi útil? ツ Yes ト No
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
Comentários
Esta página foi útil? ツ Yes ト No
Comentários
Esta página foi útil? ツ Yes ト No
7 Observação
Comentários
Esta página foi útil? ツ Yes ト No
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.
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.
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).
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
Comentários
Esta página foi útil? ツ Yes ト No
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.
Comentários
Esta página foi útil? ツ Yes ト No
7 Observação
Arquivo de Descrição
código-fonte
Método Descrição
Métodos iads padrão. Métodos de interface IADs padrão incluídos neste arquivo.
Comentários
Esta página foi útil? ツ Yes ト No
Método Descrição
Comentários
Esta página foi útil? ツ Yes ト No
Método Descrição
Comentários
Esta página foi útil? ツ Yes ト No
Método Descrição
CSampleDSGenObjectEnum::CSampleDSGenObjectEnum Inicialização.
Método Descrição
Comentários
Esta página foi útil? ツ Yes ト No
Método Descrição
Comentários
Esta página foi útil? ツ Yes ト No
Método Descrição
Comentários
Esta página foi útil? ツ Yes ト No
Método Descrição
Comentários
Esta página foi útil? ツ Yes ト No
Método Descrição
Comentários
Esta página foi útil? ツ Yes ト No
Comentários
Esta página foi útil? ツ Yes ト No
Método Descrição
Comentários
Esta página foi útil? ツ Yes ト No
Obter ajuda no Microsoft Q&A
CPROPS. CPP
Artigo • 12/06/2023
Método Descrição
Item Descrição
Comentários
Esta página foi útil? ツ Yes ト No
Método Descrição
Comentários
Esta página foi útil? ツ Yes ト No
Método Descrição
Comentários
Esta página foi útil? ツ Yes ト No
Item Descrição
Item Descrição
g_szProviderName "Exemplo"
Comentários
Esta página foi útil? ツ Yes ト No
CLSID_SampleDSNamespace
CLSID_SampleDSProvider
LIBID_SampleDSOle
CLSID_SampleDSGenObject
CLSID_SampleDSSchema
CLSID_SampleDSClass
CLSID_SampleDSProperty
Comentários
Esta página foi útil? ツ Yes ト No
Item Descrição
Dllcanunloadnow Ponto de entrada DLL padrão para determinar se a DLL pode ser
descarregada.
Comentários
Esta página foi útil? ツ Yes ト No
Item Descrição
Comentários
Esta página foi útil? ツ Yes ト No
Objeto Descrição
Comentários
Esta página foi útil? ツ Yes ト No
Rotina Descrição
Comentários
Esta página foi útil? ツ Yes ト No
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.
Item Descrição
ADsObject Analisa o ADspath passado para ele. Essa função segue as seguintes
regras gramaticais: <ADsObject> -><ProviderName>
<SampleDSObject>
CLexer::GetNextToken Tokenizer.
Comentários
Esta página foi útil? ツ Yes ト No
PackStringinVariant
UnpackStringinVariant
PackLONGinVariant
UnpackLONGfromVariant
PackDATEinVariant
UnpackDATEinVariant
PackVARIANT_BOOLinVariant
UnpackVARIANT_BOOLfromVariant
PackVARIANTinVariant
UnpackVARIANTfromVariant
Comentários
Esta página foi útil? ツ Yes ト No
Método Descrição
Comentários
Esta página foi útil? ツ Yes ト No
Comentários
Esta página foi útil? ツ Yes ト No
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:
Comentários
Esta página foi útil? ツ Yes ト No
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:
Comentários
Esta página foi útil? ツ Yes ト No
ADS_ATTR_CLEAR
ADS_ATTR_UPDATE
ADS_ATTR_APPEND
Faz com que os valores de atributo especificados sejam acrescentados aos valores de
atributo existentes.
ADS_ATTR_DELETE
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
Cabeçalho Iads.h
Confira também
ADS_ATTR_INFO
IDirectoryObject::SetObjectAttributes
Comentários
Esta página foi útil? ツ Yes ト No
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
ADS_JOB_PAUSED
1 (0x1)
ADS_JOB_ERROR
2 (0x2)
Ocorreu um erro.
ADS_JOB_DELETING
4 (0x4)
ADS_JOB_SPOOLING
8 (0x8)
ADS_JOB_PRINTING
16 (0x10)
ADS_JOB_OFFLINE
32 (0x20)
ADS_JOB_PAPEROUT
64 (0x40)
A impressora está sem papel.
ADS_JOB_PRINTED
128 (0x80)
ADS_JOB_DELETED
256 (0x100)
Requisitos
Requisito Valor
Cabeçalho Adssts.h
Comentários
Esta página foi útil? ツ Yes ト No
O ADSI (Active Directory Service Interfaces) define e usa os seguintes tipos de dados
simples.
C++
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
Cabeçalho Iads.h
Comentários
Esta página foi útil? ツ Yes ト No
Estrutura Descrição
Comentários
Esta página foi útil? ツ Yes ト No
Sintaxe
C++
Membros
pszAttrName
dwADsType
dwMinRange
dwMaxRange
fMultiValued
Requisitos
Cabeçalho iads.h
Confira também
Estruturas ADSI
ADSTYPEENUM
Comentários
Esta página foi útil? ツ Yes ト No
Sintaxe
C++
Membros
pszAttrName
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
pADsValues
Ponteiro para uma matriz de estruturas ADSVALUE que contêm valores para o atributo .
dwNumValues
Requisitos
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
Sintaxe
C++
Membros
RemoteID
ObjectName
Comentários
Um atributo Back Link contém um ou mais servidores que contêm uma referência
externa ao objeto anexado.
Requisitos
Cabeçalho iads.h
Confira também
Estruturas ADSI
Comentários
Esta página foi útil? ツ Yes ト No
Sintaxe
C++
Membros
Next
String
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
Confira também
Estruturas ADSI
Comentários
Esta página foi útil? ツ Yes ト No
Sintaxe
C++
Membros
pszClassName
dwMandatoryAttrs
ppszMandatoryAttrs
Ponteiro para uma matriz de cadeias de caracteres Unicode terminadas em nulo que
contêm os nomes dos atributos obrigatórios.
optionalAttrs
Ponteiro para uma matriz de cadeias de caracteres Unicode terminadas em nulo que
contêm os nomes dos atributos opcionais.
dwNamingAttrs
ppszNamingAttrs
Ponteiro para uma matriz de cadeias de caracteres Unicode terminadas em nulo que
contêm os nomes dos atributos de nomenclatura.
dwSuperClasses
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
Cabeçalho iads.h
Confira também
Estruturas ADSI
Comentários
Esta página foi útil? ツ Yes ト No
Sintaxe
C++
Membros
dwLength
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
Cabeçalho iads.h
Confira também
Estruturas ADSI
ADSVALUE
Object(DN-Binary)
Comentários
Esta página foi útil? ツ Yes ト No
Sintaxe
C++
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
Cabeçalho iads.h
Confira também
Estruturas ADSI
ADSVALUE
Object(DN-String)
Comentários
Esta página foi útil? ツ Yes ト No
Sintaxe
C++
Membros
Address
Type
Requisitos
Cabeçalho iads.h
Confira também
Estruturas ADSI
Comentários
Esta página foi útil? ツ Yes ト No
Sintaxe
C++
Membros
TelephoneNumber
NumberOfBits
Parameters
Requisitos
Cabeçalho iads.h
Confira também
Estruturas ADSI
Comentários
Esta página foi útil? ツ Yes ト No
Sintaxe
C++
Membros
ObjectName
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
Cabeçalho iads.h
Confira também
Estruturas ADSI
Comentários
Esta página foi útil? ツ Yes ト No
Sintaxe
C++
Membros
AddressType
AddressLength
Address
Um endereço de rede.
Requisitos
Cabeçalho iads.h
Confira também
Estruturas ADSI
Comentários
Esta página foi útil? ツ Yes ト No
Sintaxe
C++
Membros
dwLength
lpValue
Comentários
A estrutura ADS_NT_SECURITY_DESCRIPTOR normalmente é usada como membro da
definição de estrutura ADSVALUE .
Requisitos
Cabeçalho iads.h
Confira também
Estruturas ADSI
Comentários
Esta página foi útil? ツ Yes ト No
Sintaxe
C++
Membros
pszRDN
pszObjectDN
pszParentDN
pszSchemaDN
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
Cabeçalho iads.h
Confira também
Estruturas ADSI
IADs::GetInfo
IDirectoryObject::GetObjectInformation
Comentários
Esta página foi útil? ツ Yes ト No
Sintaxe
C++
Membros
Next
Length
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
Cabeçalho iads.h
Confira também
Estruturas ADSI
Comentários
Esta página foi útil? ツ Yes ト No
Sintaxe
C++
Membros
dwLength
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
Cabeçalho iads.h
Confira também
Estruturas ADSI
Comentários
Esta página foi útil? ツ Yes ト No
Sintaxe
C++
Membros
Type
VolumeName
Path
Comentários
O atributo Path representa um caminho do sistema de arquivos.
Requisitos
Cabeçalho iads.h
Confira também
Estruturas ADSI
Comentários
Esta página foi útil? ツ Yes ト No
Sintaxe
C++
Membros
PostalAddress[6]
Uma matriz de seis cadeias de caracteres Unicode terminadas em nulo que representam
o endereço postal.
Requisitos
Cabeçalho iads.h
Confira também
Estruturas ADSI
Comentários
Esta página foi útil?
ツ Yes ト No
Sintaxe
C++
Membros
dwLength
lpValue
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
Cabeçalho iads.h
Confira também
Estruturas ADSI
ADSVALUE
Comentários
Esta página foi útil? ツ Yes ト No
Sintaxe
C++
Membros
ServerName
ReplicaType
ReplicaNumber
Count
ReplicaAddressHints
Cabeçalho iads.h
Confira também
Estruturas ADSI
Comentários
Esta página foi útil? ツ Yes ト No
Sintaxe
C++
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
pADsValues
dwNumValues
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.
Requisitos
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
Sintaxe
C++
Membros
dwSearchPref
vValue
dwStatus
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.
Requisitos
Cliente mínimo com suporte Windows Vista
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
Sintaxe
C++
Membros
pszAttrType
pszReserved
Reservado.
fReverseorder
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.
Cabeçalho iads.h
Confira também
Estruturas ADSI
Comentários
Esta página foi útil? ツ Yes ト No
Sintaxe
C++
Membros
WholeSeconds
Número de segundos, com valor zero igual a 12:00 AM, janeiro de 1970, UTC.
EventID
Requisitos
Cabeçalho iads.h
Confira também
Estruturas ADSI
Comentários
Esta página foi útil? ツ Yes ト No
Sintaxe
C++
Membros
ObjectName
Level
Interval
Requisitos
Cabeçalho iads.h
Confira também
Estruturas ADSI
Comentários
Esta página foi útil? ツ Yes ト No
Sintaxe
C++
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
CaseExactString
CaseIgnoreString
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
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
ClassName
ProviderSpecific
pCaseIgnoreList
pOctetList
Ponteiro para uma lista de ADS_OCTET_LIST, um tipo de dados definido por ADSI.
pPath
pPostalAddress
Timestamp
BackLink
Hold
Uma estrutura de dados do tipo ADS_HOLD , um tipo de dados definido por ADSI.
pNetAddress
pReplicaPointer
pFaxNumber
SecurityDescriptor
pDNWithBinary
pDNWithString
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
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
Sintaxe
C++
Membros
dwBeforeCount
dwAfterCount
dwOffset
pszTarget
dwContextIDLength
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;
hr = m_pSearch->SetSearchPreference(prefInfo, 2);
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.
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
Cabeçalho iads.h
Confira também
ADS_SEARCHPREF_ENUM
Idirectorysearch
Comentários
Esta página foi útil? ツ Yes ト No
Enumeração Descrição
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
Syntax
C++
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
Cabeçalho iads.h
Confira também
Enumerações ADSI
IADsObjectOptions
IADsPathname::Set
Comentários
Esta página foi útil? ツ Yes ト No
Syntax
C++
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.
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
Cabeçalho iads.h
Confira também
Enumerações ADSI
IADsAccessControlEntry
IADsAccessControlEntry.AceType
Comentários
Esta página foi útil? ツ Yes ト No
Syntax
C++
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.
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.
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.
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.
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.
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).
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.
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
VB
Const ADS_SECURE_AUTHENTICATION = 1
C++
Requisitos
Cabeçalho iads.h
Confira também
Enumerações ADSI
ADsOpenObject
IADsAccessControlEntry
IADsOpenDSObject
Comentários
Esta página foi útil? ツ Yes ト No
Syntax
C++
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.
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
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
Syntax
C++
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
Cabeçalho iads.h
Confira também
Enumerações ADSI
Idirectorysearch
Comentários
Esta página foi útil? ツ Yes ト No
Syntax
C++
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
Cabeçalho iads.h
Confira também
Enumerações ADSI
IADsPathname::SetDisplayType
Comentários
Esta página foi útil? ツ Yes ト No
Syntax
C++
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".
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.
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
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
Syntax
C++
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.
Requisitos
Cabeçalho iads.h
Confira também
Enumerações ADSI
Comentários
Esta página foi útil? ツ Yes ト No
Syntax
C++
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
Cabeçalho iads.h
Confira também
Enumerações ADSI
IADsPathname::Retrieve
Comentários
Esta página foi útil? ツ Yes ト No
Syntax
C++
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.
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
Requisitos
Cabeçalho iads.h
Confira também
Enumerações ADSI
Comentários
Esta página foi útil? ツ Yes ト No
Syntax
C++
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++
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();
}
VB
VB
dn = "CN=jeff smith,CN=Users,DC=Fabrikam,DC=COM"
Requisitos
Cabeçalho iads.h
Confira também
Enumerações ADSI
IADsNameTranslate
Comentários
Esta página foi útil? ツ Yes ト No
Syntax
C++
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
Cabeçalho iads.h
Confira também
Enumerações ADSI
IADsNameTranslate
IADsNameTranslate.Get
IADsNameTranslate.GetEx
IADsNameTranslate.Set
IADsNameTranslate.SetEx
Comentários
Esta página foi útil? ツ Yes ト No
Syntax
C++
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.
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
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
Syntax
C++
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
Cabeçalho iads.h
Confira também
ADS_OPTION_ENUM
IADsObjectOptions::GetOption
IADsObjectOptions::SetOption
Comentários
Esta página foi útil? ツ Yes ト No
Syntax
C++
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
Cabeçalho iads.h
Confira também
Enumerações ADSI
ADS_SD_FORMAT_ENUM
IADsSecurityUtility
Comentários
Esta página foi útil? ツ Yes ト No
Syntax
C++
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
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
Syntax
C++
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.
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
Cabeçalho iads.h
Confira também
Enumerações ADSI
IADs.PutEx
Comentários
Esta página foi útil? ツ Yes ト No
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++
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.
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.
Requisitos
Cliente mínimo com suporte Windows Vista
Cabeçalho iads.h
Confira também
Enumerações ADSI
ADS_ACETYPE_ENUM
Controle de acesso
IADsAccessControlEntry
IADsAccessControlEntry.AccessMask
Comentários
Esta página foi útil? ツ Yes ト No
Syntax
C++
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
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
Syntax
C++
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
Cabeçalho iads.h
Confira também
Enumerações ADSI
Controle de acesso
Comentários
Esta página foi útil? ツ Yes ト No
Syntax
C++
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
Cabeçalho iads.h
Confira também
Enumerações ADSI
ADS_PATHTYPE_ENUM
IADsSecurityDescriptor
IADsSecurityUtility
Comentários
Esta página foi útil? ツ Yes ト No
Syntax
C++
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
Cabeçalho iads.h
Confira também
Enumerações ADSI
Comentários
Esta página foi útil? ツ Yes ト No
Syntax
C++
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.
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.
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.
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.
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.
Valor Descrição
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.
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.
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 .
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;
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--;
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
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
Comentários
Esta página foi útil? ツ Yes ト No
Syntax
C++
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.
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_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
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;
}
Requisitos
Cliente mínimo com suporte Windows Vista
Cabeçalho iads.h
Confira também
Enumerações ADSI
IADsObjectOptions
IADsObjectOptions::GetOption
IADsObjectOptions::SetOption
Comentários
Esta página foi útil? ツ Yes ト No
Syntax
C++
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
Cabeçalho iads.h
Confira também
Enumerações ADSI
IADsPathname::Set
Comentários
Esta página foi útil? ツ Yes ト No
Syntax
C++
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.
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
C++
/***************************************************************************
SetAndCheckSearchTimeout()
***************************************************************************/
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
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
Syntax
C++
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
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;
hr = ADsOpenObject(szPath,
NULL,
NULL,
ADS_SECURE_AUTHENTICATION,
IID_IDirectorySearch,
(void**)&pSchemaNC);
delete [] szPath;
if (SUCCEEDED(hr))
{
wprintf(L"Find non-replicated attributes\n");
pSchemaNC->FreeColumn( &col );
}
}
}
pObject->Release();
}
Requisitos
Cliente mínimo com suporte Windows Vista
Cabeçalho iads.h
Confira também
Enumerações ADSI
Idirectorysearch
Comentários
Esta página foi útil? ツ Yes ト No
Syntax
C++
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
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
Syntax
C++
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
Cabeçalho iads.h
Confira também
Enumerações ADSI
Comentários
Esta página foi útil? ツ Yes ト No
Syntax
C++
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
Cabeçalho iads.h
Confira também
Enumerações ADSI
Comentários
Esta página foi útil? ツ Yes ト No
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
Sintaxe
C++
HRESULT ADsBuildEnumerator(
[in] IADsContainer *pADsContainer,
[out] IEnumVARIANT **ppEnumVariant
);
Parâmetros
[in] pADsContainer
Tipo: IADsContainer*
[out] ppEnumVariant
Tipo: IEnumVARIANT**
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.
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++
if(NULL == pContainer)
{
return E_INVALIDARG;
}
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();
}
ADsFreeEnumerator(pEnum);
}
return hr;
}
Requisitos
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
Sintaxe
C++
HRESULT ADsBuildVarArrayInt(
[in] LPDWORD lpdwObjectTypes,
[in] DWORD dwObjectTypes,
[out] VARIANT *pVar
);
Parâmetros
[in] lpdwObjectTypes
Tipo: LPDWORD
[in] dwObjectTypes
Tipo: DWORD
[out] pVar
Tipo: VARIANT*
Valor retornado
Tipo: HRESULT
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);
Requisitos
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
Sintaxe
C++
HRESULT ADsBuildVarArrayStr(
[in] LPWSTR *lppPathNames,
[in] DWORD dwPathNames,
[out] VARIANT *pVar
);
Parâmetros
[in] lppPathNames
Tipo: LPWSTR*
[in] dwPathNames
Tipo: DWORD
[out] pVar
Tipo: VARIANT*
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++
hr = ADsGetObject(pszADsPath,
IID_IADsContainer,
(void**)&pADsContainer);
if (FAILED(hr)) goto cleanup;
// Create an enumerator.
hr = ADsBuildEnumerator(pADsContainer, &pEnumVar);
if(FAILED(hr)) goto cleanup;
hr = pObject->get_Name(&bstrName);
if(FAILED(hr)) goto cleanup;
printf(" Object name: %S\n",bstrName);
cleanup:
if(bstrName) SysFreeString(bstrName);
if(pEnumvar) ADsFreeEnumerator(pEnumVar);
if(pADsContainer) pADsContainer->Release();
return (hr);
}
Requisitos
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
Sintaxe
C++
HRESULT ADsEncodeBinaryData(
[in] PBYTE pbSrcData,
[in] DWORD dwSrcLen,
[out] LPWSTR *ppszDestData
);
Parâmetros
[in] pbSrcData
Tipo: PBYTE
[in] dwSrcLen
Tipo: DWORD
[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.
Exemplos
C++
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 };
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
Cabeçalho adshlp.h
Biblioteca Activeds.lib
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
Sintaxe
C++
HRESULT ADsEnumerateNext(
[in] IEnumVARIANT *pEnumVariant,
[in] ULONG cElements,
[out] VARIANT *pvar,
[out] ULONG *pcElementsFetched
);
Parâmetros
[in] pEnumVariant
Tipo: IEnumVARIANT*
[in] cElements
Tipo: ULONG
[out] pvar
Tipo: VARIANT*
[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
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:
Requisitos
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
Sintaxe
C++
HRESULT ADsFreeEnumerator(
[in] IEnumVARIANT *pEnumVariant
);
Parâmetros
[in] pEnumVariant
Tipo: IEnumVARIANT*
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.
Requisitos
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
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
[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
[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
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.
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);
}
}
}
C++
An error occurred.
HRESULT: 80071392
Error Code: 8305
Error Text: 00002071: UpdErr: DSID-030502F1, problem 6005
(ENTRY_EXISTS), data 0
Provider: LDAP Provider
Requisitos
Cabeçalho adshlp.h
Biblioteca Activeds.lib
Funções ADSI
ADsSetLastError
Comentários
Esta página foi útil? Yes No
Função ADsGetObject (adshlp.h)
Artigo22/08/2023
Sintaxe
C++
HRESULT ADsGetObject(
[in] LPCWSTR lpszPathName,
[in] REFIID riid,
[out] VOID **ppObject
);
Parâmetros
[in] lpszPathName
Tipo: LPCWSTR
[in] riid
Tipo: REFIID
[out] ppObject
Tipo: VOID**
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
Cabeçalho adshlp.h
Biblioteca Activeds.lib
DLL Activeds.dll
Confira também
Códigos de erro ADSI
Funções ADSI
ADsOpenObject
Comentários
Esta página foi útil? Yes No
Função ADsOpenObject (adshlp.h)
Artigo22/08/2023
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
[in] lpszUserName
Tipo: LPCWSTR
[in] lpszPassword
Tipo: LPCWSTR
[in] dwReserved
Tipo: DWORD
[in] riid
Tipo: REFIID
[out] ppObject
Tipo: VOID**
Valor retornado
Tipo: HRESULT
Esse método dá suporte aos valores de retorno HRESULT padrão, incluindo o seguinte.
Comentários
Essa função não deve ser usada apenas para validar as credenciais do usuário.
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:
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.
C++
IADs *pObject;
LPWSTR szUsername = NULL;
LPWSTR szPassword = NULL
HRESULT hr;
hr = ADsOpenObject(L"LDAP://CN=Jeff,DC=Fabrikam,DC=com",
"jeffsmith",
"etercespot",
ADS_SECURE_AUTHENTICATION,
IID_IADs,
(void**) &pObject);
Requisitos
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
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
[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);
}
C++
C++
Requisitos
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
Sintaxe
C++
LPVOID AllocADsMem(
[in] DWORD cb
);
Parâmetros
[in] cb
Tipo: DWORD
Valor retornado
Tipo: LPVOID
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
Cabeçalho adshlp.h
Biblioteca Activeds.lib
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
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
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
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
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
[out] pVarsec
Tipo: VARIANT*
[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
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
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
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
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
Cabeçalho adshlp.h
Biblioteca Activeds.lib
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
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
Cabeçalho adshlp.h
Biblioteca Activeds.lib
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
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
[in] cbNew
Tipo: DWORD
Valor retornado
Tipo: LPVOID
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++
/*
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 "LDAP://DC=fabrikam,DC=com"
wprintf(L"path = %s\n", pwszADsPath);
}
else
{
wprintf(L"Unable to allocate additional memory.");
}
Requisitos
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
Sintaxe
C++
BOOL ReallocADsStr(
[out] LPWSTR *ppStr,
[in] LPWSTR pStr
);
Parâmetros
[out] ppStr
Tipo: LPWSTR*
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
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
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
[out] ppSecurityDescriptor
Tipo: PSECURITY_DESCRIPTOR*
[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
[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
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
Interface Categoria/descrição
Iads Núcleo
IADsAccessControlEntry Segurança
IADsAccessControlList Segurança
IADsADSystemInfo Utilitário
IADsAggregatee Obsoleto
IADsAggregator Obsoleto
IADsClass Esquema
IADsContainer Núcleo
IADsDeleteOps Utilitário
IADsExtension Extensão
IADsNamespaces Núcleo
IADsNameTranslate Utilitário
IADsObjectOptions Utilitário
IADsOpenDSObject Núcleo
IADsPathName Utilitário
IADsProperty Esquema
IADsSecurityDescriptor Segurança
IADsSyntax Esquema
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
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 .
C++
IADs *pADs;
BSTR bstrName;
pADs->get_Name(&bstrName);
VB
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
Comentários
Esta página foi útil? ツ Yes ト No
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.
Comentários
Esta página foi útil? ツ Yes ト No
A ilustração a seguir mostra objetos ADSI usados para o provedor LDAP e interfaces
usadas para acessar esses objetos.
Objeto Interface
Organização IADsO
OrganizationalUnit IADsOU
Groupcollection IADsMembers
Agrupar IADsGroup
Usercollection IADsMembers
Usuário Iadsuser
Localidade IADsLocality
NameTranslate IADsNameTranslate
Comentários
Esta página foi útil? ツ Yes ト No
IADS
IADSContainer
IADSNamespaces
IADSOpenDSObject
Comentários
Esta página foi útil? ツ Yes ト No
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
IADs::GetEx
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
IADs::P ut
IADs::P utEx
IADs::SetInfo
Requisitos
Cabeçalho iads.h
Comentários
Esta página foi útil? Yes No
Métodos de propriedade IADs
Artigo • 12/06/2023
Propriedades
Adspath
syntax
Classe
syntax
GUID
syntax
Nome
syntax
Pai
syntax
Esquema
syntax
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.
7 Observação
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
Set x = GetObject("WinNT://Fabrikam/Administrator")
Debug.Print "Object Name: " & x.Name
Debug.Print "Object Path: " & x.ADsPath
Debug.Print "Object Class: " & x.Class
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>"
</body>
</html>
C++
#include <stdio.h>
#include <activeds.h>
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; }
pADsUser->Release();
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
Cabeçalho Iads.h
DLL Activeds.dll
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
Sintaxe
C++
HRESULT Get(
[in] BSTR bstrName,
[out] VARIANT *pvProp
);
Parâmetros
[in] bstrName
[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.
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
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")
Exit Sub
ErrTest:
Debug.Print Hex(Err.Number)
Set x = Nothing
Set Desc = Nothing
VB
Exit Sub
Cleanup:
MsgBox("An error has occurred. " & Err.Number)
Set oTarget = Nothing
VB
<HTML>
<head><title></title></head>
<body>
<%
Dim x
</body>
</html>
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;
VariantClear(&var);
}
// Cleanup.
if ( pSvc )
{
pSvc->Release();
}
Requisitos
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
Sintaxe
C++
HRESULT GetEx(
[in] BSTR bstrName,
[out] VARIANT *pvProp
);
Parâmetros
[in] bstrName
[out] pvProp
Valor retornado
Esse método dá suporte aos valores retornados padrão, bem como aos valores
retornados listados na lista a seguir.
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.
VB C++
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
Exemplos
VB
Dim x As IADs
On Error GoTo ErrTest:
Set x = GetObject("LDAP://CN=Administrator,CN=Users,DC=Fabrikam,DC=com")
ErrTest:
Debug.Print Hex(Err.Number)
Set x = Nothing
VB
<HTML>
<head><title></title></head>
<body>
<%
Dim x
</body>
</html>
O exemplo de código a seguir recupera os valores de propriedade "homePhone"
usando IADs::GetEx.
C++
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;
VariantClear(&var);
}
// Cleanup.
if ( pADs )
{
pADs->Release();
}
Requisitos
Cabeçalho iads.h
DLL Activeds.dll
Confira também
Iads
IADs::Get
IADs::GetInfo
IADs::P ut
IADs::P utEx
Comentários
Esta página foi útil? Yes No
Método IADs::GetInfo (iads.h)
Artigo24/08/2023
Sintaxe
C++
HRESULT GetInfo();
Valor retornado
Esse método dá suporte aos valores retornados padrão, bem como aos seguintes.
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.
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.
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'.
Exemplos
VB
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set pList = Nothing
Set pEntry = Nothing
Set pValue = Nothing
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>
<script language="vbscript">
Dim pList
sub showGetInfo()
Set oFac = CreateObject("ADsFactory")
path = "WinNT://Fabrikam"
ADS_SECURE_AUTH = 1
On Error Resume Next
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);
hr = pList->QueryInterface(IID_IADs, (void**)&pADs);
// 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.
hr = pADs->Get(CComBSTR("Owner"), &var);
printf(" owner = %S\n", V_BSTR(&var)); // Owner = JeffSmith
VariantClear(&var);
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
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
Sintaxe
C++
HRESULT GetInfoEx(
[in] VARIANT vProperties,
[in] long lnReserved
);
Parâmetros
[in] vProperties
[in] lnReserved
Valor retornado
Esse método dá suporte aos valores retornados padrão, bem como aos seguintes.
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.
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")
' 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++
if(!(hr==S_OK)){return hr;}
VariantInit(&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
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
Sintaxe
C++
HRESULT Put(
[in] BSTR bstrName,
[in] VARIANT vProp
);
Parâmetros
[in] bstrName
[in] vProp
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
Cleanup:
If(Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set x = Nothing
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);
CoUninitialize();
Requisitos
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
Sintaxe
C++
HRESULT PutEx(
[in] long lnControlCode,
[in] BSTR bstrName,
[in] VARIANT vProp
);
Parâmetros
[in] lnControlCode
[in] bstrName
[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.
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 .
Exemplos
O exemplo de código a seguir mostra como usar o método IADs.PutEx .
VB
Dim x As IADs
Set x = GetObject("LDAP://CN=JeffSmith,CN=Users,DC=Fabrikam,DC=com")
'----------------------------------------------------------
' Assume the otherHomePhone has the values
' 425-707-9790, 425-707-9791
'----------------------------------------------------------
Cleanup:
If(Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set x = Nothing
C++
HRESULT hr;
IADs *pADs=NULL;
LPWSTR pszADsPath = L"LDAP://CN=JeffSmith,CN=Users,DC=Fabrikam,DC=com";
CoInitialize(NULL);
if(SUCCEEDED(hr))
{
VARIANT var;
VariantInit(&var);
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
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
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 .
VB
Dim obj as IADs
obj.Put(prop1,val1)
obj.Put(prop2.val2)
obj.Put(prop3.val3)
obj.SetInfo
VB
obj.Put(prop1,val1)
obj.SetInfo
obj.Put(prop2.val2)
obj.SetInfo
obj.Put(prop3.val3)
obj.SetInfo
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
C++
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"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);
if(pADs)
pADs->Release();
Requisitos
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
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
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
IADsContainer::get__NewEnum
Recupera um objeto enumerador para o contêiner.
IADsContainer::GetObject
IADsContainer::MoveHere
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
VB
VB
Exemplos
VB
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set obj = Nothing
Set cls = Nothing
C++
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
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
Propriedades
Count
syntax
Filter
syntax
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.
syntax
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
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set cont = Nothing
Set usr = Nothing
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;}
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);
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
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
IADsContainer
Idirectorysearch
Comentários
Esta página foi útil? ツ Yes ト No
Sintaxe
C++
HRESULT CopyHere(
[in] BSTR SourceName,
[in] BSTR NewName,
[out] IDispatch **ppObject
);
Parâmetros
[in] SourceName
[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
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.
Requisitos
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
Sintaxe
C++
HRESULT Create(
[in] BSTR ClassName,
[in] BSTR RelativeName,
[out] IDispatch **ppObject
);
Parâmetros
[in] ClassName
[in] RelativeName
[out] ppObject
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
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
Sintaxe
C++
HRESULT Delete(
[in] BSTR bstrClassName,
[in] BSTR bstrRelativeName
);
Parâmetros
[in] bstrClassName
[in] bstrRelativeName
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.
Exemplos
VB
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set cont = Nothing
VB
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set cont = Nothing
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
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
Sintaxe
C++
HRESULT get__NewEnum(
[out] IUnknown **retval
);
Parâmetros
[out] retval
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".
VB
Cleanup:
If(Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set cont = Nothing
C++
// 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
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
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
[out] ppObject
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".
Exemplos
VB
Isso é equivalente a:
VB
C++
HRESULT hr = S_OK;
CoInitialize(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;
}
Cleanup:
if(pCont)
pCont->Release();
if(pDisp)
pDisp->Release();
if(pADs)
pADs->Release();
CoUninitialize();
Requisitos
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
Sintaxe
C++
HRESULT MoveHere(
[in] BSTR SourceName,
[in] BSTR NewName,
[out] IDispatch **ppObject
);
Parâmetros
[in] SourceName
[in] NewName
[out] ppObject
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:
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.
VB
VB
VB
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
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set cont = Nothing
Set usr = Nothing
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
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
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);
Herança
A interface IADsNamespaces herda da interface IADs.
Requisitos
Cliente mínimo com suporte Windows Vista
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
Propriedades
DefaultContainer
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.
syntax
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
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
IADsContainer.GetObject
IADsNamespaces
Comentários
Esta página foi útil? ツ Yes ト No
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
Requisitos
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
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
[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
[out] ppOleDsObj
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.
Comentários
Esse método não deve ser usado apenas para validar as credenciais do usuário.
VB
Dim dso As IADsOpenDSObject
Dim obj1, obj2 As IADs
Dim szUsername As String
Dim szPassword As String
MsgBox obj2.Class
VB
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.
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
' Insert code to securely retrieve the user name and password.
Cleanup:
If (Err.Number <> 0 ) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set dso = Nothing
Set domain = Nothing
C++
Requisitos
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
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.
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
VB
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set obj = Nothing
Set cls = Nothing
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; }
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;
C++
Requisitos
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
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.
syntax
AuxDerivedFrom
Matriz de cadeias de caracteres ADsPath que indicam as classes super auxiliares das
quais essa classe deriva.
syntax
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.
syntax
CLSID
CLSID opcional específico do provedor que identifica o objeto COM que implementa
essa classe.
syntax
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
syntax
Contenção
Uma matriz BSTR na qual cada elemento é o nome de uma classe de objeto que essa
classe pode conter.
syntax
DerivedFrom
Matriz de cadeias de caracteres ADsPath que indicam de quais classes essa classe foi
derivada.
syntax
HelpFileContext
syntax
HelpFileName
Nome de um arquivo de ajuda que contém mais informações sobre objetos dessa
classe.
syntax
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.
syntax
NamingProperties
SAFEARRAY de BSTRs que lista as propriedades usadas para nomear atributos dessa
classe de esquema.
syntax
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.
syntax
OptionalProperties
syntax
PossibleSuperiors
syntax
PrimaryInterface
syntax
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
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;}
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
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
IADsClass
IADsClass::Qualifiers
Comentários
Esta página foi útil? ツ Yes ト No
Sintaxe
C++
HRESULT Qualifiers(
[out] IADsCollection **ppQualifiers
);
Parâmetros
[out] ppQualifiers
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
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set ads = Nothing
Set cls = Nothing
Requisitos
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.
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
' 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
Cleanup:
If (Err.Number <> 0 ) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Requisitos
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
Propriedades
MaxRange
syntax
MinRange
syntax
syntax
OID
syntax
Sintaxe
syntax
Exemplos
O exemplo de código a seguir examina o atributo OperatingSystem de um computador
em uma rede por meio do provedor WinNT.
VB
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
C++
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 = 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
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
IADsClass
IADsProperty
IADsSyntax
Comentários
Esta página foi útil? ツ Yes ト No
Sintaxe
C++
HRESULT Qualifiers(
[out] IADsCollection **ppQualifiers
);
Parâmetros
[out] ppQualifiers
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
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
Herança
A interface IADsSyntax herda de IDispatch e IADs. A IADsSyntax também tem estes
tipos de membros:
Requisitos
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
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.
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
syntax
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
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
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);
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);
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
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
IADsClass
IADsProperty
IADsSyntax
Comentários
Esta página foi útil? ツ Yes ト No
IADsPropertyEntry
IADsPropertyList
IADsPropertyValue
IADsPropertyValue2
Comentários
Esta página foi útil? ツ Yes ト No
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 .
Herança
A interface IADsPropertyEntry herda da interface IDispatch.
Requisitos
Cabeçalho iads.h
Confira também
IADs::GetInfo
IADs::GetInfoEx
IADs::SetInfo
IADsPropertyList
IADsPropertyList::GetPropertyItem
IADsPropertyList::Item
IDispatch
Comentários
Esta página foi útil? Yes No
Métodos da propriedade
IADsPropertyEntry
Artigo • 13/06/2023
Propriedades
ADsType
syntax
ControlCode
syntax
Nome
syntax
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 .
syntax
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
'------------------------------------------------------------
'----- Getting IADsPropertyEntry ----------------------------
'------------------------------------------------------------
'------------------------------------------------------------
'---- Setting IADsPropertyEntry -----------------------------
'------------------------------------------------------------
' ---- Put the newly created property entry to the cache ----
propList.PutPropertyItem (propEntry)
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set propList = Nothing
Set propEntry = Nothing
Set propVal = Nothing
C++
#include <activeds.h>
#include <stdio.h>
VariantInit(&var);
Cleanup:
if(nm)
SysFreeString(nm);
if(pList)
pList->Release();
if(pEntry)
pEntry->Release();
if(pObj)
pObj->Release();
VariantClear(&var);
Requisitos
Requisito Valor
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
ADS_PROPERTY_OPERATION_ENUM
ADSTYPEENUM
IADsPropertyEntry
IADsPropertyValue
IADsPropertyValue2
IDispatch
Comentários
Esta página foi útil? ツ Yes ト No
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
IADsPropertyList::Item
IADsPropertyList::P urgePropertyList
IADsPropertyList::P utPropertyItem
IADsPropertyList::Reset
IADsPropertyList::ResetPropertyItem
IADsPropertyList::Skip
Requisitos
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
Propriedades
PropertyCount
syntax
Exemplos
O exemplo de código a seguir mostra como determinar o número de itens em uma lista
de propriedades.
VB
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
O exemplo de código a seguir mostra como determinar o número de itens em uma lista
de propriedades.
C++
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();
if(SUCCEEDED(hr))
{
return count;
}
else
{
return -1;
}
Requisitos
Requisito Valor
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
IADsPropertyList
Comentários
Esta página foi útil? ツ Yes ト No
Sintaxe
C++
HRESULT GetPropertyItem(
[in] BSTR bstrName,
[in] LONG lnADsType,
[in, out] VARIANT *pVariant
);
Parâmetros
[in] bstrName
[in] lnADsType
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.
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
VB
Const ADSTYPE_CASE_IGNORE_STRING = 3
Dim propList As IADsPropertyList
Dim propEntry As IADsPropertyEntry
Dim propVal As IADsPropertyValue
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;
}
///////////////////////////////////////////////////////
// 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
Cabeçalho iads.h
DLL Activeds.dll
Confira também
Códigos de erro ADSI
ADSTYPEENUM
IADsPropertyList
IDispatch
Variantclear
Comentários
Esta página foi útil? Yes No
Método IADsPropertyList::Item (iads.h)
Artigo24/08/2023
Sintaxe
C++
HRESULT Item(
[in] VARIANT varIndex,
[in, out] VARIANT *pVariant
);
Parâmetros
[in] varIndex
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
propList.GetInfo
count = propList.PropertyCount
Debug.Print "No of Property Found: " & count
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
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);
///////////////////////////////////////
// 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
Cabeçalho iads.h
DLL Activeds.dll
Confira também
Códigos de erro ADSI
IADsPropertyEntry
IADsPropertyList
IDispatch
Comentários
Esta página foi útil? Yes No
Método IADsPropertyList::Next (iads.h)
Artigo24/08/2023
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
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
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
Cabeçalho iads.h
DLL Activeds.dll
Confira também
Códigos de erro ADSI
IADsPropertyEntry
IADsPropertyList
IDispatch
Comentários
Esta página foi útil? Yes No
Método IADsPropertyList::P
urgePropertyList (iads.h)
Artigo24/08/2023
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
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
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
Cabeçalho iads.h
DLL Activeds.dll
Confira também
Códigos de erro ADSI
IADsPropertyList
IADsPropertyList::GetPropertyItem
Comentários
Esta página foi útil? Yes No
Método IADsPropertyList::P
utPropertyItem (iads.h)
Artigo24/08/2023
Sintaxe
C++
HRESULT PutPropertyItem(
[in] VARIANT varData
);
Parâmetros
[in] varData
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
Cleanup:
If(Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
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;
}
hr = pVal->put_ADsType(ADSTYPE_CASE_IGNORE_STRING);
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;
}
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);
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;
}
return(ResultFromScode(S_OK));
Fail:
if (psa) {
SafeArrayDestroy(psa);
}
return(E_FAIL);
}
Requisitos
Cliente mínimo com suporte Windows Vista
Cabeçalho iads.h
DLL Activeds.dll
Confira também
Códigos de erro ADSI
IADs::SetInfo
IADsPropertyList
IDispatch
Comentários
Esta página foi útil? Yes No
Método IADsPropertyList::Reset (iads.h)
Artigo24/08/2023
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
Cabeçalho iads.h
DLL Activeds.dll
Confira também
Códigos de erro ADSI
IADsPropertyList
IADsPropertyList::Next
Comentários
Esta página foi útil? Yes No
Método
IADsPropertyList::ResetPropertyItem
(iads.h)
Artigo24/08/2023
Sintaxe
C++
HRESULT ResetPropertyItem(
[in] VARIANT varEntry
);
Parâmetros
[in] varEntry
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
' 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"
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);
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);
}
ResetItem(pList, L"Owner");
hr = pList->get_PropertyCount(&count);
if(SUCCEEDED(hr))
{
printf(" Count after item reset : %d\n",count);
}
pEntry->Release();
pList->Release();
}
Requisitos
Cabeçalho iads.h
DLL Activeds.dll
Confira também
Códigos de erro ADSI
IADsPropertyList
IADsPropertyList::Item
IADsPropertyList::Next
Comentários
Esta página foi útil? Yes No
Método IADsPropertyList::Skip (iads.h)
Artigo24/08/2023
Sintaxe
C++
HRESULT Skip(
[in] long cElements
);
Parâmetros
[in] cElements
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
Cabeçalho iads.h
DLL Activeds.dll
Confira também
Códigos de erro ADSI
IADsPropertyList
IADsPropertyList::Next
Comentários
Esta página foi útil? Yes No
Interface IADsPropertyValue (iads.h)
Artigo14/03/2023
Ao obter valores em um formato não fornecido por uma das propriedades dessa
interface, use a interface IADsPropertyValue2 .
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
Requisitos
Cabeçalho iads.h
Confira também
IADs::GetInfo
IADs::GetInfoEx
IADs::SetInfo
IADsPropertyEntry
IADsPropertyValue2
IDispatch
Comentários
Esta página foi útil? Yes No
Métodos da propriedade
IADsPropertyValue
Artigo • 13/06/2023
Propriedades
ADsType
syntax
Booliano
$True.
syntax
CaseExactString
syntax
CaseIgnoreString
syntax
DNString
Inteiro
Valor inteiro.
syntax
LargeInteger
syntax
NumericString
Texto a ser interpretado. Tipo numérico.
syntax
OctetString
syntax
PrintableString
syntax
SecurityDescriptor
syntax
UTCTime
Uma data do tipo VT_DATE expresso no formato UTC (Tempo Universal Coordenado).
syntax
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.
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
' 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)
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
C++
#include <activeds.h>
#include <stdio.h>
VariantInit(&var);
VariantInit(&varItem);
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();
hr = V_DISPATCH(&var)->QueryInterface(IID_IADsPropertyEntry,
(void**)&pEntry);
VariantClear(&var);
if(FAILED(hr)){goto Cleanup;}
// 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
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
IADsPropertyValue
ADSTYPEENUM
IADsPropertyEntry
IADsPropertyList
IADsPropertyValue2
IADsSecurityDescriptor
IDispatch
Comentários
Esta página foi útil? ツ Yes ト No
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
VB
' 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)
propList.SetInfo
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
C++
#include <activeds.h>
#include <stdio.h>
VariantInit(&var);
VariantInit(&varItem);
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 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
Cabeçalho iads.h
DLL Activeds.dll
Confira também
Códigos de erro ADSI
IADsPropertyValue
Comentários
Esta página foi útil? Yes No
Interface IADsPropertyValue2 (iads.h)
Artigo14/03/2023
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
IADsPropertyValue2::P utObjectProperty
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_UTC_TIME VT_DATE
Requisitos
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
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.
[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
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
Sintaxe
C++
HRESULT PutObjectProperty(
[in] long lnADsType,
[in] VARIANT vProp
);
Parâmetros
[in] lnADsType
[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
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
IADsCollection
IADsComputer
IADsDomain
IADsFileService
IADsFileShare
IADsGroup
IADsLocality
IADsMembers
IADsO
IADsOU
IADsPrintjob
IADsPrintQueue
IADsService
Iadsuser
Comentários
Esta página foi útil? ツ Yes ト No
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.
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
IADsCollection::get__NewEnum
IADsCollection::GetObject
IADsCollection::Remove
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
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
Sintaxe
C++
HRESULT Add(
[in] BSTR bstrName,
[in] VARIANT vItem
);
Parâmetros
[in] bstrName
[in] vItem
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
Cabeçalho iads.h
DLL Activeds.dll
Confira também
Códigos de erro 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
Sintaxe
C++
HRESULT get__NewEnum(
[out] IUnknown **ppEnumerator
);
Parâmetros
[out] ppEnumerator
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:
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
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred... " & Err.Number)
End If
Set fso = Nothing
C++
HRESULT GetACollectionOfSessions()
{
LPWSTR adspath = L"WinNT://myComputer/LanmanServer";
HRESULT hr = S_OK;
IADsCollection *pColl = NULL;
hr = EnumCollection(pColl);
Cleanup:
if(pColl) pColl->Release();
if(pFso) pFso->Release();
return hr;
}
IEnumVARIANT *pEnum;
hr = pUnk->QueryInterface(IID_IEnumVARIANT,(void**)&pEnum);
if(FAILED(hr)) {goto Cleanup;}
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
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
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 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
C++
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
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
Sintaxe
C++
HRESULT Remove(
[in] BSTR bstrItemToBeRemoved
);
Parâmetros
[in] bstrItemToBeRemoved
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
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set fso = Nothing
Set ses = Nothing
Set coll = Nothing
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
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.
Herança
A interface IADsComputer herda de IDispatch e IADs. IADsComputer também tem estes
tipos de membros:
Requisitos
Cabeçalho iads.h
Confira também
Iads
IDispatch
Comentários
Esta página foi útil? Yes No
Métodos da propriedade IADsComputer
Artigo • 13/06/2023
Propriedades
ComputerID
syntax
Departamento
syntax
Descrição
syntax
Divisão
syntax
Localidade
syntax
syntax
Modelo
syntax
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.
syntax
OperatingSystem
syntax
OperatingSystemVersion
syntax
Proprietário
A pessoa à qual este computador é atribuído. Essa pessoa também deve ter uma licença
para executar o software instalado.
syntax
PrimaryUser
syntax
Processador
O tipo de processador.
syntax
ProcessorCount
syntax
Função
syntax
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.
syntax
StorageCapacity
syntax
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.
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
C++
hr = ADsGetObject(adspath,IID_IADsComputer,(void**)&pComp);
if(FAILED(hr)) {goto Cleanup;}
hr = pComp->get_Owner(&bstr);
if(FAILED(hr)) {goto Cleanup;}
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
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
IADsComputer
IADsClass
IADsComputerOperations
Comentários
Esta página foi útil? ツ Yes ト No
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
Cabeçalho iads.h
Confira também
Iads
IDispatch
Comentários
Esta página foi útil? Yes No
Métodos de propriedade IADsDomain
Artigo • 03/06/2023
Propriedades
AutoUnlockInterval
Indica o tempo mínimo que deve ser decorrido antes que a conta seja reencável
automaticamente.
syntax
IsWorkgroup
syntax
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.
syntax
MaxBadPasswordsAllowed
syntax
MaxPasswordAge
Indica o intervalo de tempo máximo, em segundos, após o qual a senha deve ser
alterada pelo usuário.
syntax
MinPasswordAge
Indica o intervalo de tempo mínimo, em segundos, antes que a senha possa ser
alterada.
syntax
MinPasswordLength
Indica o número mínimo de caracteres que devem ser usados para uma senha.
syntax
Indica restrições em senhas, conforme definido pela lista a seguir de atributos e valores.
7 Observação
PASSWORD_ATTR_NONE (0x00000000)
PASSWORD_ATTR_MIXED_CASE (0x00000001)
PASSWORD_ATTR_COMPLEX (0x00000002)
syntax
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.
syntax
VB
C++
hr = pDomain->get_PasswordHistoryLength(&nPasswordHistoryLength);
if(FAILED(hr)) {goto Cleanup;}
printf("Password history length: %d",nPasswordHistoryLength);
Cleanup:
if(pDomain) pDomain->Release();
Requisitos
Requisito Valor
Cabeçalho Iads.h
DLL Activeds.dll
Comentários
Esta página foi útil? ツ Yes ト No
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.
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
Cabeçalho iads.h
Confira também
Iads
IADsService
IADsServiceOperations
IDispatch
Comentários
Esta página foi útil? Yes No
Métodos da propriedade
IADsFileService
Artigo • 12/06/2023
Propriedades
Descrição
syntax
MaxUserCount
syntax
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
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 = 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
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
IADsService
IADsFileService
IADsFileServiceOperations
IADsServiceOperations
Métodos de propriedade interface
Comentários
Esta página foi útil? ツ Yes ト No
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.
Exemplos
VB
Dim fs as IADsFileService
Dim share As IADsFileShare
On Error GoTo Cleanup
Set fs = GetObject("WinNT://aComputer/LanmanServer")
VB
Dim fs as IADsFileShare
On Error Resume Next
Set fs = GetObject("WinNT://aComputer/LanmanServer/_file_share_name_")
Requisitos
Cabeçalho iads.h
Confira também
Iads
IDispatch
Comentários
Esta página foi útil? Yes No
Métodos da propriedade IADsFileShare
Artigo • 12/06/2023
Propriedades
CurrentUserCount
syntax
Descrição
syntax
HostComputer
syntax
MaxUserCount
syntax
Caminho
syntax
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
VB
Dim fs As IADsFileShare
Dim cont As IADsContainer
On Error GoTo Cleanup
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set cont = Nothing
Set fs = Nothing
C++
hr = ADsGetObject(adsPath, IID_IADsContainer,(void**)&pCont);
if(FAILED(hr)) {goto Cleanup;}
hr = pCont->Create(CComBSTR("FileShare"), CComBSTR("Public"),
(IDispatch**)&pShare);
hr = pShare->put_Path(CComBSTR("c:\\public"));
hr = pShare->SetInfo();
Cleanup:
if(pCont) pCont->Release();
if(pShare) pShare->Release();
Requisitos
Requisito Valor
Cabeçalho Iads.h
DLL Activeds.dll
IADsFileShare
Comentários
Esta página foi útil? ツ Yes ト No
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
IADsGroup::IsMember
IADsGroup::Members
IADsGroup::Remove
Requisitos
Cabeçalho iads.h
Confira também
Iads
IDispatch
Comentários
Esta página foi útil? Yes No
Métodos de propriedade IADsGroup
Artigo • 12/06/2023
Propriedades
Descrição
syntax
Comentários
Exemplos
O exemplo do Visual Basic a seguir mostra como associar a um objeto de grupo e exibir
a descrição do grupo.
VB
Cleanup
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set grp = Nothing
C++
hr = ADsGetObject(adsPath,IID_IADsGroup,(void**)&pGroup);
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
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
Iads
IADsGroup
Comentários
Esta página foi útil? ツ Yes ト No
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
VB
VB
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set grp = Nothing
C++
hr = pGroup->Add(_bstr_t("WinNT://Fabrikam/jeff"));
if(FAILED(hr)){goto Cleanup;}
Cleanup:
if(pGroup)
pGroup->Release();
return hr;
Requisitos
Cabeçalho iads.h
DLL Activeds.dll
Confira também
Códigos de erro ADSI
IADsMembers
Comentários
Esta página foi útil? Yes No
Método IADsGroup::IsMember (iads.h)
Artigo24/08/2023
Sintaxe
C++
HRESULT IsMember(
BSTR bstrMember,
[out] VARIANT_BOOL *bMember
);
Parâmetros
bstrMember
[out] bMember
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.
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
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set grp = Nothing
C++
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
Cabeçalho iads.h
DLL Activeds.dll
Confira também
Códigos de erro ADSI
IADsGroup
IADsMembers
Comentários
Esta página foi útil? Yes No
Método IADsGroup::Members (iads.h)
Artigo24/08/2023
Sintaxe
C++
HRESULT Members(
[out] IADsMembers **ppMembers
);
Parâmetros
[out] ppMembers
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
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set grp = Nothing
Set member = Nothing
Set memberList = Nothing
C++
Cleanup:
if(pMembers)
pMembers->Release();
return hr;
}
Requisitos
Cabeçalho iads.h
DLL Activeds.dll
Confira também
Códigos de erro ADSI
IADsGroup
IADsMembers
Comentários
Esta página foi útil? Yes No
Método IADsGroup::Remove (iads.h)
Artigo24/08/2023
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
é equivalente a
VB
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
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set grp = Nothing
C++
hr = pGroup->Remove(CComBSTR(usrPath));
if(FAILED(hr)){goto Cleanup;}
Cleanup:
if(pGroup)
pGroup->Release();
Requisitos
Cabeçalho iads.h
DLL Activeds.dll
Confira também
Códigos de erro ADSI
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.
Herança
A interface IADsLocality herda de IDispatch e IADs. IADsLocality também tem estes
tipos de membros:
Requisitos
Cabeçalho iads.h
Confira também
Iads
IADsO
IADSOU
IDispatch
Comentários
Esta página foi útil? Yes No
Métodos de propriedade IADsLocality
Artigo • 13/06/2023
Propriedades
Descrição
syntax
LocalityName
syntax
syntax
SeeAlso
Indica uma matriz de nomes ADsPath de objetos de diretório relevantes para esse
objeto.
syntax
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
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set dom = Nothing
Set loc = Nothing
Requisitos
Requisito Valor
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
Iads
IADsLocality
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.
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
Requisitos
Cabeçalho iads.h
Confira também
IADsCollection
IADsContainer
IADsGroup::get_Members
IDispatch
Comentários
Esta página foi útil? Yes No
Métodos de propriedade IADsMembers
Artigo • 12/06/2023
Propriedades
Count
syntax
Filter
Indica o filtro. A sintaxe das entradas na matriz de filtro é a mesma que o Filtro usado na
interface IADsContainer .
syntax
Exemplos
O exemplo de código a seguir mostra como usar os métodos de propriedade dessa
interface.
VB
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set grp = Nothing
C++
IADsGroup *pGroup;
HRESULT hr = S_OK;
IADsMembers *pMembers;
hr = pGroup->Members(&pMembers);
if(FAILED(hr)){goto Cleanup;}
hr = pGroup->Release();
Cleanup:
if(pGroup) pGroup->Release();
if(pMembers) pMembers->Release();
return hr;
Requisitos
Requisito Valor
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
IADsContainer
IADsMembers::get__NewEnum
IADsMembers
Comentários
Esta página foi útil? ツ Yes ト No
Sintaxe
C++
HRESULT get__NewEnum(
[out] IUnknown **ppEnumerator
);
Parâmetros
[out] ppEnumerator
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
Cabeçalho iads.h
DLL Activeds.dll
Confira também
Códigos de erro ADSI
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.
Herança
A interface IADsO herda de IDispatch e IADs. A IADsO também tem esses tipos de
membros:
Requisitos
Cabeçalho iads.h
Confira também
Iads
IADsContainer
IADsLocality
IDispatch
Comentários
Esta página foi útil? Yes No
Métodos de propriedade IADsO
Artigo • 03/06/2023
Propriedades
Descrição
A descrição da organização.
syntax
FaxNumber
syntax
syntax
PostalAddress
syntax
SeeAlso
Uma matriz de nomes do ADsPath de outros objetos ADSI que podem ser relevantes
para esse objeto.
syntax
Telephonenumber
syntax
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
' Insert code to securely retrieve the user name and password
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Requisitos
Requisito Valor
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
IADsO
Comentários
Esta página foi útil? ツ Yes ト No
Herança
A interface IADsOU herda da interface IADs.
Requisitos
Cabeçalho iads.h
Confira também
Iads
IADsContainer
IADsLocality
IADsO
IDispatch
Comentários
Esta página foi útil? Yes No
Métodos de propriedade IADSOU
Artigo • 13/06/2023
Propriedades
BusinessCategory
syntax
Descrição
Uma cadeia de caracteres que contém uma descrição textual da unidade organizacional.
syntax
syntax
LocalityName
syntax
PostalAddress
syntax
SeeAlso
syntax
TelephoneNumber
syntax
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
' Filter out all objects that are not of class "organizationalUnit".
dom.filter = Array("organizationalUnit")
Requisitos
Requisito Valor
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
IADSOU
Comentários
Esta página foi útil? ツ Yes ト No
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.
Exemplos
VB
Dim pq As IADsPrintQueue
Dim pqo As IADsPrintQueueOperations
Dim pj As IADsPrintJob
Dim pjo As IADsPrintJobOperations
Dim pjs As IADsCollection
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
C++
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
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
Propriedades
Descrição
syntax
HostPrintQueue
syntax
Notificar
O usuário a ser notificado quando o trabalho for concluído.
syntax
NotifyPath
syntax
Prioridade
syntax
Tamanho
syntax
StartTime
syntax
TimeSubmitted
syntax
// C++ method syntax
HRESULT get_TimeSubmitted(
[out] DATE* pdateTimeSubmitted
);
Totalpages
syntax
UntilTime
syntax
Usuário
syntax
UserPath
syntax
Exemplos
O exemplo de código a seguir mostra como trabalhar com propriedades de um objeto
de trabalho de impressão.
VB
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set pqo = Nothing
Set pj = Nothing
VariantInit(&var);
hr = ADsGetObject(adsPath,
IID_IADsPrintQueueOperations,
(void**)&pqo);
if(FAILED(hr)){goto Cleanup;}
hr = pqo->PrintJobs(&pColl);
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
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
IADsPrintJob
Comentários
Esta página foi útil? ツ Yes ト No
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 .
VB
Dim pq as IADsPrintQueue
Set pq = GetObject("WinNT://aMachine/aPrinter")
C++
IADsPrintQueue *pq;
LPWSTR adsPath = L"WinNT://aMachine/aPrinter";
HRESULT hr = ADsGetObject(adsPath,
IID_IADsPrintQueue,
(void**)&pq);
Exemplos
O exemplo de código a seguir enumera impressoras em um determinado computador.
VB
cont.Filter = Array("PrintQueue")
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set cont = Nothing
Set pq = Nothing
Requisitos
Cabeçalho iads.h
Confira também
Iads
IADsPrintQueueOperations
IADsPrintQueueOperations::P rintJobs
IDispatch
Comentários
Esta página foi útil? Yes No
Métodos de propriedade
IADsPrintQueue
Artigo • 03/06/2023
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.
syntax
Datatype
syntax
DefaultJobPriority
syntax
Descrição
syntax
HostComputer
syntax
// C++ method syntax
HRESULT get_HostComputer(
[out] BSTR* pbstrHostComputer
);
HRESULT put_HostComputer(
[in] BSTR bstrHostComputer
);
Localidade
syntax
Modelo
syntax
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
syntax
PrinterPath
A cadeia de caracteres que faz referência ao caminho pelo qual uma impressora
compartilhada pode ser acessada.
syntax
Printprocessor
syntax
Prioridade
syntax
StartTime
A hora em que a fila deve começar a processar trabalhos. A parte da data da hora é
ignorada.
syntax
UntilTime
syntax
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
C++
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
Cabeçalho Iads.h
DLL Activeds.dll
Requisito Valor
Confira também
IADsPrintQueue
Comentários
Esta página foi útil? ツ Yes ト No
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.
Exemplos
VB
Cleanup:
If (Err.Number <> 0) Then
MsgBox (Err.Description & vbLf & vbLf & " Error number = " &
Err.Number)
End If
Set comp = Nothing
End Sub
Requisitos
Cabeçalho iads.h
Confira também
Iads
IADsFileService
IADsFileServiceOperations
IADsServiceOperations
IDispatch
Comentários
Esta página foi útil?
Yes No
Métodos de propriedade IADsService
Artigo • 03/06/2023
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.
syntax
DisplayName
syntax
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
ADS_SERVICE_ERROR_NORMAL
ADS_SERVICE_ERROR_SEVERE
ADS_SERVICE_ERROR_CRITICAL
syntax
HostComputer
syntax
LoadOrderGroup
syntax
Caminho
syntax
ServiceAccountName
Nome da conta que esse serviço usa para se autenticar na inicialização.
syntax
ServiceAccountPath
syntax
ServiceType
ADS_SERVICE_KERNEL_DRIVER (0x00000001)
ADS_SERVICE_FILE_SYSTEM_DRIVER (0x00000002)
ADS_SERVICE_OWN_PROCESS (0x00000010)
ADS_SERVICE_SHARE_PROCESS (0x00000020)
syntax
StartType
Determina como iniciar o serviço. Veja a seguir valores válidos para essa propriedade.
ADS_SERVICE_BOOT_START
ADS_SERVICE_SYSTEM_START
ADS_SERVICE_AUTO_START
ADS_SERVICE_DEMAND_START
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.
syntax
// C++ method syntax
HRESULT get_StartType(
[out] LONG* plStartType
);
HRESULT put_StartType(
[in] LONG lStartType
);
StartupParameters
syntax
Versão
Versão do serviço.
syntax
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
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
IADsService
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")
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
IADsUser::Groups
Obtém uma coleção dos objetos de grupo ADSI aos quais este usuário pertence.
IADsUser::SetPassword
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
Cleanup:
If(Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set mach = Nothing
Set usr = Nothing
Propriedade Valor
Senha Vazio
Perfil Vazio
VB
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
Cabeçalho iads.h
Confira também
Iads
IADsContainer::Create
IDispatch
Comentários
Esta página foi útil? Yes No
Métodos de propriedade IADsUser
Artigo • 03/06/2023
Propriedades
Conta Desabilitada
syntax
AccountExpirationDate
syntax
syntax
BadLoginCount
syntax
Departamento
syntax
Descrição
syntax
Divisão
syntax
EmailAddress
syntax
// C++ method syntax
HRESULT get_EmailAddress(
[out] BSTR* pbstrEmailAddress
);
HRESULT put_EmailAddress(
[in] BSTR bstrEmailAddress
);
EmployeeID
syntax
FaxNumber
syntax
Nome
syntax
FullName
syntax
GraceLoginsAllowed
O número de vezes que o usuário pode fazer logon depois que a senha expirou.
syntax
syntax
HomeDirectory
syntax
Homepage
syntax
IsAccountLocked
syntax
Idiomas
syntax
LastFailedLogin
syntax
LastLogin
syntax
LastLogoff
syntax
Sobrenome
Sobrenome do usuário.
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.
syntax
LoginScript
syntax
syntax
Gerente
O gerente do usuário.
syntax
MaxLogins
syntax
MaxStorage
syntax
NamePrefix
syntax
NameSuffix
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.
syntax
OtherName
syntax
PasswordExpirationDate
A data e a hora em que a senha expira.
syntax
PasswordLastChanged
syntax
PasswordMinimumLength
syntax
syntax
Picture
syntax
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.
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.
syntax
Perfil
syntax
Um sinalizador que indica se uma nova senha deve ser diferente daquela conhecida por
meio de um histórico de senhas.
syntax
SeeAlso
syntax
PhoneHome
syntax
// C++ method syntax
HRESULT get_TelephoneHome(
[out] VARIANT* pvarTelephoneHome
);
HRESULT put_TelephoneHome(
[in] VARIANT varTelephoneHome
);
PhoneMobile
syntax
Telephonenumber
syntax
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.
syntax
Título
O título do usuário.
syntax
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
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
C++
Requisitos
Requisito Valor
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
Iadsuser
IADs::Get
IADs::P ut
Comentários
Esta página foi útil? ツ Yes ト No
Sintaxe
C++
HRESULT ChangePassword(
[in] BSTR bstrOldPassword,
[out] BSTR bstrNewPassword
);
Parâmetros
[in] bstrOldPassword
[out] bstrNewPassword
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.
Exemplos
VB
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set usr = Nothing
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
Cabeçalho iads.h
DLL Activeds.dll
Confira também
Códigos de erro ADSI
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
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
Cabeçalho iads.h
DLL Activeds.dll
Confira também
Códigos de erro ADSI
IADsMembers
Iadsuser
IEnumVARIANT
Comentários
Esta página foi útil? Yes No
Método IADsUser::SetPassword (iads.h)
Artigo24/08/2023
Sintaxe
C++
HRESULT SetPassword(
BSTR NewPassword
);
Parâmetros
NewPassword
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.
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
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
Cabeçalho iads.h
DLL Activeds.dll
Confira também
Códigos de erro ADSI
IADs::SetInfo
IADsMembers
IADsServiceOperations
Iadsuser
NetUserSetInfo
Comentários
Esta página foi útil?
Yes No
Interfaces de objeto dinâmico
Artigo • 03/06/2023
IADsComputerOperations
IADsFileServiceOperations
IADsPrintJobOperations
IADsPrintQueueOperations
IADsResource
IADsServiceOperations
IADsSession
Comentários
Esta página foi útil? ツ Yes ト No
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
IADsComputerOperations::Status
Requisitos
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
Sintaxe
C++
HRESULT Shutdown(
[in] VARIANT_BOOL bReboot
);
Parâmetros
[in] bReboot
Valor retornado
Esse método dá suporte aos valores retornados padrão, bem como o seguinte:
Requisitos
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
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:
Requisitos
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
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
IADsFileServiceOperations::Sessions
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
' 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.
VB
Para obter mais informações sobre sessões ativas e recursos abertos, consulte
IADsSession e IADsResource.
Requisitos
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
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
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set fso = Nothing
Requisitos
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
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
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set fso = Nothing
Requisitos
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
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
IADsPrintJobOperations::Resume
Requisitos
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
Propriedades
PagesPrinted
syntax
Posição
syntax
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.
syntax
TimeElapsed
syntax
Exemplos
O exemplo de código a seguir mostra como as propriedades de
IADsPrintJobOperations podem ser usadas .
VB
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set pqo = Nothing
Set pjo = Nothing
Requisitos
Requisito Valor
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
IADsPrintJob
IADsPrintJobOperations
IADsPrintQueue
Comentários
Esta página foi útil? ツ Yes ト No
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
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
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
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
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
IADsPrintQueueOperations::P rintJobs
IADsPrintQueueOperations::P urge
IADsPrintQueueOperations::Resume
O método IADsPrintQueueOperations::Resume retoma o processamento de trabalhos de
impressão suspensos na fila de impressão.
Requisitos
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
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)
syntax
Exemplos
O exemplo de código Visual Basic a seguir verifica se uma impressora está bloqueada.
VB
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
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
IADsPrintQueue
IADsPrintQueueOperations
Comentários
Esta página foi útil? ツ Yes ト No
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
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
Sintaxe
C++
HRESULT PrintJobs(
[out] IADsCollection **pObject
);
Parâmetros
[out] pObject
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
Cabeçalho iads.h
DLL Activeds.dll
Confira também
ADsEnumerateNext
IADsCollection
IADsCollection::Remove
IADsPrintJob
IADsPrintQueueOperations
IEnumVARIANT
Comentários
Esta página foi útil? Yes No
Método IADsPrintQueueOperations::P
urge (iads.h)
Artigo24/08/2023
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
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
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
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
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
Cabeçalho iads.h
Comentários
Esta página foi útil? Yes No
Métodos da propriedade IADsResource
Artigo • 12/06/2023
Propriedades
LockCount
syntax
Caminho
syntax
Usuário
syntax
UserPath
syntax
Exemplos
O exemplo de código a seguir mostra como examinar os recursos abertos de um serviço
de arquivo.
VB
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set fso = Nothing
C++
hr = pFso->Resources(&pColl);
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
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
IADsResource
IADsFileServiceOperations::Resources
Comentários
Esta página foi útil? ツ Yes ト No
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.
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
IADsServiceOperations::P ause
IADsServiceOperations::SetPassword
IADsServiceOperations::Start
IADsServiceOperations::Stop
O método IADsServiceOperations::Stop interrompe um serviço de rede ativo no momento.
Requisitos
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
Propriedades
Status
Status do serviço.
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)
syntax
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
C++
HRESULT hr = S_OK;
hr = ADsGetObject(adsPath,IID_IADsContainer,(void**)&pCont);
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
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
IADsFileService
IADsFileServiceOperations
IADsService
IADsServiceOperations
Comentários
Esta página foi útil? ツ Yes ト No
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
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
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
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
Sintaxe
C++
HRESULT SetPassword(
[in] BSTR bstrNewPassword
);
Parâmetros
[in] bstrNewPassword
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
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++
hr = pDisp->QueryInterface(IID_IADsServiceOperations, (void**)&pSrvOp);
if(FAILED(hr))
{
goto Cleanup;
}
Cleanup:
if(pDisp)
{
pDisp->Release();
}
if(pCont)
{
pCont->Release();
}
if(pSrvOp)
{
pSrvOp->Release();
}
}
Requisitos
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
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
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
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
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
VB
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set fso = Nothing
Set ss = Nothing
Requisitos
Cabeçalho iads.h
Comentários
Esta página foi útil? Yes No
Métodos de propriedade IADsSession
Artigo • 03/06/2023
Propriedades
Computador
syntax
ComputerPath
syntax
ConnectTime
syntax
IdleTime
syntax
Usuário
syntax
UserPath
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
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set fso = Nothing
C++
VariantInit(&var);
LPWSTR adsPath = L"WinNT://aMachine/LanmanServer";
hr = ADsGetObject(adsPath,IID_IADsFileServiceOperations,
(void**)&pFso);
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
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
IADsFileServiceOperations::Sessions
IADsSession
Comentários
Esta página foi útil? ツ Yes ト No
IADsAccessControlEntry
IADsAccessControlList
IADsSecurityDescriptor
IADsSecurityUtility
Comentários
Esta página foi útil? ツ Yes ト No
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.
Requisitos
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
Propriedades
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.
syntax
AceFlags
syntax
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 .
syntax
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 .
syntax
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.
syntax
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.
syntax
// C++ method syntax
HRESULT get_ObjectType(
[out] BSTR* bstrObjectType
);
HRESULT put_ObjectType(
[in] BSTR bstrObjectType
);
Administrador
syntax
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
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
C++
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;
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
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
IADsAccessControlEntry
IADsAccessControlList
IADsSecurityDescriptor
Comentários
Esta página foi útil? ツ Yes ト No
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
IADsAccessControlList::CopyAccessList
IADsAccessControlList::get__NewEnum
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.
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
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
C++
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;
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
Cabeçalho iads.h
Confira também
IADsAccessControlEntry
IADsSecurityDescriptor
IDispatch
Comentários
Esta página foi útil? Yes No
Métodos de propriedade
IADsAccessControlList
Artigo • 13/06/2023
Propriedades
AceCount
syntax
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.
syntax
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
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
C++
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;
}
if(FAILED(hr)) {
printf("get_DACL : hr = %x\n",hr);
return hr;
}
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
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
IADsAccessControlList
IEnumVARIANT
IADsAccessControlEntry
IADsSecurityDescriptor
Comentários
Esta página foi útil? ツ Yes ト No
Sintaxe
C++
HRESULT AddAce(
[in] IDispatch *pAccessControlEntry
);
Parâmetros
[in] pAccessControlEntry
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:
Exemplos
VB
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")
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 hr = pAcl->put_AclRevision(ACL_REVISION_DS);
if(FAILED(hr))
{
return hr;
}
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;
}
////////////////////////////////////
// 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
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
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
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
C++
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
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
Sintaxe
C++
HRESULT RemoveAce(
[in] IDispatch *pAccessControlEntry
);
Parâmetros
[in] pAccessControlEntry
Valor retornado
Esse método retorna valores retornados padrão.
Requisitos
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
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
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set Dacl = Nothing
Set ace = Nothing
C++
VariantInit(&var);
hr = pACL->get__NewEnum(&pUnk);
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
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
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
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
' Get the IADsObjectOptions for the object - not the IADsSecurityDescriptor.
Set oOptions = obj
VB
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
C++
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
Cabeçalho iads.h
Confira também
Criando um descritor de segurança para um novo objeto de diretório
IADsAccessControlEntry
IADsAccessControlList
IDispatch
Comentários
Esta página foi útil? Yes No
Métodos da propriedade
IADsSecurityDescriptor
Artigo • 13/06/2023
Propriedades
Controle
syntax
DaclDefaulted
syntax
// C++ method syntax
HRESULT get_DaclDefaulted(
[out] VARIANT_BOOL* fDaclDefaulted
);
HRESULT put_DaclDefaulted(
[in] VARIANT_BOOL fDaclDefaulted
);
Discretionaryacl
syntax
Grupo
syntax
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.
syntax
Proprietário
Proprietário do objeto.
syntax
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.
syntax
// C++ method syntax
HRESULT get_OwnerDefaulted(
[out] VARIANT_BOOL* fOwnerDefaulted
);
HRESULT put_OwnerDefaulted(
[in] VARIANT_BOOL fOwnerDefaulted
);
Revisão
syntax
SaclDefaulted
syntax
Systemacl
Lista de controle de acesso do sistema usada para gerar registros de auditoria para o
objeto .
syntax
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
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
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
IADsSecurityDescriptor
IADsAccessControlEntry
IADsAccessControlList
Comentários
Esta página foi útil? ツ Yes ト No
Sintaxe
C++
HRESULT CopySecurityDescriptor(
[out] IDispatch **ppSecurityDescriptor
);
Parâmetros
[out] ppSecurityDescriptor
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
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
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
IADsSecurityUtility::get_SecurityMask
IADsSecurityUtility::GetSecurityDescriptor
IADsSecurityUtility::p ut_SecurityMask
IADsSecurityUtility::SetSecurityDescriptor
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
Cabeçalho iads.h
Confira também
ADS_PATHTYPE_ENUM
ADS_SD_FORMAT_ENUM
IADsAccessControlEntry
IADsSecurityDescriptor
IAccessControlList
IDispatch
Interfaces de segurança
Comentários
Esta página foi útil? Yes No
Método
IADsSecurityUtility::get_SecurityMask
(iads.h)
Artigo14/03/2023
Sintaxe
C++
HRESULT get_SecurityMask(
long *retval
);
Parâmetros
retval
Retornar valor
Um valor HRESULT que indica o êxito ou a falha da chamada.
Requisitos
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
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
ADS_SD_FORMAT_IID
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
[in] lOutFormat
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
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
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
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
[in] lFormat
ADS_SD_FORMAT_IID
pVariant recebe uma VT_DISPATCH que pode ser consultada para a interface
IADsSecurityDescriptor .
ADS_SD_FORMAT_RAW
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
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
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
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
[in] varData
[in] lDataFormat
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:
Exemplos
O exemplo de código a seguir mostra como definir um descritor de segurança para um
arquivo.
VB
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
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
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
IDirectoryObject::D eleteDSObject
IDirectoryObject::GetObjectAttributes
IDirectoryObject::SetObjectAttributes
Requisitos
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
Sintaxe
C++
HRESULT CreateDSObject(
[in] LPWSTR pszRDNName,
[in] PADS_ATTR_INFO pAttributeEntries,
[in] DWORD dwNumAttributes,
[out] IDispatch **ppObject
);
Parâmetros
[in] pszRDNName
[in] pAttributeEntries
[in] dwNumAttributes
[out] ppObject
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
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
Sintaxe
C++
HRESULT DeleteDSObject(
LPWSTR pszRDNName
);
Parâmetros
pszRDNName
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
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
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
Sintaxe
C++
HRESULT GetObjectAttributes(
[in] LPWSTR *pAttributeNames,
[in] DWORD dwNumberAttributes,
[out] PADS_ATTR_INFO *ppAttributeEntries,
[out] DWORD *pdwNumAttributesReturned
);
Parâmetros
[in] pAttributeNames
Para solicitar todos os atributos do objeto, defina pAttributeNames como NULL e defina
o parâmetro dwNumberAttributes como (DWORD)-1.
[in] dwNumberAttributes
[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.
Exemplos
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
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
Sintaxe
C++
HRESULT GetObjectInformation(
[out] PADS_OBJECT_INFO *ppObjInfo
);
Parâmetros
[out] ppObjInfo
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 .
C++
ADS_OBJECT_INFO *pInfo;
HRESULT hr;
hr = m_pDirObject->GetObjectInformation(&pInfo);
if (!SUCCEEDED(hr) )
{
return;
}
//////////////////////////
// Show the attributes
/////////////////////////
///////////////////////////////////////////////////////////
// Remember to clean up the memory using FreeADsMem.
//////////////////////////////////////////////////////////
FreeADsMem( pInfo );
Requisitos
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
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
[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.
Exemplos
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
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
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
Cabeçalho iads.h
Comentários
Esta página foi útil? Yes No
Interface IDirectorySearch (iads.h)
Artigo24/08/2023
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
IDirectorySearch::CloseSearchHandle
IDirectorySearch::ExecuteSearch
IDirectorySearch::FreeColumn
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
IDirectorySearch::GetNextRow
IDirectorySearch::GetPreviousRow
IDirectorySearch::SetSearchPreference
Especifica uma preferência de pesquisa para obter dados em uma pesquisa subsequente.
Requisitos
Cabeçalho iads.h
Comentários
Esta página foi útil? Yes No
Método
IDirectorySearch::AbandonSearch
(iads.h)
Artigo24/08/2023
Sintaxe
C++
HRESULT AbandonSearch(
[in] ADS_SEARCH_HANDLE phSearchResult
);
Parâmetros
[in] phSearchResult
Valor retornado
Esse método retorna os valores retornados padrão, incluindo S_OK se a primeira linha
for obtida com êxito.
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++
// 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
Cabeçalho iads.h
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
Sintaxe
C++
HRESULT CloseSearchHandle(
[in] ADS_SEARCH_HANDLE hSearchResult
);
Parâmetros
[in] hSearchResult
Valor retornado
Esse método retorna os valores de retorno padrão, bem como os seguintes:
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
Cabeçalho iads.h
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
Sintaxe
C++
HRESULT ExecuteSearch(
[in] LPWSTR pszSearchFilter,
[in] LPWSTR *pAttributeNames,
[in] DWORD dwNumberAttributes,
[out] PADS_SEARCH_HANDLE phSearchResult
);
Parâmetros
[in] pszSearchFilter
[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
[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.
Exemplos
O exemplo de código C++ a seguir mostra como invocar
IDirectorySearch::ExecuteSearch.
C++
// 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
Cabeçalho iads.h
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
Sintaxe
C++
HRESULT FreeColumn(
[in] PADS_SEARCH_COLUMN pSearchColumn
);
Parâmetros
[in] pSearchColumn
Valor retornado
Esse método retorna os valores de retorno padrão, bem como os seguintes:
Requisitos
Cabeçalho iads.h
Idirectorysearch
IDirectorySearch::GetColumn
Comentários
Esta página foi útil? Yes No
Método IDirectorySearch::GetColumn
(iads.h)
Artigo24/08/2023
Sintaxe
C++
HRESULT GetColumn(
[in] ADS_SEARCH_HANDLE hSearchResult,
[in] LPWSTR szColumnName,
[out] PADS_SEARCH_COLUMN pSearchColumn
);
Parâmetros
[in] hSearchResult
[in] szColumnName
[out] pSearchColumn
Valor retornado
Esse método retorna os valores de retorno padrão, bem como os seguintes.
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.
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
Cabeçalho iads.h
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
Sintaxe
C++
HRESULT GetFirstRow(
[in] ADS_SEARCH_HANDLE hSearchResult
);
Parâmetros
[in] hSearchResult
Valor retornado
Esse método retorna os valores de retorno padrão, bem como o seguinte:
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++
m_pSearch->CloseSearchHandle(hSearch);
}
Requisitos
Cabeçalho iads.h
Idirectorysearch
IDirectorySearch::ExecuteSearch
Comentários
Esta página foi útil? Yes No
Método
IDirectorySearch::GetNextColumnName
(iads.h)
Artigo24/08/2023
Sintaxe
C++
HRESULT GetNextColumnName(
[in] ADS_SEARCH_HANDLE hSearchHandle,
[out] LPWSTR *ppszColumnName
);
Parâmetros
[in] hSearchHandle
[out] ppszColumnName
Valor retornado
Esse método retorna os valores de retorno padrão, bem como os seguintes:
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
Cabeçalho iads.h
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
Sintaxe
C++
HRESULT GetNextRow(
[in] ADS_SEARCH_HANDLE hSearchResult
);
Parâmetros
[in] hSearchResult
Valor retornado
Esse método retorna os valores de retorno padrão, bem como o seguinte:
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++
m_pSearch->CloseSearchHandle(hSearch);
}
Requisitos
Cabeçalho iads.h
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
Sintaxe
C++
HRESULT GetPreviousRow(
[in] ADS_SEARCH_HANDLE hSearchResult
);
Parâmetros
[in] hSearchResult
Valor retornado
Esse método retorna os valores de retorno padrão, bem como o seguinte:
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
Cabeçalho iads.h
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
Sintaxe
C++
HRESULT SetSearchPreference(
[in] PADS_SEARCHPREF_INFO pSearchPrefs,
[in] DWORD dwNumPrefs
);
Parâmetros
[in] pSearchPrefs
[in] dwNumPrefs
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
Cabeçalho iads.h
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
Comentários
Esta página foi útil? ツ Yes ト No
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
IADsExtension::P rivateGetIDsOfNames
IADsExtension::P rivateInvoke
Requisitos
Cabeçalho iads.h
Comentários
Esta página foi útil? Yes No
Método IADsExtension::Operate (iads.h)
Artigo24/08/2023
Sintaxe
C++
HRESULT Operate(
[in] DWORD dwCode,
[in] VARIANT varData1,
[in] VARIANT varData2,
[in] VARIANT varData3
);
Parâmetros
[in] dwCode
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++
break;
default:
hr = E_FAIL;
break;
}
return hr;
}
Requisitos
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
Sintaxe
C++
HRESULT PrivateGetIDsOfNames(
REFIID riid,
OLECHAR **rgszNames,
unsigned int cNames,
LCID lcid,
DISPID *rgDispid
);
Parâmetros
riid
rgszNames
cNames
lcid
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
C++
Requisitos
Cliente mínimo com suporte Windows Vista
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
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
[in] riid
[in] lcid
[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
DISPATCH_PROPERTYPUT
DISPATCH_PROPERTYPUTREF
[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
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
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
IADsADSystemInfo
IADsDeleteOps
IADsNameTranslate
IADsObjectOptions
IADsPathname
IADsWinNTSystemInfo
Comentários
Esta página foi útil? ツ Yes ト No
C++
IADsADSystemInfo *pADsys;
HRESULT hr = CoCreateInstance(CLSID_ADSystemInfo,
NULL,
CLSCTX_INPROC_SERVER,
IID_IADsADSystemInfo,
(void**)&pADsys);
VB
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
IADsADSystemInfo::GetDCSiteName
IADsADSystemInfo::GetTrees
IADsADSystemInfo::RefreshSchemaCache
Requisitos
Cabeçalho iads.h
Confira também
Cocreateinstance
IDispatch
Comentários
Esta página foi útil? Yes No
Métodos de propriedade
IADsADSystemInfo
Artigo • 03/06/2023
Propriedades
ComputerName
syntax
DomainDNSName
syntax
DomainShortName
Recupera o nome curto do domínio do computador local, como "domainName".
syntax
ForestDNSName
syntax
IsNativeMode
syntax
PDCRoleOwner
syntax
Schemaroleowner
syntax
SiteName
syntax
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.
syntax
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;
}
VB
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
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
IADsADSystemInfo
Cocreateinstance
Comentários
Esta página foi útil? ツ Yes ト No
Sintaxe
C++
HRESULT GetAnyDCName(
[out] BSTR *pszDCName
);
Parâmetros
[out] pszDCName
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
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
Sintaxe
C++
HRESULT GetDCSiteName(
[out] BSTR szServer,
[in] BSTR *pszSiteName
);
Parâmetros
[out] szServer
[in] pszSiteName
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;
}
VB
Dim sys As New ADSystemInfo
dc = sys.GetAnyDCName
Debug.Print "Domain Controller site: " & sys.GetDCSiteName(dc)
VB
<%
Dim sys
dc = sys.GetAnyDCName
%>
Requisitos
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::GetTrees
(iads.h)
Artigo24/08/2023
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
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
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
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 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
Requisitos
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
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
Cabeçalho iads.h
DLL Activeds.dll
Confira também
Códigos de erro ADSI
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
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
IADsNameTranslate::GetEx
IADsNameTranslate::Init
IADsNameTranslate::InitEx
IADsNameTranslate::Set
Direciona o serviço de diretório para configurar um objeto especificado para tradução de nome.
IADsNameTranslate::SetEx
Requisitos
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
Propriedades
ChaseReferral
syntax
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.
Requisitos
Requisito Valor
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
ADS_CHASE_REFERRALS_ENUM
IADsNameTranslate
IADsNameTranslate::Get
IADsNameTranslate::GetEx
IADsNameTranslate::Set
IADsNameTranslate::SetEx
Comentários
Esta página foi útil? ツ Yes ト No
Sintaxe
C++
HRESULT Get(
long lnFormatType,
BSTR *pbstrADsPath
);
Parâmetros
lnFormatType
pbstrADsPath
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
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();
VB
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
VB
server = "myServer"
user = "jeffsmith"
dom = "Fabrikam"
passwd = "top secret"
%>
</body>
</html>
Requisitos
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
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
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;}
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;}
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
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)
VB
server = "myServer"
user = "jeffsmith"
dom = "Fabrikam"
passwd = "top secret"
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)
%>
</body>
</html>
Requisitos
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
Sintaxe
C++
HRESULT Init(
long lnSetType,
BSTR bstrADsPath
);
Parâmetros
lnSetType
bstrADsPath
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();
VB
VB
dn = "CN=jeffsmith,CN=Users,DC=Fabrikam,DC=COM"
%>
</body>
</html>
Requisitos
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
Sintaxe
C++
HRESULT InitEx(
long lnSetType,
BSTR bstrADsPath,
BSTR bstrUserID,
BSTR bstrDomain,
BSTR bstrPassword
);
Parâmetros
lnSetType
bstrADsPath
bstrUserID
Nome de usuário.
bstrDomain
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();
VB
VB
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)
%>
</body>
</html>
Requisitos
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
Sintaxe
C++
HRESULT Set(
long lnSetType,
BSTR bstrADsPath
);
Parâmetros
lnSetType
bstrADsPath
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.
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();
VB
VB
dn = "CN=jeffsmith,CN=Users,DC=Fabrikam,DC=COM"
%>
</body>
</html>
Requisitos
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
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
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
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;}
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;}
VB
VB
dn(0) = "CN=jeffSmith,CN=Users,DC=Fabrikam,DC=COM"
dn(1) = "CN=brendaDiaz,CN=Users,DC=Fabrikam,DC=COM"
%>
</body>
</html>
Requisitos
Cliente mínimo com suporte Windows Vista
Cabeçalho iads.h
DLL Activeds.dll
Confira também
ADS_NAME_TYPE_ENUM
IADsNameTranslate
IADsNameTranslate::Set
Comentários
Esta página foi útil? Yes No
Interface IADsObjectOptions (iads.h)
Artigo24/08/2023
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
IADsObjectOptions::SetOption
Requisitos
Cabeçalho iads.h
Confira também
ADS_OPTION_ENUM
ADS_SECURITY_INFO_ENUM
IADsObjectOptions Interface
IDispatch
Comentários
Esta página foi útil? Yes No
Método IADsObjectOptions::GetOption
(iads.h)
Artigo24/08/2023
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
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
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
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
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
C++
IADsPathname *pPathname=NULL;
HRESULT hr;
hr = CoCreateInstance(CLSID_Pathname,
NULL,
CLSCTX_INPROC_SERVER,
IID_IADsPathname,
(void**)&pPathname);
VB
VB
Dim path
Set path = CreateObject("Pathname")
Métodos
A interface IADsPathname tem esses métodos.
IADsPathname::AddLeafElement
IADsPathname::CopyPath
IADsPathname::GetElement
IADsPathname::GetEscapedElement
IADsPathname::GetNumElements
IADsPathname::RemoveLeafElement
Remove o último elemento do caminho de diretório que foi definido no objeto Pathname.
IADsPathname::Retrieve
IADsPathname::Set
IADsPathname::SetDisplayType
Cabeçalho iads.h
Confira também
ADS_FORMAT_ENUM
ADS_SETTYPE_ENUM
CoCreateInstance()
IDispatch
Comentários
Esta página foi útil? Yes No
Métodos da propriedade IADsPathname
Artigo • 12/06/2023
Propriedades
EscapedMode
syntax
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.
VB
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.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,/*"
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.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,/*"
%>
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);
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
Cabeçalho Iads.h
Requisito Valor
DLL Activeds.dll
Confira também
IADsPathname
ADS_ESCAPE_MODE_ENUM
Comentários
Esta página foi útil? ツ Yes ト No
Sintaxe
C++
HRESULT AddLeafElement(
[in] BSTR bstrLeafElement
);
Parâmetros
[in] bstrLeafElement
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
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
Sintaxe
C++
HRESULT CopyPath(
[out] IDispatch **ppAdsPath
);
Parâmetros
[out] ppAdsPath
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";
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
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
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
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
Sintaxe
C++
HRESULT GetEscapedElement(
[in] long lnReserved,
[in] BSTR bstrInStr,
[out] BSTR *pbstrOutStr
);
Parâmetros
[in] lnReserved
[in] bstrInStr
[out] pbstrOutStr
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
VB
Dim x
Set x = CreateObject("Pathname")
rdn = x.GetEscapedElement(0, "cn=smith,jeff")
C++
LPWSTR adsPath=L"LDAP://server/cn=jeffsmith,dc=Fabrikam,dc=com";
pPath->Release();
Requisitos
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
Sintaxe
C++
HRESULT GetNumElements(
[out] long *plnNumPathElements
);
Parâmetros
[out] plnNumPathElements
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
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
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
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
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
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
Sintaxe
C++
HRESULT Set(
[in] BSTR bstrADsPath,
[in] long lnSetType
);
Parâmetros
[in] bstrADsPath
[in] lnSetType
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
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".
%>
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
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
Sintaxe
C++
HRESULT SetDisplayType(
long lnDisplayType
);
Parâmetros
lnDisplayType
Valor retornado
Esse método dá suporte aos valores retornados padrão, incluindo o seguinte:
Requisitos
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
C++
IADsWinNTSystemInfo *pNTsys;
HRESULT hr = CoCreateInstance(CLSID_WinNTSystemInfo,
NULL,
CLSCTX_INPROC_SERVER,
IID_IADsWinNTSystemInfo,
(void**)&pNTsys);
VB
VB
Dim ntSys
Set ntSys = CreateObject("WinNTSystemInfo")
Herança
A interface IADsWinNTSystemInfo herda da interface IDispatch.
Requisitos
Cabeçalho iads.h
Confira também
Cocreateinstance
IDispatch
Comentários
Esta página foi útil? Yes No
Métodos de propriedade
IADsWinNTSystemInfo
Artigo • 12/06/2023
Propriedades
ComputerName
syntax
DomainName
syntax
PDC
syntax
UserName
syntax
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;
}
VB
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
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
IADsWinNTSystemInfo
Comentários
Esta página foi útil? ツ Yes ト No
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
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
Requisitos
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
Propriedades
Privilégios
Configurações de privilégio.
syntax
ProtectedAttrName
syntax
Subjectname
Nome do assunto.
syntax
Requisitos
Requisito Valor
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
IADsAcl
Comentários
Esta página foi útil? ツ Yes ト No
Sintaxe
C++
HRESULT CopyAcl(
IDispatch **ppAcl
);
Parâmetros
ppAcl
Valor retornado
Esse método dá suporte aos valores retornados padrão, bem como aos seguintes:
Requisitos
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
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
Propriedades
ObjectName
RemoteID
Requisitos
Requisito Valor
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
IADsBackLink
ADS_BACKLINK
Comentários
Esta página foi útil? ツ Yes ト No
Herança
A interface IADsCaseIgnoreList herda da interface IDispatch.
Requisitos
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
Propriedades
CaseIgnoreList
syntax
Requisitos
Requisito Valor
Cabeçalho Iads.h
DLL Activeds.dll
Requisito Valor
Confira também
IADsCaseIgnoreList
ADS_CASEIGNORE_LIST
Comentários
Esta página foi útil? ツ Yes ト No
Herança
A interface IADsDNWithBinary herda da interface IDispatch.
Requisitos
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
Propriedades
BinaryValue
syntax
DNString
syntax
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
IADsDNWithBinary
ADS_DN_WITH_BINARY
Comentários
Esta página foi útil? ツ Yes ト No
Herança
A interface IADsDNWithString herda da interface IDispatch.
Requisitos
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
Propriedades
DNString
syntax
Stringvalue
syntax
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
IADsDNWithString
ADS_DN_WITH_STRING
Comentários
Esta página foi útil? ツ Yes ト No
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
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
Propriedades
Endereço
syntax
Tipo
syntax
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
IADsEmail
ADS_EMAIL
Comentários
Esta página foi útil? ツ Yes ト No
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
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
Propriedades
Parâmetros
TelephoneNumber
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
IADsFaxNumber
ADS_FAXNUMBER
Comentários
Esta página foi útil? ツ Yes ト No
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
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
Propriedades
Quantidade
syntax
ObjectName
syntax
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
IADsHold
Comentários
Esta página foi útil? ツ Yes ト No
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
VB
Debug.Print oLargeInt.HighPart
Debug.Print oLargeInt.LowPart
' 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
pFileTime.dwHighDateTime = oLargeInt.HighPart
pFileTime.dwLowDateTime = oLargeInt.LowPart
End Function
C++
HRESULT hr;
CComPtr<IADs> spads;
/*
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;
}
return hr;
}
Requisitos
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
Propriedades
HighPart
syntax
LowPart
syntax
VB
Exemplos
O exemplo de código do Visual Basic a seguir define um inteiro grande como
43937327281.
VB
Requisitos
Requisito Valor
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
Iadslargeinteger
Comentários
Esta página foi útil? ツ Yes ト No
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
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
Propriedades
Endereço
Um endereço de rede.
syntax
AddressType
syntax
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
IADsNetAddress
ADS_NETADDRESS
Comentários
Esta página foi útil? ツ Yes ト No
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
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
Propriedades
OctetList
syntax
Requisitos
Requisito Valor
Cabeçalho Iads.h
DLL Activeds.dll
ADS_OCTET_LIST
Comentários
Esta página foi útil? ツ Yes ト No
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
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
Propriedades
Caminho
syntax
Tipo
syntax
syntax
Requisitos
Requisito Valor
Cabeçalho Iads.h
DLL Activeds.dll
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
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
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
Propriedades
PostalAddress
Uma matriz de seis cadeias de caracteres que contém o endereço postal do usuário.
syntax
Requisitos
Requisito Valor
Cabeçalho Iads.h
DLL Activeds.dll
Requisito Valor
Confira também
IADsPostalAddress
ADS_POSTALADDRESS
Comentários
Esta página foi útil? ツ Yes ト No
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
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
Propriedades
Count
syntax
ReplicaAddressHints
syntax
ReplicaNumber
syntax
ReplicaType
syntax
ServerName
syntax
// C++ method syntax
HRESULT get_ServerName(
[out] BSTR* retVal
);
HRESULT put_ServerName(
[in] BSTR bstrServerName
);
Requisitos
Requisito Valor
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
IADsReplicaPointer
ADS_REPLICAPOINTER
Comentários
Esta página foi útil? ツ Yes ト No
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
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
Propriedades
EventID
Um identificador de evento.
syntax
WholeSeconds
Número de segundos com valor zero sendo 12:00, janeiro de 1970, UTC.
syntax
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
IADsTimestamp
ADS_TIMESTAMP
Comentários
Esta página foi útil? ツ Yes ト No
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
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
Propriedades
Intervalo
syntax
Level
syntax
O nome de um objeto.
syntax
Requisitos
Requisito Valor
Cabeçalho Iads.h
DLL Activeds.dll
Confira também
IADsTypedName
ADS_TYPEDNAME
Comentários
Esta página foi útil? ツ Yes ト No
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
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
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.
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
C++
LDAP://HostName[:PortNumber][/DistinguishedName]
7 Observação
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.
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
Comentários
Esta página foi útil? ツ Yes ト No
A tabela a seguir mapeia o nome da sintaxe amigável para o valor de sintaxe LDAP
correspondente OID e ADSTYPEENUM .
DN 1.3.6.1.4.1.1466.115.121.1.12 ADSTYPE_DN_STRING
A tabela a seguir lista objetos COM comumente usados para o provedor LDAP no ADSI,
juntamente com as interfaces ADSI compatíveis.
Comentários
Esta página foi útil? ツ Yes ト No
O provedor LDAP usa o mapeamento a seguir entre a sintaxe LDAP e a sintaxe ADSI.
Adspath VT_BSTR
Boolean VT_BOOL
Contador VT_I4
EmailAddress VT_BSTR
FaxNumber VT_BSTR
Integer VT_I4
Intervalo VT_I4
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?
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
AccountExpirationDate accountExpires
BadLoginCount badPwdCount
department Departamento
Descrição Descrição
Divisão Divisão
Emailaddress mail
Employeeid Employeeid
FaxNumber facsimileTelephoneNumber
Firstname givenName
FullName displayName
HomeDirectory homeDirectory
Homepage wWWHomePage
IsAccountLocked Lockouttime
LastFailedLogin badPasswordTime
LastLogin lastLogon
LastLogoff lastLogoff
Lastname sn
LoginHours logonHours
LoginScript scriptPath
LoginWorkstations userWorkstations
Gerente manager
MaxStorage maxStorage
NamePrefix personalTitle
NameSuffix generationQualifier
OfficeLocations physicalDeliveryOfficeName
OtherName middleName
PasswordLastChanged pwdLastSet
Imagem thumbnailPhoto
PostalAddresses postalAddress
PostalCodes Postalcode
Perfil profilePath
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
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.
4. Se a interface IADsContainer for usada, o novo objeto não será realmente criado
até que o método IADs.SetInfo seja chamado.
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
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;
// 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
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.
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
Comentários
Esta página foi útil? ツ Yes ト No
Exemplo 1
VB
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Exemplo 2
C++
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
VB
User.SetInfo
End Sub
C++
/***************************************************************************
SetUserAccountExpirationDate()
***************************************************************************/
HRESULT hr;
VariantClear(&var);
}
else
{
// Account expires on date.
hr = pUser->put_AccountExpirationDate(date);
}
if(S_OK == hr)
{
hr = pUser->SetInfo();
}
return hr;
}
7 Observação
Comentários
Esta página foi útil? ツ Yes ト No
Comentários
Esta página foi útil? ツ Yes ト No
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
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:
É 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
A capacidade de um usuário alterar sua senha é uma permissão que pode ser concedida
ou negada.
7 Observação
C++
/***************************************************************************
GetSidAccountName()
pSid - Pointer to the SID that the account name should be retrieved for.
***************************************************************************/
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.
***************************************************************************/
HRESULT hr = E_FAIL;
BOOL fReturn;
PSID psidAlloc;
return hr;
}
/***************************************************************************
GetSidAccountName_Self()
Retrieves the local account name for the "NT AUTHORITY\SELF" account.
***************************************************************************/
LocalFree(psidAlloc);
}
return hr;
}
/***************************************************************************
GetObjectACE()
***************************************************************************/
*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;
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.
***************************************************************************/
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;
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;
}
}
pDisp->Release();
}
psd->Release();
}
}
pads->Release();
}
return hr;
}
7 Observação
VB
fEveryone = False
fSelf = False
' 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
Comentários
Esta página foi útil? ツ Yes ト No
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 .
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
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.
Propriedade Valor
IADsAccessControlEntry
AccessMask ADS_RIGHT_DS_CONTROL_ACCESS
AceFlags 0
Propriedade Valor
IADsAccessControlEntry
Sinalizadores ADS_FLAG_OBJECT_TYPE_PRESENT
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
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.
C++
#include <aclapi.h>
/***************************************************************************
CreateACE()
Creates an ACE and returns the IDispatch pointer for the ACE. This
pointer can be passed directly to IADsAccessControlList::AddAce.
***************************************************************************/
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.
***************************************************************************/
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.
***************************************************************************/
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;
}
}
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
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
' 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
Comentários
Esta página foi útil? ツ Yes ト No
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
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()
***************************************************************************/
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
7 Observação
Comentários
Esta página foi útil? ツ Yes ト No
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>
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
O provedor ADSI WinNT implementa os seguintes objetos COM para dar suporte a
recursos e serviços de várias interfaces ADSI.
IADsPropertyList
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.
Comentários
Esta página foi útil? ツ Yes ト No
Comentários
Esta página foi útil? ツ Yes ト No
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.
Comentários
Esta página foi útil? ツ Yes ト No
Comentários
Esta página foi útil? ツ Yes ト No
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
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.
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.
Este exemplo mostra como usar PasswordExpired para forçar um usuário a alterar a
senha no próximo logon.
VB
'--- Clear this flag so that the user does not have to change the password
at next logon.
VB
Comentários
Esta página foi útil? ツ Yes ト No
Comentários
Esta página foi útil? ツ Yes ト No
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
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
Ao usar o provedor WinNT, a data de validade da conta pode ser definida usando a
propriedade IADsUser.AccountExpirationDate .
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
Exemplo 2
O exemplo de código a seguir mostra como definir a data de validade da conta usando
C++ com ADSI.
C++
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
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 .
O exemplo de código a seguir demonstra como usar Visual Basic com ADSI para
desbloquear uma conta de usuário.
VB
O exemplo de código a seguir demonstra como usar o C++ com ADSI para desbloquear
uma conta de usuário.
C++
HRESULT hr;
CComPtr<IADsUser> spADsUser;
return hr;
}
O exemplo de código a seguir demonstra como usar Visual Basic com ADSI para
determinar se uma conta está bloqueada.
VB
C++
*pfLocked = FALSE;
HRESULT hr;
CComPtr<IADsUser> spADsUser;
VARIANT_BOOL vfLocked;
hr = spADsUser>get_IsAccountLocked(&vfLocked);
if(S_OK != hr)
{
return hr;
}
return hr;
}
Comentários
Esta página foi útil? ツ Yes ト No
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
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
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>
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
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:
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
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
' 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
C++
//**************************************************************************
*
//
// UserCannotChangePassword()
//
//**************************************************************************
*
*pfCannotChangePassword = FALSE;
HRESULT hr;
IADs *pads;
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
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
' 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
C++
//**************************************************************************
*
// SetUserCannotChangePassword()
//**************************************************************************
*
HRESULT hr;
IADs *pads;
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;
}
pads->Release();
}
return hr;
}
Comentários
Esta página foi útil? ツ Yes ト No
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
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++
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
Comentários
Esta página foi útil? ツ Yes ト No
A tabela a seguir apresenta uma breve descrição dos objetos COM implementados no
roteador ADSI.
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 qual propriedade ou método tem suporte para cada
interface, clique no nome da interface apropriado na primeira coluna da tabela.
IADsAccessControlEntry Yes No
IADsAccessControlList Yes No
IADsAcl No No
IADsBackLink No No
IADsCaseIgnoreList No No
IADsCollection No Yes
IADsComputer No Yes
IADsComputerOperations No Yes
IADsDeleteOps Yes No
IADsDomain No Yes
Nome da Interface LDAP Winnt
IADsEmail No No
IADsFaxNumber No No
IADsFileService No Yes
IADsFileServiceOperations No Yes
IADsFileShare No Yes
IADsHold No No
Iadslargeinteger Yes No
IADsLocality Yes No
IADsNetAddress No No
IADsO Yes No
IADsObjectOptions Yes No
IADsOctetList No No
IADSOU Yes No
IADsPath No No
IADsPostalAddress No No
IADsPrintJob No Yes
IADsPrintJobOperations No Yes
IADsReplicaPointer No No
IADsResource No Yes
IADsSecurityDescriptor Yes No
IADsService No Yes
IADsServiceOperations No Yes
IADsSession No Yes
IADsTimestamp No No
IADsTypedName No No
IDirectoryObject Yes No
Idirectorysearch Yes No
Count Com suporte para GroupCollection, mas não para Sem suporte
UserCollection
Comentários
Esta página foi útil? ツ Yes ト No
Todos os códigos de erro ADSI são retornados como valores COM HRESULT . Eles
podem ser agrupados nos quatro tipos a seguir:
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
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.
Comentários
Esta página foi útil? ツ Yes ト No
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_* .
0x80005005L E_ADS_PROPERTY_NOT_SET A
propriedade
ADSI
especificada
não foi
definida.
Comentários
Esta página foi útil? ツ Yes ト No
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
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:
Comentários
Esta página foi útil? ツ Yes ト No
Comentários
Esta página foi útil? ツ Yes ト No
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
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.
Comentários
Esta página foi útil? ツ Yes ト No
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.
Comentários
Esta página foi útil? ツ Yes ト No
O exemplo de código a seguir mostra como recuperar uma mensagem de erro ADSI.
C++
if ( SUCCEEDED(hr) )
{
return _T("Success");
}
/////////////////////////////////////////////
// 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;
return s;
}
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?