2013-02-21 2 views
1

Il y a des centaines d'articles qui enseignent cela mais mon cas est "unique". Je devenais vu refuser l'accès à la ligne suivante:Comment ajouter un utilisateur de compte de domaine dans un groupe local?

Set objDomainUser = GetObject("WinNT://" & domainControllerIP & "/" & domainAccount & ",user") 

Je réalisé que je devais transmettre les informations d'identification de l'utilisateur. La plupart des gens ne passent que le nom de domaine, ce qui est bien. Il se connectera à un contrôleur de domaine qui peut être connu en regardant la variable d'environnement% LOGONSERVER%. J'ai besoin de spécifier le nom du contrôleur de domaine (ou IP) sinon cela ne fonctionnera pas pour nous. Donc, j'essaie juste d'obtenir ce sintax correct. Voici mon code:

Sub AddAccountToLocalGroup(domainName, domainControllerIP, localGroup, domainAccount) 

    Dim localComputer : localComputer = GetMachineName() 
    Dim objLocalGroup 
    Dim objDomainUser 

    const ADS_SECURE_AUTHENTICATION = &h0001 
    const ADS_SERVER_BIND   = &h0200 

    Set objLocalGroup = GetObject("WinNT://" & localComputer  & "/" & localGroup & ",group") 
'Set objDomainUser = GetObject("WinNT://" & domainControllerIP & "/" & domainAccount & ",user") 'ACCESS DENIED 

'Error happens in Set objDomainUser 
' Set objDomainUser = GetObject("WinNT:").OpenDSObject("WinNT://" & domainName & "/" & domainControllerIP & "/" & "Bob", "Bob", "Password", ADS_SECURE_AUTHENTICATION or ADS_SERVER_BIND) 
' Set objDomainUser = GetObject("WinNT:").OpenDSObject("WinNT://" & domainName & "/" & domainControllerIP & "/" & "Bob", "Bob", "Password", ADS_SECURE_AUTHENTICATION or ADS_SERVER_BIND) 
' Set objDomainUser = GetObject("WinNT:").OpenDSObject("WinNT://" & domainName & "/" & domainControllerIP & "/" & ",user", "Bob", "Password", ADS_SECURE_AUTHENTICATION or ADS_SERVER_BIND) 
' Set objDomainUser = GetObject("WinNT:").OpenDSObject("WinNT://" & domainName & "/" & "Bob" & ",user", "Bob", "Password", ADS_SECURE_AUTHENTICATION or ADS_SERVER_BIND) 


    'Add domain user to local group 
    objLocalGroup.Add(objDomainUser.ADsPath) 

    If Err.Number <> 0 Then 
     WScript.Echo Err.Number 
    Else 
     WScript.Echo domainAccount & " has been added to local group." 
    End If 
End Sub 

Merci!

Répondre

2

Vous devriez être en mesure de se connecter à AD en utilisant les informations d'identification explicites contre un DC spécifique comme celui-ci:

Const ADS_SECURE_AUTHENTICATION = &h0001 
Const ADS_SERVER_BIND   = &h0200 

server = "..." 
username = "DOMAIN\user" 
password = "password" 

Set rootDSE = GetObject("LDAP:").OpenDSObject("LDAP://" & server & "/RootDSE" _ 
    , username, password, ADS_SERVER_BIND + ADS_SECURE_AUTHENTICATION) 
base = "<LDAP://" & server & "/" & rootDSE.Get("defaultNamingContext") & ">" 
filter = "(&(objectCategory=person)(objectClass=user))" 
attr = "distinguishedName" 
scope = "subtree" 

Set conn = CreateObject("ADODB.Connection") 
conn.Provider = "ADsDSOObject" 
conn.Properties("User ID") = username 
conn.Properties("Password") = password 
conn.Properties("Encrypt Password") = True 
conn.Properties("ADSI Flag") = ADS_SERVER_BIND + ADS_SECURE_AUTHENTICATION 
conn.Open "Active Directory Provider" 

Set cmd = CreateObject("ADODB.Command") 
Set cmd.ActiveConnection = conn 
cmd.CommandText = base & ";" & filter & ";" & attr & ";" & scope 
cmd.Properties("Page Size") = 100 
cmd.Properties("Timeout") = 30 
cmd.Properties("Cache Results") = False 

Set rs = cmd.Execute 
Do Until rs.EOF 
    'enumerate AD records returned by query 
    rs.MoveNext 
Loop 
rs.Close 

conn.Close 

Voir this article de Richard L. Mueller.

Modifier: Ah, mon erreur. Ce qui précède est pour le fournisseur LDAP, qui ne peut pas gérer les groupes locaux. Un LDAP ADsPath ne peut pas non plus être ajouté à un objet de groupe obtenu du fournisseur WinNT. La raison pour laquelle vos tentatives n'ont pas fonctionné est que vous avez essayé WinNT://DOMAIN/..., mais que vous auriez dû utiliser WinNT://DOMAIN_CONTROLLER/.... Quelque chose comme ça devrait fonctionner:

Const ADS_SECURE_AUTHENTICATION = &h0001 
Const ADS_SERVER_BIND   = &h0200 

dc  = "..." 
username = "DOMAIN\user" 
password = "password" 

domainuser = "Bob" 
localgroup = "Users" 

Set nt = GetObject("WinNT:") 
Set user = nt.OpenDSObject("WinNT://" & dc & "/" & domainuser & ",user" _ 
    , username, password, ADS_SERVER_BIND + ADS_SECURE_AUTHENTICATION) 

GetObject("WinNT://./" & localgroup & ",group").Add user.ADsPath 
+0

Cela m'a beaucoup aidé. Merci Monsieur! – Max

+0

Le seul problème est maintenant comment puis-je obtenir l'objet compte d'utilisateur à l'intérieur de votre boucle? Set objDomainUser = GetObject ("WinNT: //" & ... – Max

+0

bien que j'ai essayé cela avant et il m'a donné "Erreur d'exécution de Microsoft VBScript: Permission denied: 'GetObject'" Gardez à l'esprit que le VBScript (cmd.exe) est en cours d'exécution sous le compte système mais cela ne devrait pas avoir d'importance si je transmets les informations d'identification pour accéder aux objets AD Remarque: Si je cours le script lorsque je suis connecté avec mon compte, le script fonctionne, mais j'ai besoin pour faire ce travail sous compte SYSTEM et passer les informations d'identification à WinNT/LDAP, etc ... – Max

Questions connexes