Logo faq-o-matic.net
Logo faq-o-matic.net

Wie kann ich für alle Benutzer ein Home-Verzeichnis anlegen?

von veröffentlicht am9. November 2003, 08:44 Uhr Kurzlink und Zitatlink einblenden
Kategorie Kategorie: Active Directory, Administration, Scripting   Translate with Google Translate Translate EN   Die angezeigte Seite drucken

Dass beim Anlegen eines Benutzers automatisch ein Home-Verzeichnis (Basisordner) angelegt wird, ist kein Feature des Active Directory, sondern des Verwaltungsprogramms. Es funktioniert daher nur, wenn man manuell im Benutzerkonto einen neuen Home-Pfad einträgt. Das folgende Skript hilft dabei, für alle Benutzer einer Domäne einen Home-Folder (Basisverzeichnis) anzulegen. Dieser erhält auch gleich die passenden Zugriffsrechte.

Dazu liest es alle Benutzerkonten der Domäne aus und generiert eine Batchdatei, in der für jeden user mit "md" ein Ordner angelegt wird, sofern noch keiner existiert. Danach werden mit "cacls" die passenden Berechtigungen gesetzt.

Achtung: Der Besitzer der so generierten Ordner ist derjenige, der das Skript ausführt. Das kann zu Problemen führen, falls der so generierte Home-Folder bei der Ordnerumleitung genutzt werden soll, weil hierfür der jeweilige User auch Besitzer sein muss! Für dieses Problem gibt es mehrere Workarounds:

  1. Das Skript so bearbeiten, dass nach dem Anlegen mit einem externen Tool (z.B. chown) gleich der Besitzer geändert wird.
  2. Nicht cacls.exe einsetzen, sondern xcacls.vbs (gibt es bei Microsoft). Danke für diesen Hinweis an Volker Fenners (Vorname at Nachname .de).

