1

それを教える何百もの記事がありますが、私のケースは「ユニーク」です。そのため、以下の行でアクセスが拒否されていました。

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

そのため、ユーザーの資格情報を渡す必要があることに気付きました。ほとんどの人は DomainName のみを渡しますが、これで問題ありません。環境変数 %LOGONSERVER% を見ることで認識できるドメイン コントローラに接続します。ドメイン コントローラ名 (または IP) を指定する必要があります。指定しないと機能しません。

したがって、私はこのシンタックスを正しくしようとしています。これが私のコードです:

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

ありがとうございました!

4

1 に答える 1

2

次のように、特定の DC に対して明示的な資格情報を使用して AD に接続できるはずです。

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

Richard L. Mueller のこの記事を参照してください。

編集:ああ、私の間違いです。上記は、ローカル グループを処理できない LDAP プロバイダー用です。また、WinNT プロバイダーから取得したグループ オブジェクトに LDAPADsPathを追加することはできません。あなたの試みがうまくいかなかった理由は、あなたが を試みたがWinNT://DOMAIN/...、 を使うべきだったからですWinNT://DOMAIN_CONTROLLER/...。このようなものが動作するはずです:

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
于 2013-02-21T10:51:59.917 に答える