von postNorbert Fehlauer post27. Februar 2007, 16:00 Uhr
post Kategorie: AD: Daten ändern, Active Directory, Scripting

Basierend auf dem Artikel "Eigene Funktionen in die AD-Tools integrieren" von Nils habe ich das dort vefügbare Beispiel erweitert. Zweck dieser Erweiterung ist es, das extensionAttribute3 modifzieren zu können. Im konkreten Fall wird dieses Attribut genutzt, um eine Kostenstellenzuordnung für eine Cisco-VOIP-Telefonanlage zu schaffen.

Ziel ist es, diese Kostenstelle mittels Kontextmenü direkt über das Nutzerobjekt in Active Directory modifizieren zu können. Hierzu zählt auch die Möglichkeit, einen einmal gesetzten Wert auch komplett löschen zu können.

Das folgende Skript speichert man als extension3.hta z. B. unter c:\windows\system32 ab.

Die Löschroutine löscht den gesetzten Wert ohne nochmalige Sicherheitsabfrage. Also bitte aufpassen. ;)

——– Extension3.hta —————-

  1. <HTML>
  2. <HEAD>
  3.   <TITLE></TITLE>
  4.   <HTA:APPLICATION ID="oHTA">
  5.   <META NAME="author" CONTENT="Nils Kaczenski und Norbert Fehlauer">
  6. </HEAD>
  7. <BODY onload="start();">
  8. <H2 ID="head"></H2>
  9. <TABLE>
  10.   <TR>
  11.   <TD>Benutzer:</TD>
  12.   <TD><P ID="anzeige"></P></TD>
  13.   </TR>
  14.   <TR>
  15.   <TD>[K]ostenstelle</TD>
  16.   <TD><input ID="Kosten" accesskey="k"></TD>
  17.   </TR>
  18.   <TR>
  19.   <TD><button onclick="eintragen();"accesskey="e"><U>E</U>intragen</button></TD>
  20.   <TD><button onclick="window.close();"accesskey="s"><U>S</U>chließen</button></TD>
  21.   <TD><button onclick="loeschen();"accesskey="l"><U>L</U>öschen</button></TD>
  22.   </TR>
  23. </TABLE>
  24. <BR clear="all">
  25. <HR>
  26. <P Class="klein"2003-2007 Nils Kaczenski und Norbert Fehlauer - keine Gewähr! Nutzung auf eigene Gefahr!</P>
  27. <SCRIPT language="VBScript">
  28. Dim rootDSE
  29. Dim objUsr
  30. dim strUserDN
  31. const ADS_PROPERTY_CLEAR = 1
  32. strAdsPath = ""
  33. strTitel = "Kostenstelle eintragen"
  34. Function auswerten()
  35.   strText = oHTA.CommandLine
  36.   ' CommandLine enthält, durch Blanks getrennt:
  37.   ' - Pfad der HTA-Datei (in Anführungsstrichen)
  38.   ' - LDAP-Pfad des AD-Objekts (fallweise mit Anführungsstrichen; inkl.Serverangabe)
  39.   ' - Objektklasse ' Das macht die Auswertung etwas aufwändig:
  40.   intPosUser = InStrRev(strText," user")
  41.   intPosLDAP = inStr(strText, "LDAP://")
  42.   if intPosUser <> 0 then 'ist ein Benutzerobjekt
  43.   auswerten = mid(strText, intPosLDAP, intPosUser - intPosLDAP)
  44.   auswerten = replace(trim(auswerten),"""","")
  45.   ' Jetzt sind Gänsefüßchen und Leerzeichen am Anfang/Ende weg
  46.   ' auswertung enthält nur noch den distinguishedName,
  47.   ' der weiter verwendet werden kann
  48.   else
  49.   msgBox "Kein User angegeben!"
  50.   exit function
  51.   end if
  52. End Function
  53. Sub start()
  54.   ' Funktion:
  55.   ' Eingabeparameter:
  56.   ' Kommentar:
  57.   window.resizeTo 400,200
  58.   document.title = strTitel
  59.   arrText = auswerten
  60.   strUserDN = auswerten
  61.   if strUserDN = "" then
  62.   document.all.anzeige.innerText = "keine Argumente"
  63.   Exit Sub
  64.   End If
  65.   Set rootDSE = GetObject("LDAP://RootDSE")
  66.   strDomainname = rootDSE.Get("defaultnamingcontext")
  67.   Set domain = GetObject("LDAP://" & strDomainname)
  68.   Set objUsr = GetObject(strUserDN)
  69.   strName = objUsr.get("displayName")
  70.   document.title = strTitel & ": " & strSamName
  71.   On Error Resume Next
  72.   strKostenstelle = objUsr.get("extensionAttribute3")
  73.   if err.number <> 0 then Err.clear ' kein Eintrag da!
  74.   On Error Goto 0
  75.   document.all.anzeige.innerText = strName
  76.   if strKostenstelle <> "" then document.all.Kosten.value = strKostenstelle
  77. End Sub
  78. Sub eintragen()
  79.   ' Funktion:
  80.   ' Eingabeparameter:
  81.   ' Kommentar:
  82.   If strUserDN = "" Then
  83.   MsgBox "Kein User angegeben!"
  84.   Exit Sub
  85.   End If
  86.   strCheck = document.all.Kosten.value
  87.   If IsNumeric(strCheck) Then
  88.   objUsr.Put "extensionAttribute3", strCheck
  89.   objUsr.SetInfo
  90.   MsgBox "Kostenstelle eingetragen!", vbInformation, strTitle
  91.   window.close
  92.   Else
  93.   MsgBox "Keine Zahl angegeben: " & strCheck, vbCritical, strTitle
  94.   End If
  95. End Sub
  96. Sub loeschen()
  97.   ' Funktion:
  98.   ' Eingabeparameter:
  99.   ' Kommentar:
  100.   If strUserDN = "" Then
  101.   MsgBox "Kein User angegeben!"
  102.   Exit Sub
  103.   End If
  104.   objUsr.PutEx ADS_PROPERTY_CLEAR, "extensionAttribute3", vbNullString
  105.   objUsr.SetInfo
  106.   MsgBox "Kostenstelle gelöscht!", vbInformation, strTitle
  107.   window.close
  108. End Sub
  109. </SCRIPT>
  110. </BODY>
  111. </HTML>

——– Extension3.hta —————-
Mit folgendem Script wird die extension3.hta im Rechtsklickmenü verfügbar. Hierzu adminmenu.vbs ausführen. Der Wert "strValue", der angibt, wie der Menüpunkt heißen soll, muss entsprechend angepasst werden.
——— Adminmenu.vbs ———————

  1. Set root= GetObject("LDAP://rootDSE")
  2. strConfig = root.Get("configurationNamingContext")
  3. strPath = "LDAP://cn=user-Display,cn=407,cn=DisplaySpecifiers," & strConfig
  4. Set obj= GetObject(strPath)
  5. strValue = "5,Kostenstelle modifizieren,Extension3.hta"
  6. arrValue = Array(strValue)
  7. obj.PutEx 3, "adminContextMenu", arrValue
  8. obj.SetInfo
  9. msgBox "Kontextmenüeintrag hinzugefügt: " & strValue