Hier das Skript:

  1. ''''''''''''''''''''''''''''''''''''''''''''''''''
  2. ' Dieses Skript generiert eine Batchdatei, mit der
  3. ' für jeden User einer ADS-Domäne ein Basisordner
  4. ' (Home-Folder) angelegt werden kann.
  5. ' Dazu liest es die NT-Anmeldenamen aus der Domäne
  6. ' aus und schreibt sie als "md"-Befehle in eine
  7. ' Batchdatei. Anschließend werden zwei "cacls"-
  8. ' Kommandos angehängt, mit denen die passenden
  9. ' Berechtigungen gesetzt werden (Administratoren
  10. ' und der User haben Vollzugriff).
  11. '
  12. ' Nutzung auf eigene Gefahr! Keine Gewähr!
  13. '
  14. ' Von Nils Kaczenski (Vorname at Nachname .de)
  15. ' Das Skript verwendet ein ADSI-Beispiel von Microsoft
  16. ' Version 1.1
  17. ' Zuletzt geändert am: 9. 9. 2003
  18. ''''''''''''''''''''''''''''''''''''''''''''''''''
  19.  
  20. Dim Con 'As ADODB.Connection
  21. Dim ocommand 'As ADODB.Command
  22. Dim gc 'As IADs
  23.  
  24. strAdminGroupName = "Administratoren" ' US-Windows: "Administrators"
  25. strYesChar = "j" ' US-Windows: "y"
  26.  
  27. On Error Resume Next
  28.  
  29. 'Create ADO connection object for Active Directory
  30. Set Con = CreateObject("ADODB.Connection")
  31.   If (Err.Number <> 0) Then
  32.      BailOnFailure Err.Number, "on CreateObject"
  33.   End If
  34. Con.Provider = "ADsDSOObject"
  35.   If (Err.Number <> 0) Then
  36.      BailOnFailure Err.Number, "on Provider"
  37.   End If
  38. Con.Open "Active Directory Provider"
  39.   If (Err.Number <> 0) Then
  40.      BailOnFailure Err.Number, "on Open"
  41.   End If
  42.  
  43. 'Create ADO command object for the connection.
  44. Set ocommand = CreateObject("ADODB.Command")
  45.   If (Err.Number <> 0) Then
  46.      BailOnFailure Err.Number, "on CreateObject"
  47.   End If
  48. ocommand.ActiveConnection = Con
  49.   If (Err.Number <> 0) Then
  50.      BailOnFailure Err.Number, "on Active Connection"
  51.   End If
  52.  
  53. 'Get the ADsPath for the domain to search.
  54. Set root = GetObject("LDAP://rootDSE")
  55.   If (Err.Number <> 0) Then
  56.      BailOnFailure Err.Number, "on GetObject for rootDSE"
  57.   End If
  58. sDomain = root.Get("defaultNamingContext")
  59.   If (Err.Number <> 0) Then
  60.      BailOnFailure Err.Number, "on Get on defaultNamingContext"
  61.   End If
  62. Set domain = GetObject("LDAP://" & sDomain)
  63.   If (Err.Number <> 0) Then
  64.      BailOnFailure Err.Number, "on GetObject for domain"
  65.   End If
  66.  
  67. 'Abfragen
  68.  
  69. strSQL = "SELECT sAMAccountName FROM '"
  70. strSQL = strSQL & "LDAP://" & sDomain _
  71.    & "' WHERE objectClass='user' and objectCategory='person'"
  72.  
  73. ' msgBox strSQL
  74.  
  75. 'Assemble the commandtext.
  76. ocommand.CommandText = strSQL
  77.   If (Err.Number <> 0) Then
  78.      BailOnFailure Err.Number, "on CommandText"
  79.   End If
  80.  
  81. 'Execute the query.
  82. Set rs = ocommand.Execute
  83.   If (Err.Number <> 0) Then
  84.      BailOnFailure Err.Number, "on Execute"
  85.   End If
  86.  
  87. intNumDisplay = 0
  88. intCount = 0
  89.  
  90. on error goto 0
  91.  
  92. ' Navigate the record set
  93. rs.MoveFirst
  94. While Not rs.EOF
  95.     intCount = intCount + 1
  96.     For i = 0 To rs.Fields.Count1
  97.           strText = strText & "if not exist """ _
  98.             & rs.Fields(i).Value & """ md """ _
  99.             & rs.Fields(i).Value & """" & vbCrLf
  100.     Next
  101.     intNumDisplay = intNumDisplay + 1
  102.     rs.MoveNext
  103. Wend
  104.  
  105. strScriptPfad = WScript.ScriptFullName
  106. strDateiPfad = left(strScriptPfad, InstrRev(strScriptPfad, "\"))
  107.  
  108. set objFSO = CreateObject("Scripting.FileSystemObject")
  109. with objFSO
  110.     strDateiName = .BuildPath(strDateiPfad, "homes.bat")
  111.     set objDatei = .CreateTextFile(strDateiName)
  112. end with
  113.  
  114. objDatei.write strText
  115. objDatei.writeLine "echo " & strYesChar & "|cacls *.* /T /G " _
  116.   & strAdminGroupName & ":F"
  117. objDatei.writeLine "for /R %%I in (.) do cacls ""%%I"" " _
  118.   & "/T /E /G ""%userdomain%\%%~nI"":F"
  119.  
  120. objDatei.close
  121.  
  122. strErfolg = "Fertig!" & vbCrLf
  123. strErfolg = strErfolg & "Datei gespeichert unter " & strDateiname & vbCrLf
  124. strErfolg = strErfolg & "Diese Datei muss im Root der Home-Freigabe ausgeführt werden."
  125. wscript.echo strErfolg
  126.  
  127.  
  128. '''''''''''''''''''''''''''''''''''''''
  129. 'Display subroutines
  130. '''''''''''''''''''''''''''''''''''''''
  131.  
  132. Sub BailOnFailure(ErrNum, ErrText)    strText = "Error 0x" & Hex(ErrNum) & " " & ErrText
  133.     MsgBox strText, vbInformation, "ADSI Error"
  134.     WScript.Quit
  135. End Sub

© 2005-2019 bei faq-o-matic.net. Alle Rechte an den Texten liegen bei deren Autorinnen und Autoren.

Jede Wiederveröffentlichung der Texte oder von Auszügen daraus - egal ob kommerziell oder nicht - bedarf der ausdrücklichen Genehmigung durch die jeweiligen Urheberinnen oder Urheber.

Das Impressum findet sich unter: http://www.faq-o-matic.net/impressum/

Danke, dass du faq-o-matic.net nutzt. Du hast ein einfaches Blog sehr glücklich gemacht!