Scenario: avevo bisogno di modificare un attributo LDAP secondario, uno di quelli che trovi solo quando abiliti l’opzione “Advanced Features” nella console di Active Directory sul domain controller del tuo ufficio. Il problema è che –almeno su Windows 2008 (R2)– la scheda degli attributi (Attribute Editor) compare solo se apri la scheda utente muovendoti manualmente tra le OU, non la vedi comparire invece se quella scheda la apri in seguito alla ricerca rapida.
Per questo motivo ho accorpato qualche riga di codice VBScript che mi ha permesso di velocizzare l’operazione, sotto un tetto .vbs
unico che ti richiederà il nome utente, visualizzerà il valore attuale dell’attributo e ti permetterà di modificarlo con quello che preferisci. Questo esempio d’uso (che è modellato per il mio caso specifico) agisce sul campo “personalTitle“, ma è chiaramente sostituibile con qualsiasi altro campo disponibile (principale o secondario), e in linea di massima lo script è ulteriormente modificabile per fare più operazioni, per effettuare cicli di sostituzioni e molto altro ancora, prendilo quindi solo come base (mancano una serie di controlli di sicurezza, tanto per dire).
Il codice
Pubblicato su Gist per comodità (così lo vedrai sempre aggiornato nel caso in cui ci dovessero essere modifiche future), te lo propongo qui di seguito:
' "personalTitle" Modifier (LDAP attibute) | |
' ----------------------------------------------------------------------------------------------------------- | |
' Autore: GSolone | |
' Versione: 0.1 | |
' Utilizzo: .\personalTitleModifier.vbs | |
' .\personalTitleModifier.vbs mario.rossi | |
' ATTENZIONE: utilizzare -se possibile- direttamente sul DC | |
' Ultima modifica: 27-02-2018 | |
' ----------------------------------------------------------------------------------------------------------- | |
' Fonti utilizzate: | |
' https://social.technet.microsoft.com/Forums/scriptcenter/en-US/defcd4c8-1d6f-429c-b5d2-e8b66e857d60/reading-custom-attributes-from-ad-using-vbscript?forum=ITCG | |
' https://social.technet.microsoft.com/Forums/scriptcenter/en-US/64466490-346e-4ceb-945c-58b957b5f8de/vbscript-modify-custom-attribute-for-all-users-in-domain?forum=ITCG | |
' https://stackoverflow.com/questions/27347045/vbscript-inputbox-how-to-identify-when-the-cancel-button-is-pressed | |
' http://www.pierotofy.it/pages/guide/Guida_VBScript/Le_MsgBox/ | |
' | |
' ------------------------------------------------------------------------------------------------------------ | |
' Modifiche: | |
' - | |
set WshShell = CreateObject("WScript.Shell") | |
' Constants for the NameTranslate object. | |
Const ADS_NAME_INITTYPE_GC = 3 | |
Const ADS_NAME_TYPE_NT4 = 3 | |
Const ADS_NAME_TYPE_1779 = 1 | |
' Determine DNS name of domain from RootDSE. | |
Set objRootDSE = GetObject("LDAP://RootDSE") | |
strDNSDomain = objRootDSE.Get("defaultNamingContext") | |
' Use the NameTranslate object to find the NetBIOS domain name from the | |
' DNS domain name. | |
Set objTrans = CreateObject("NameTranslate") | |
objTrans.Init ADS_NAME_INITTYPE_GC, "" | |
objTrans.Set ADS_NAME_TYPE_1779, strDNSDomain | |
strNetBIOSDomain = objTrans.Get(ADS_NAME_TYPE_NT4) | |
' Remove trailing backslash. | |
strNetBIOSDomain = Left(strNetBIOSDomain, Len(strNetBIOSDomain) - 1) | |
if WScript.Arguments.Count = 0 then | |
strName = InputBox("Enter domain username" & vbCrLf & "(ex: rossi)", "personalTitleModifier") | |
else | |
strName = Wscript.Arguments(0) | |
end if | |
' Use the Set method to specify the NT format of the user name. | |
' Trap error if user does not exist. | |
On Error Resume Next | |
objTrans.Set ADS_NAME_TYPE_NT4, strNetBIOSDomain & "\" & strName | |
If (Err.Number <> 0) Then | |
On Error GoTo 0 | |
'DEBUG | |
'Wscript.Echo "User " & strNTName & " does not exist" | |
MsgBox strNTName & " does not exist",vbCritical,"personalTitleModifier" | |
Wscript.Quit | |
End If | |
On Error GoTo 0 | |
' Use the Get method to retrieve the RPC 1779 Distinguished Name. | |
strUserDN = objTrans.Get(ADS_NAME_TYPE_1779) | |
' Bind to the user object. | |
Set objUser = GetObject("LDAP://" & strUserDN) | |
' DEBUG: Display attribute of user. | |
'Wscript.Echo objUser.personalTitle | |
Dim strPersonalTitle | |
strPersonalTitle = InputBox("Current title: " & objUser.personalTitle & vbCrLf & vbCrLf & "Enter new personalTitle (clic on Cancel OR press ESC to quit)", "personalTitleModifier", objUser.personalTitle) | |
If IsEmpty(strPersonalTitle) Then | |
'cancelled | |
MsgBox "Operation has been cancelled",vbExclamation,"personalTitleModifier" | |
Else | |
'something has entered even zero-length | |
objUser.Put "personalTitle", strPersonalTitle | |
objUser.SetInfo | |
MsgBox objUser.DisplayName & " is now " & objUser.personalTitle,vbInformation,"personalTitleModifier" | |
'DEBUG | |
'Wscript.Echo objUser.personalTitle | |
End If |
Puoi scaricare il file VBS direttamente facendo clic qui, anche se è più opportuno andare su Gist e fare clic su Download ZIP
per ottenere sempre la versione più aggiornata (pulsante in alto a destra, nda).
Per qualsiasi dubbio, consiglio o ulteriore informazione, l’area commenti è sempre a tua disposizione.
Buon lavoro!
Immagine di copertina: unsplash.com / author: Markus Spiske
L'articolo potrebbe non essere aggiornato
Questo post è stato scritto più di 5 mesi fa, potrebbe non essere aggiornato. Per qualsiasi dubbio ti invito a lasciare un commento per chiedere ulteriori informazioni! :-)