42Hz
Aktiv medlem
[OT] Någon som har koll på AD+LDAP+VBS?
Dags för något mindre OT än fioler och banker! Många som hänger på happy jobbar med datorer så nu har jag en fråga till dom som har koll på AD och LDAP, samt förhoppningsvis lite VBscript. =)
Vad jag vill göra är att lista alla grupper som ett datorobjekt är medlem i, för att sedan lägga dessa på en annan dator så att den är med i samma grupper som den första datorn.
Jag har hittat ett skript som gör exakt det jag vill, bara det att den fungerar enbart med användarobjekt. Man exekuerar exekverar skriptet med användarnamnen man vill kopiera grupptillhörigheterna ifrån och till, som argument: CopyMembership.vbs user1 user2
Har ögnat igenom skriptet och bytt ut user-argumenten(?) till computer-argument men får bara svaret att objektnamnet inte går att hitta. Försökt se om det någonstans finns något som gör att detta enbart fungerar på användarobjekt men gått bet trots idogt googlande, kan för lite om ADSI och LDAP.
Skriptet jag använder finns här: http://windowsitpro.com/article/art...-memberships-from-one-ad-user-to-another.html
Skriptet ser ut såhär:
(Kan det ha något med bland annat ADS_NAME_TYPE_1179 att göra? Med fet stil i botten av scriptet)
' Listing 1: CopyMembership.vbs
On Error Resume Next
Const E_ADS_PROPERTY_NOT_FOUND = &h8000500D
If WScript.Arguments.Count < 2 Then
WScript.Echo "cscript copymembership.vbs <ntid1> <ntid2>"
WScript.Quit
End If
' Convert ntid1 into a DN, bind to LDAP, and check for
' ntid1's existence in AD.
' ******* BEGIN CALLOUT A *******
dn_ntid1 = dn(WScript.Arguments(0))
' ******* END CALLOUT A *******
Set objuser1 = GetObject("LDAP://" & dn_ntid1)
If Err.Number <> 0 Then
On Error GoTo 0
WScript.Echo "NT ID not found : " & WScript.Arguments(0)
WScript.Quit
End If
' Convert ntid2 into a DN, bind to LDAP, and check for
' ntid2's existence in AD.
' ******* BEGIN CALLOUT B *******
dn_ntid2 = dn(WScript.Arguments(1))
' ******* END CALLOUT B *******
Set objuser2 = GetObject("LDAP://" & dn_ntid2)
If Err.Number <> 0 Then
On Error GoTo 0
WScript.Echo "NT ID not found : " & WScript.Arguments(1)
WScript.Quit
End If
' ******* BEGIN CALLOUT C *******
' Get ntid1's group membership.
arrMemberOf = objUser1.GetEx("memberOf")
If Err.Number <> E_ADS_PROPERTY_NOT_FOUND Then
For Each Group in arrMemberOf
' Copy membership of ntid1 to ntid2.
' Group and ntid2 already in DN syntax.
add group,dn_ntid2
Next
Else
WScript.Echo "No global group found in NT ID : " & WScript.Arguments(0)
Err.Clear
WScript.Quit
End If
' ******* END CALLOUT C *******
' Subroutines and functions
Sub add(group,ntid2)
Const ADS_PROPERTY_APPEND = 3
Set objgroup=GetObject("LDAP://" & group)
objgroup.PutEx ADS_PROPERTY_APPEND, "member", Array(ntid2)
objGroup.SetInfo
WScript.Echo "NT ID " & objuser2.sAMAccountName & _
" successfully added into : " & objgroup.sAMAccountName
End Sub
' ******* BEGIN CALLOUT D *******
Function dn(ntid)
Dim objrootdse, strdnsdomain, objtrans, strnetbiosdomain
Dim struserdn, objuser
' Declare the constants for ADSI's NameTranslate object.
Const ADS_NAME_INITTYPE_DOMAIN = 1
Const ADS_NAME_TYPE_NT4 = 3
Const ADS_NAME_TYPE_1179 = 1
' Determine the DNS domain name from the RootDSE object.
Set objrootdse = GetObject("LDAP://RootDSE")
strdnsdomain = objrootdse.Get("DefaultNamingContext")
' Create the NameTranslate object, then use it to obtain the
' NetBIOS domain name from the DNS domain name.
Set objtrans = CreateObject("NameTranslate")
objtrans.init ADS_NAME_TYPE_NT4, strdnsdomain
objtrans.set ADS_NAME_TYPE_1179, strdnsdomain
strnetbiosdomain = objtrans.Get(ADS_NAME_TYPE_NT4)
' Remove the backslash.
strnetbiosdomain = Left(strnetbiosdomain, Len(strnetbiosdomain)-1)
' Use the NameTranslate object to convert the username to the DN
' for the LDAP provider.
objtrans.init ADS_NAME_INITTYPE_DOMAIN, strnetbiosdomain
objtrans.set ADS_NAME_TYPE_NT4, strnetbiosdomain & "\" & ntid
struserdn=objtrans.Get(ADS_NAME_TYPE_1179)
Set objUser = GetObject("LDAP://" & strUserDN)
dn = objuser.distinguishedname
End Function
' ******* END CALLOUT D *******
76b
Vad jag vill göra är att lista alla grupper som ett datorobjekt är medlem i, för att sedan lägga dessa på en annan dator så att den är med i samma grupper som den första datorn.
Jag har hittat ett skript som gör exakt det jag vill, bara det att den fungerar enbart med användarobjekt. Man exekuerar exekverar skriptet med användarnamnen man vill kopiera grupptillhörigheterna ifrån och till, som argument: CopyMembership.vbs user1 user2
Har ögnat igenom skriptet och bytt ut user-argumenten(?) till computer-argument men får bara svaret att objektnamnet inte går att hitta. Försökt se om det någonstans finns något som gör att detta enbart fungerar på användarobjekt men gått bet trots idogt googlande, kan för lite om ADSI och LDAP.
Skriptet jag använder finns här: http://windowsitpro.com/article/art...-memberships-from-one-ad-user-to-another.html
Skriptet ser ut såhär:
(Kan det ha något med bland annat ADS_NAME_TYPE_1179 att göra? Med fet stil i botten av scriptet)
' Listing 1: CopyMembership.vbs
On Error Resume Next
Const E_ADS_PROPERTY_NOT_FOUND = &h8000500D
If WScript.Arguments.Count < 2 Then
WScript.Echo "cscript copymembership.vbs <ntid1> <ntid2>"
WScript.Quit
End If
' Convert ntid1 into a DN, bind to LDAP, and check for
' ntid1's existence in AD.
' ******* BEGIN CALLOUT A *******
dn_ntid1 = dn(WScript.Arguments(0))
' ******* END CALLOUT A *******
Set objuser1 = GetObject("LDAP://" & dn_ntid1)
If Err.Number <> 0 Then
On Error GoTo 0
WScript.Echo "NT ID not found : " & WScript.Arguments(0)
WScript.Quit
End If
' Convert ntid2 into a DN, bind to LDAP, and check for
' ntid2's existence in AD.
' ******* BEGIN CALLOUT B *******
dn_ntid2 = dn(WScript.Arguments(1))
' ******* END CALLOUT B *******
Set objuser2 = GetObject("LDAP://" & dn_ntid2)
If Err.Number <> 0 Then
On Error GoTo 0
WScript.Echo "NT ID not found : " & WScript.Arguments(1)
WScript.Quit
End If
' ******* BEGIN CALLOUT C *******
' Get ntid1's group membership.
arrMemberOf = objUser1.GetEx("memberOf")
If Err.Number <> E_ADS_PROPERTY_NOT_FOUND Then
For Each Group in arrMemberOf
' Copy membership of ntid1 to ntid2.
' Group and ntid2 already in DN syntax.
add group,dn_ntid2
Next
Else
WScript.Echo "No global group found in NT ID : " & WScript.Arguments(0)
Err.Clear
WScript.Quit
End If
' ******* END CALLOUT C *******
' Subroutines and functions
Sub add(group,ntid2)
Const ADS_PROPERTY_APPEND = 3
Set objgroup=GetObject("LDAP://" & group)
objgroup.PutEx ADS_PROPERTY_APPEND, "member", Array(ntid2)
objGroup.SetInfo
WScript.Echo "NT ID " & objuser2.sAMAccountName & _
" successfully added into : " & objgroup.sAMAccountName
End Sub
' ******* BEGIN CALLOUT D *******
Function dn(ntid)
Dim objrootdse, strdnsdomain, objtrans, strnetbiosdomain
Dim struserdn, objuser
' Declare the constants for ADSI's NameTranslate object.
Const ADS_NAME_INITTYPE_DOMAIN = 1
Const ADS_NAME_TYPE_NT4 = 3
Const ADS_NAME_TYPE_1179 = 1
' Determine the DNS domain name from the RootDSE object.
Set objrootdse = GetObject("LDAP://RootDSE")
strdnsdomain = objrootdse.Get("DefaultNamingContext")
' Create the NameTranslate object, then use it to obtain the
' NetBIOS domain name from the DNS domain name.
Set objtrans = CreateObject("NameTranslate")
objtrans.init ADS_NAME_TYPE_NT4, strdnsdomain
objtrans.set ADS_NAME_TYPE_1179, strdnsdomain
strnetbiosdomain = objtrans.Get(ADS_NAME_TYPE_NT4)
' Remove the backslash.
strnetbiosdomain = Left(strnetbiosdomain, Len(strnetbiosdomain)-1)
' Use the NameTranslate object to convert the username to the DN
' for the LDAP provider.
objtrans.init ADS_NAME_INITTYPE_DOMAIN, strnetbiosdomain
objtrans.set ADS_NAME_TYPE_NT4, strnetbiosdomain & "\" & ntid
struserdn=objtrans.Get(ADS_NAME_TYPE_1179)
Set objUser = GetObject("LDAP://" & strUserDN)
dn = objuser.distinguishedname
End Function
' ******* END CALLOUT D *******
76b

