Archiv der Kategorie: Scripts

Home Directorys auf anderen Fileserver übersiedeln – Änderungen im AD per Script

Script zur Automatisierung des Eintrags von Homedrives bei Active Directory Usern

(z. B. im Falle einer Fileserver-Migration, einer Änderung des Laufwerksbuchstabens, Umstieg auf DFS  o. ä.)
  1. Share auf neuen Ordner einrichten
  2. Kopie der Daten mit
    (das Folgende ist als Vorschlag zu betrachten – bitte selbst die Flags prüfen…)
    xcopy quelle ziel /Y /O /H /F /I /C /S
  3. oder
    Ordner mit Total-Commander auf den neuen Server kopieren (ACHTUNG: muss mit einem Benutzer [Domänen-Admin?] gemacht werden, der auch Leserechte auf den Ordnern besitzt
    (Kontrolle: Sicherheitseinstellungen auf den Homeshares der Benutzer…) 

    WICHTIG WICHTIG WICHTIG:
    Das Hakerl muss bei „NTFS-Berechtigungen kopieren“ gesetzt sein!!!!!
  4. Folgendes Script „HomeDirecotryChanger.vbs“ über die Einträge im Active Directory laufen lassen, damit die User beim nächsten Login auch die richtigen Ordner gemappt bekommen…
    [ Script ist ein Sammelsurium aus Eigenem und Fremdem  – die „Ablage“ hier dient lediglich dazu, dass ich es nicht selbst immer suchen muss, wenn ichs wieder brauche…]
    btw: man könnte das auch mit der Powershell erledigen…
  5. Es gibt im Ordner ein schönes Logfile, mit dessen Hilfe man überprüfen kann, ob es bei manchen Usern Troubles gab (weil er zB bisher gar kein Homedrive eingetragen hatte oder ähnliches!)
'###########################################################################
'# Usage:
'#  als    homedirectorychanger.vbs      an beliebiger Stelle auf einem Client speichern
'#
'# Variablen, die geändert werden MÜSSEN
'# ACHTUNG: strOU ist in 'verkehrter' Reihenfolge, dh:
'# strOU = "OU=1A,OU=Schueler,OU=benutzer," steht für alle User,
'# die in der OU=TEST sind, die wiederum in der OU= Benutzer liegt
'# Hier findest Du zusätzliche Infos zu LDAP-Attributen:
'# http://www.computerperformance.co.uk/Logon/LDAP_attributes_active_directory.htm

strOU = "OU=benutzer,"   'ACHTUNG auf den Beistrich!!
OldServer = "hp-y"
MyNewServer = "idefix"
HomeDriveKey = "H:"

'# Ab hier nur mehr für Auskenner veränderbar...
'############################################################################
on error resume next
Dim rootDSE, domainObject
Set rootDSE = GetObject("LDAP://RootDSE")
domainContainer = rootDSE.Get("defaultNamingContext")
Set domainObject = GetObject("LDAP://" & strOU & domainContainer)

Set fs = CreateObject ("Scripting.FileSystemObject")
Set outFile = fs.CreateTextFile (".\logfile_ADKonten.txt")

exportUsers(domainObject)

Set oDomain = Nothing

Sub ExportUsers(oObject)
on error resume next
   Dim oUser
   For Each oUser in oObject
      Select Case oUser.Class
         Case "user"

			call changeHomeDirectory(oUser.distinguishedName, oUser.homeDirectory)

         Case "organizationalUnit" , "container"

			ExportUsers(oUser)
      End select
   Next
End Sub

sub changeHomeDirectory(myUser, myHomeDirectory)

On Error Resume Next
Err.Clear

	Set objUser = GetObject("LDAP://"& myUser)
	myNEWHomeDirectory = replace(myHomeDirectory, OldServer, MyNewServer, 1, -1, 1)
	wscript.sleep 10
	objUser.Put "homeDirectory", myNEWHomeDirectory
	wscript.sleep 10
	objUser.Put "homeDrive", HomeDriveKey
	wscript.sleep 10
	objUser.SetInfo
	wscript.sleep 20

	outfile.WriteLine  "Set objUser = GetObject(""LDAP://"& myUser &"," & strOU & domainContainer & CHR(34) & ")"
	outfile.WriteLine  "objUser.Put ""homeDirectory"", " & CHR(34) & myNEWHomeDirectory & CHR(34)
	outfile.WriteLine  "objUser.Put ""homeDrive"", " & CHR(34) & HomeDriveKey & CHR(34)
	if  Err.Number <> 0  then
       outfile.WriteLine   "Fehler: Error number: " & Err.Number & "    Error description: " & Err.Description
	end if

	outfile.WriteLine "_____"

end Sub
WScript.Quit
wscript.echo "Done"

User im AD inkl. Shares und Loginscript mittels .csv anlegen

Introduction
User_via_csv_anlegen.vbs ist ein Tool, mit dessen Hilfe man einfach und bequem eine beliebige Anzahl von Usern im Active Directory anlegen kann. Voraussetzung ist ein funktionierendes AD sowie eine csv-Datei, in der sowohl die Benutzernamen als auch die zugehörige Abteilung (bzw. Schulklasse) vermerkt sind.
 
[User_via_csv_anlegen.vbs is a Tool, that creates Users in an Active Directory Environment, which are first defined in a .csv. It also generates a complex 10-digits-long Password for each user and 2 Shares on a defined Server. A LoginScript will be written in the SYSVOL-Share, each User will be Member of an Organizational Unit and also a Security-Group, that is predefined in the .csv.
When work is done, the Administrator will find a password.csv in the directory, where he started User_via_csv_anlegen.vbs, which has all Users, Organizational Units and Passwords in it.
Have fun, using it…]
 

Das Skript hat folgende Features:

  • Die Benutzernamen werden aus einer .csv ausgelesen
  • Falls ein Benutzer im AD bereits vorhanden ist, wird man zur Änderung des Namens aufgefordert
  • Es wird am Domänencontroller bzw. im AD folgendes erstellt:
     
    • 2 Shares – eines als Homedrive, das zweite mit Leserechten für alle
    • für jede Abteilung / Schulklasse eine eigene OU (Organizational Unit)
    • eine Sicherheitsgruppe für jede Abteilung bzw. Schulklasse
    • ein 10stelliges, hochkomplexes Passwort wird generiert
    • ein Loginscript.bat im SYSVOL, welches die User zugewiesen bekommen
       
  • jeder Benutzer wird im Active Directory in der entsprechenden OU angelegt
  • Es werden die entsprechenden Sicherheitsberechtigungen auf den Ordnern erstellt
  • Zusätzlich zu den Admins erhält eine weitere Gruppe (Chefabteilung,  Lehrer) erhöhten Zugriff auf die Ordner
  • Es wird eine Datei mit allen Usernamen und Passwörtern generiert

Runs on:
Domänencontroller ab Windows Server 2003

Usage:

  • Das Skript in einen Ordner auf einem Domänencontroller speichern
  • im selben Ordner eine Datei namens meineUser.csv anlegen
  • die gewünschten User in die Datei meineUser.csv wie folgt schreiben:
Benutzername;Klasse
Max.Mustermann;1AK
Maxima.Musterfrau;1BK 

  • Anmerkung: während der Laufzeit erscheint keinerlei Meldung!
    Dies kann und wird – abhängig von der Useranzahl mehrere Minuten dauern!!!
    Ein Hinweis über die erfolgreiche Abarbeitung inkl. Anzahl der Benutzer erfolgt nach beendeter Arbeit!!!
     
  • rechtlicher Hinweis: Die Verwendung des Tools erfolgt auf eigene Gefahr, ich übernehme KEINE HAFTUNG für Schäden jedweder Art!!!
     

[Save the user_via_csv_anlegen.vbs whereever you want on one of your Domain Controllers. Put a meineUser.csv in the same Directory, which has all your Users in it. They must be written in the following way:
username;OrganizationalUnit
Run the Script by dobbleclicking, wait some Minutes (there will be NO messages during the work, except, a Username is allready existing. After the Script has run through, you will see a Message on your screen, telling you the number of created Users – and you will find a file named password.csv in the Directory, where you saved the script. ]
Keep in mind: You run this Script on your own risk! I do NOT assume any liability!

Download:

QuellCode:

'#################################################################################################################
'### Script, um User aus einer .csv per Skript im AD mit 10-stelligen, komplexem Passwort anlegen              ###
'### getestet auf Windows Server 2003 SP2, Server2003 R2 u 2008 R2 (jeweils Deutsch)                           ###
'### Ver 10/11/2012_01:03                                                                                        ###
'#################################################################################################################

'Set objComputer = CreateObject("Shell.LocalMachine")         ' nicht verändern!
Set objComputer = CreateObject("Wscript.Network")

'### folgende Variablen können (müssen abern nicht) verändert werden: ##

  ServerName = objComputer.Computername                          'Server, auf dem die Shares erstellt wurden; falls nicht anders
                                                                'angegeben, der DC auf dem das Script gestartet wird

  HomePfad = "C:\Homedrives"                                         'In diesem Pfad des Servers werden die Freigaben für das HomeVerzeichnis erstellt
  LesePfad = "C:\AllgemeinerLeseZugriff"                               'In diesem Pfad des Servers werden die Freigaben mit allgemeinen Leserechten erstellt

  HomeShare = "homeshare"                                   'Name der Freigabe, auf der die Homeverzeichnisse gespeichert werden.
  HomeDriveBuchstabe = "h:"
  LeseShare = "AllgemeinShare"                                        'Name der Freigabe mit Leserechten für alle!
  LeseDriveBuchstabe = "u:"

  Lehrer = "lehrer"                                             'Sicherheitsgruppe, in der die Lehrer Mitglieder sind -> diese erhalten erhöhte Rechte in den Shares

  DateiMitUserdaten = "meineUser.csv"                        'in dieser Datei sind die anzulegenden User erfasst;
                                                             'diese Datei muss nach folgendem Schema aufgebaut sein:
                                                             '[Anmerkung: als OU empfiehlt sich die in Schulen die Klassenbezeichnung oder der Jahrgang]

                                                             'username;OU

                                                             'Beispiel:
                                                             'Max.Mustermann;2012_13_1AK
                                                             'Maxima.Musterfrau;2012_13_2AK
                                                             '...

'### hier beginnt der Teil, der eher nur noch von Auskennern angefasst werden sollte ;-)  ##

Set objFS = CreateObject("scripting.filesystemobject")
Set WshShell = WScript.CreateObject("WScript.Shell")
Set rootDSE = GetObject("LDAP://RootDSE")
DomainName = rootDSE.Get("defaultnamingcontext")

' aus DC=hak-neusiedl,DC=local wird hak-neusiedl.local
DomainString = Replace(DomainName, "DC=", "")
DomainString = Replace(DomainString, ",", ".")

Informationen = "Benutzername;Klasse;Passwort" & vbCrLf
Randomize

Set myFile = objfs.OpenTextFile(DateiMitUserdaten, 1, true)
Do While not myfile.AtEndOfStream

zeile = (myfile.ReadLine)
tempArr = split(zeile,";")
MUsername = tempArr(0)
strOU = tempArr(1)
GroupString = tempArr(1)

'erstellt eine neue OU
If Not OUExists(strOU, "LDAP://" & DomainName) Then
    Set PrfOU = GetObject("LDAP://" & DomainName).Create("organizationalUnit", "ou=" & strOU)
    PrfOU.SetInfo
Else
    Set PrfOU = GetObject("LDAP://" & "ou=" & strOU& "," & DomainName)
End If

' erstellt, falls noch nicht vorhanden, eine neue Gruppe, in der die User Mitglied werden
If Not ObjectExists(GroupString, "group", "WinNT://" & DomainString) Then
    Set objGroup = PrfOU.Create("Group", "CN=" & GroupString)
    objGroup.Put "sAMAccountName", GroupString
    objGroup.SetInfo
End If
' Die Gruppe wird gesucht und als Ziel definiert.
Set GroupObj = GetObject("WinNT://" & DomainString & "/" & GroupString)

' Prüfung, ob Benutzer angelegt
Do While ObjectExists(MUsername, "user", "WinNT://" & DomainString) And Not Abbruch
    Do
        MUsername = InputBox(_
            "Die Bezeichnung " & tempArr(0) & " ist bereits vorhanden!" & vbCrLf & _
            "Bitte geben Sie eine andere Bezeichnung oder ""exit"" für Abbruch ein!")
    Loop Until MUsername <> ""
    If LCase(MUsername) = "exit" Then Abbruch = True
Loop

If NOT Abbruch Then

' erstellt den Pfad für die Freigaben
CreatePath HomePfad
CreatePath LesePfad & "\" & strOU

' es werden die Freigaben erzeugt
CreateShare HomeShare, HomePfad
CreateShare LeseShare, LesePfad

' Grundlegende Rechte für Angabe- und Pruefungsordner setzen
WshShell.Run "cmd /c echo j|cacls " & HomePfad & " /G Administratoren:F " & Lehrer & ":C " & GroupString & ":R", 0, 1
WshShell.Run "cmd /c echo j|cacls " & HomePfad & " /E /G " & GroupString & ":W", 0, 1
WshShell.Run "cmd /c echo j|cacls " & LesePfad & " /G Administratoren:F " & Lehrer & ":C " & GroupString & ":R", 0, 1
WshShell.Run "cmd /c echo j|cacls " & LesePfad & "\" & StrOU & " /G Administratoren:F " & Lehrer & ":C ", 0, 1

' loginscript schreiben
LoginScriptName = StrOU & ".bat"
LoginScriptPfad = "sysvol\" & DomainString & "\Scripts\Abschluss\Login"
LoginScript = "\\" & DomainString & "\" & LoginScriptPfad & "\" & LoginScriptName
LoginScriptPfadLokal = "C:\WINDOWS\SYSVOL" & "\" & LoginScriptPfad
LoginScriptDatei = LoginScriptPfadLokal & "\" & LoginScriptName
CreatePath LoginScriptPfadLokal

Set objTextStream = objFS.CreateTextfile(LoginScriptDatei)
objTextStream.write "net use " & LeseDriveBuchstabe & " \\" & ServerName & "\" & LeseShare & "\" & strOU
objTextStream.Close

    ' die Verzeichnisse für die SchülerInnen werden erstellt;

    CreatePath "\\" & ServerName & "\" & HomeShare & "\" & StrlOU & "\" & MUsername

    ' die User werden nun im AD angelegt

    'Passwort = "Passwort" & i & "-" & Int(10000 * rnd + 1)
    Passwort = Kennwort(10)

    Set usr = PrfOU.Create("user", "CN=" & MUsername)
    usr.Put "samAccountName", MUsername
    usr.Put "userPrincipalName", MUsername & "@" & DomainString
    usr.Put "homeDirectory", "\\" & ServerName & "\" & HomeShare & "\" & StrOU & "\" & MUsername
    usr.Put "homeDrive", HomeDriveBuchstabe
    usr.Put "scriptPath", LoginScript
    usr.SetInfo
    usr.SetPassword Passwort
    usr.AccountDisabled = False
    usr.SetInfo
    WScript.Sleep (1000)

    Informationen = Informationen & vbCrLf & MUsername & ";" & strOU & ";" & Passwort
    i = i + 1

    GroupObj.Add ("WinNT://"& DomainString & "/" & MUsername)
    WScript.Sleep (1000)

    ' die Berechtigungen werden in den Verzeichnissen der User gesetzt
    PermL1 = "Administratoren:F " & Lehrer & ":C " & MUsername & ":R "
    PermL2 = MUsername & ":W "
    PermA = "Administratoren:F " & Lehrer & ":C " & MUsername & ":R "

WshShell.Run "cmd /c echo j|cacls \\" & ServerName & "\" & HomeShare & "\" & strOU & "\" & MUsername & " /G " & PermL1 , 0, 1
WshShell.Run "cmd /c echo j|cacls \\" & ServerName & "\" & HomeShare & "\" & strOU & "\" & MUsername & " /E /G " & PermL2 , 0, 1
WshShell.Run "cmd /c echo j|cacls \\" & ServerName & "\" & LeseShare & "\" & strOU & " /E /G " & PermA , 0, 1

    WScript.Sleep (1000)
    end if
Loop

' die csv mit den Usern und Passwörtern wird erstellt
strDateiname = "Usernames_und_passwoerter.csv"
Set objTextStream = objFS.CreateTextFile(strDateiname, True)
objTextStream.write Informationen
objTextStream.Close

If i > 0 Then
    Erfolg = "Fertig: " & i & " Benutzer angelegt"
Else
    Erfolg = "Keine User angelegt."
End If

WScript.Echo Erfolg

Function Zeichen(Anfang, Ende)
    Zufall = Int((Ende - Anfang + 1) * Rnd + Anfang)
    Zeichen = Chr(Zufall)
End Function

Function Verschiebe(VWort)
    WLaenge = Len(VWort)
    NeuWort = ""
    ReDim WFeld(WLaenge)
    For t = 1 To WLaenge
        WFeld(t) = Mid(VWort, t, 1)
    Next
    Zahl = 0
    Do Until Len(NeuWort) = WLaenge
        j = Int((WLaenge) * Rnd + 1)
        If WFeld(j) <> "" Then
            NeuWort = NeuWort & WFeld(j)
            WFeld(j) = ""
        End If
        Zahl = Zahl + 1
        If Zahl > 1000 Then Exit Do ' Zur Sicherheit
    Loop
    Verschiebe = NeuWort
End Function

Function Kennwort(KennwortLaenge)
If KennwortLaenge > 128 Then KennwortLaenge = 128
Wort = ""
Wort = Zeichen(48, 57) ' Ziffern
Wort = Wort & Zeichen(65, 90) ' Großbuchstaben
Wort = Wort & Zeichen(97, 122) ' Kleinbuchstaben
Wort = Wort & Zeichen(33, 47) ' Satzzeichen
If KennwortLaenge > 4 Then
    For t = 5 To KennwortLaenge
        Wort = Wort & Zeichen(33, 122)  'sonstige Zeichen
    Next
End If
Wort = Verschiebe(Wort) ' Zeichenfolge zufällig ändern
Kennwort = Wort
Kennwort = Replace(Kennwort, " ", "_")
Kennwort = Replace(Kennwort, ";", "_")
Kennwort = Replace(Kennwort, """", "_")
End Function

Sub CreatePath(FullPath) 'Rekursive Erstellung eines Pfades
If Not objFS.FolderExists(FullPath) Then
    Folder = objfs.GetFileName(FullPath)
    ParentPath = objfs.GetParentFolderName(FullPath)
    If Right(ParentPath, 1) <> "\" Then ParentPath = ParentPath & "\"
    CreatePath(ParentPath)
    objFS.CreateFolder(ParentPath & Folder)
End If
End Sub

Sub CreateShare(ShareName, SharePath)
Set Freigaben = GetObject("WinNT://" & ServerName & "/LanmanServer,FileService")
Angelegt = False
For Each Freigabe In Freigaben
    If LCase(Freigabe.Name) = LCase(ShareName) Then
        Angelegt = True
        Exit For
    End If
Next
If Not Angelegt Then
    Set fs = Freigaben.Create("FileShare", ShareName)
    fs.Path = SharePath
    fs.MaxUserCount = -1
    fs.SetInfo
End If
Set Freigaben = Nothing
Set fs = Nothing
End Sub

Function OUExists(OUName, ParentOU)
Set Container = GetObject(ParentOU)
Container.Filter = Array("organizationalUnit")
OUExists = False
For Each OU In Container
    If LCase(OU.ou) = LCase(OUName) Then
        OUExists = True
        Exit For
    End If
Next
End Function

Function ObjectExists(ObjectName, ObjectType, DomainRoot)
Set Dom = GetObject(DomainRoot)
Dom.Filter = Array(ObjectType)
ObjectExists = False
For Each Obj In Dom
    If LCase(Obj.Name) = LCase(ObjectName) Then
        ObjectExists = True
        Exit For
    End If
Next
End Function

Tip:
Ich würde das Script vorerst mit 2 – 10 Usern aus unterschiedlichen Schulklassen testen, und eventuell Änderungen im Script nach erfolgtem Test vornehmen…
Das Skript wurde möglichst übersichtlich gehalten, sodass es auch für VBScript-Newbies möglich sein sollte, die entsprechenden Zeilen aufzustöbern, in denen nötige Änderungen vorzunehmen sind.
Falls jemand die Sicherheitseinstellungen der Ordner verändern möchte, dann sind alle Zeilen, in denen cacls vorkommt, diejenigen, die verändert werden müssen!

Credits:
Danke an Nils Kaczenski für ein paar Code-Schnipsel und bastla aus www.administrator.de, der am Ursprungsscript, auf dem dieses hier basiert, tatkräftig mitgeholfen hat!

OuShutdown 1.2 ist fertig!

Introduction
OuShutdown sammelt alle Clients einer oder mehrerer Organisationseinheiten eines Active Directory und fährt sie herunter (remote shutdown).
Sofern ein Windows DHCP-Server verwendet wird, können die Clients mittels eines Magic Pakets auch aus dem Standby „geweckt“ werden, bevor sie herunterfahren.
Das Tool kann entweder direkt in einer CommandShell oder als geplanter Task verwendet werden.

[OuShutdown is a Tool, that collects all members of 1 ore more Organizational Unit(s) within an Active Directory and starts a remote shutdown for all clients in that OU]

Runs on:
Client Windows XP oder höher
Server 2003 oder höher

Installation
Kopiere OuShutdown in Dein bevorzugtes Verzeichnis. Ein Doppelklick auf die Datei zeigt die Syntax an, die in einer Commandshell zu verwenden ist.
[Copy OuShutdown onto your executable path. Typing „OuShutdown“ displays its usage syntax. ]

Download:
OuShutdown.exe [[downloadcounter(oushutdown.exe)] x heruntergeladen]

Die Nutzung des Tools ist gratis – Vertrieb nur nach vorheriger Genehmigung durch mich!
[Usage is for free – All rights reserved by Edi Pfisterer]

Usage:
OuShutdown.exe /ou:Dv1,Dv2,Dv3 [/dhcp:servername]

DV1,DV2,DV3 steht für die OUs, in der alle Clients heruntergefahren werden sollten
optional: SERVERNAME steht für den Windows-DHCP-Server (zum Wecken aus dem Standby)

Tipp:
Wenn das Tool als „geplanter Task“ eingesetzt wird, dann müssen die Flags außerhalb der Anführungszeichen manuell eingetragen werden…

PS:
Zusatzfeature: In dem Ordner, in dem das Tool gespeichert wird, wird eine alleInfos.csv angelegt, die alle Clients  inkl. OU, IP-Adresse und MAC-Adresse beinhält…

Credits:
Dank an
Matthias Zirngibl [http://masterbootrecord.de/docs/wakeup.php] für die Verwendung seiner wake.exe

Additional Backgroundinformations:
– es muss eine funktionierende Windows Active Directory – Domäne vorhanden sein
– aus Sicherheitsgründen muss das Tool mit einer DomänenAdministratorenKennung ausgeführt werden.
– Das Tool funktioniert auch in Netzen, die in VLANs aufgeteilt sind.
– Clients, die in der OU „Computers“ sind, können nicht angesteuert werden!
– Bei Windows7-Clients muss bei der Netzwerkkarte „Allow this device to wake the Computer“ angehakt sein, damit der Client auch heruntergefahren werden kann, wenn er im Standby schlummert.

Sicherungs/Löschscripts

Nachdem ich bei mehreren Kunden nächtliche Komplettsicherungen mache, hier ein ein batch-Script zum erstellen der Sicherungen und ein VBScript, das dazu dient, diese Sicherungen nach n Tagen wieder automatisiert zu löschen.
Ich glaube mich zu erinnern, dass ich Teile des (oder das gesamte?) Script aus dem Netz habe…
Sollte der mögliche Urheber sein Werk hier (teilweise) wiedererkennen, dann möge er mir bitte Bescheid geben…

(Ich stelle das Script hier trotz mangelnder Urheberschaft ab, damit ich es unterwegs stets parat habe, und anstatt zu tippen copypasten kann… [was bei vielen meiner Artikel ein wichtiger Antrieb ist])

1.) sicherungerstellen.bat

md f:\!!!backup\%date%

xcopy C:\officeVHD\*.vhd f:\!!!BACKUP\%date%\*.* /Y /J /R

 

2.) sicherungloeschen.vbs

AlterinTagen = -8

Basisordner = "S:\Termin-Sicherung"

Heute = FormatDateTime(Date, 2)
OldDate = DateAdd("d", AlterinTagen, now()) 

Set objFS = CreateObject("Scripting.FilesystemObject")

If objFS.FolderExists(Basisordner) Then
    DoFolder objFS.GetFolder(Basisordner)

End If

'für "Erstellungsdatum" anstelle von "DateLastModified" "DateCreated" verwenden
Sub DoFolder(Folder)
For Each File In Folder.Files
    If File.DateLastModified < OldDate Then File.Delete
Next

For Each SubFolder In Folder.SubFolders
        If SubFolder.DateLastModified < OldDate Then
        WScript.Echo SubFolder.Delete
    Else
        DoFolder SubFolder
        If (SubFolder.SubFolders.Count + SubFolder.Files.Count) = 0 Then SubFolder.Delete 'leere Unterordner löschen
    End If
Next
End Sub

Besitzer von Ordnern per Skript ändern

Wer zum jährlichen Anlegen neuer Schüleraccounts das Porgramm EUser von Koll. Steingruber verwendet, arbeitet vermutlich mit den dadurch angelegten UserOrdnern, die üblicherweise mit dem Laufwerksbuchstaben H: beim Login gemappt werden. (bekannt als das „Homeverzeichnis“)

Probleme können nun auftreten, wenn diese Ordner verschoben werden (da der Server getauscht wird o. ä.)….

Probleme können vor allem auftreten, wenn vergessen wird, die NTFS-Berechtigungen mitzuübertragen (hier sollte xcopy QuelleZiel /O /X /E /H /K  — oder wer eine GUI möchte — Total Commander mit den entsprechenden Einstellungen verwendet werden).

Ich hatte nun bei einem Kunden den Fall, dass zwar die NTFS-Berechtigungen, jedoch NICHT der jeweilige Besitzer mitübertragen wurde. Dies wirkt sich äußerst nachteilig auf die Verwendung von Kontingenten aus.

Weiters wurden bei ihm nun unter Windows 7 die Ordnernamen nicht mehr richtig angezeigt, sondern alle Ordner erschienen als „Eigene Dateien“, wenn er als Administrator eingeloggt war (was sich dadurch erklärt, dass der Administrator gleich der Besitzer dieser Ordner ist). Dieses Verhalten der falsch angezeigten Ordnernamen tritt im übrigen nur dann auf, wenn der jeweilige Ordner die Datei desktop.ini enthält…

Ich habe nun ein Script geschrieben, dass dieses Problem  behebt.

Funktionsweise:
Es wird für jeden Ordner (und alle Unterordner) geprüft, ob es einen zugehörigen User im Active Directory gibt, bei dem der Username und der Ordnername ident sind.
Wird ein gleichlautender User gefunden, so übernimmt dieser User den Besitz des Ordners (und alle Unterordner sowie Dateien).

Benutzung:
Beim erstmaligen Ausführen der Datei aus einem beliebigen Ordner wird die Datei „Berechtigungsänderungen.txt“ angelegt, in der alle nötigen Informationen enthalten sind.

Tipp: das Skript verändert den Besitzer nur, wenn es aus einer Command-Shell wie folgt aufgerufen wird:

BerechtigungenReparieren.exe /scharf:YES /Userordner:Q:\meineHomeshares\Schueler

[wobei Q:\meineHomeshares\Schueler natürlich für den zu verändernden Ordner steht!!!]

Durch blosses Doppelklicken des Scripts wird lediglich die Ordnerstruktur + eventuellem Active Directory User in der Berechtigungsänderungen.txt angezeigt, aber NICHTS veärndert.

Voraussetzungen:
Das Script funktioniert NUR mit Windows 7 bzw. Windows Server 2008
(Sollte jemand noch Windows Server 2003 verwenden, sollte er das Tool von einem Windows 7 – Client aus starten, und als Userordner einfach den UNC-Pfad angeben [z.B: \\meinServer\home$])

Download:
BerechtigungenReparieren.exe [[downloadcounter(BerechtigungenReparieren.exe)] x heruntergeladen]

Ich übernehme KEINE HAFTUNG für irgendwelche Schäden (eh klar)… 😉
Sollte sich jemand unsicher sein mit dem Tool, kann er es einfach durch Doppelklick in einem beliebigen Ordner mit den Homeshares starten und die jeweiligen Zeilen, die in der .txt-Datei angeführt werden, in einer Commandshell ausprobieren, ob sie das tun, was er möchte.
[Alternative: aus einer Commandshell BerechtigungenReparieren.exe /scharf:NO /Userordner:Q:\meineHomeshares\Schueler
]
Wenn dann anschließend die gesamte Ordnerstruktur in der .txt kontrolliert wurde, kann das Script SCHARF gestartet werden.

Feedback – welches auch immer – ist very warm welcome…
(wobei „Edi, Du bist mein Held“ oder „Edi, Du kommst in jedem meiner Abendgebete vor“ wohlwollender entgegengenommen wird  🙄

Quelltext:

warntext = warntext & "Dieses Tool verändert den Besitzer von Ordnern und Dateien!" & vbcrlf
warntext = warntext & "Funktionsweise: Es wird für jeden Ordner und Unterordner im Active Directory ""nachgesehen"", ob es einen User" & vbcrlf
warntext = warntext & "mit dem selben Namen gibt!" & vbcrlf
warntext = warntext & "Wenn es eine Übereinstimmung gibt, so wird bei alle Dateien sowie Ordnern in diesem Verzeichnis der Besitzer geändert" & vbcrlf
warntext = warntext & "" & vbcrlf
warntext = warntext & "ACHTUNG! Es werden aktuell hier nur die Ordner aufgelistet." & vbcrlf
warntext = warntext & "Um in den Ordnern die Besitzer tatsächlich zu ändern (nachdem alles kontrolliert wurde), MUSS dieses Script " & vbcrlf
warntext = warntext & "aus einer Commandshell heraus mit wie folgt gestartet werden:" & vbcrlf & vbcrlf  & vbcrlf
warntext = warntext & "BerechtigungenReparieren.exe /scharf:YES /Userordner:H:\meineHomeverzeichnisse\Schueler" & vbcrlf & vbcrlf  & vbcrlf
warntext = warntext & "[wobei H:\meineHomeverzeichnisse\Schueler natürlich für den zu verändernden Ordner steht!!!]" & vbcrlf
warntext = warntext & "[Tipp: wenn Ordner Leerzeichen haben, dann den Ordnername zwischen zwei "" sezten]" & vbcrlf
warntext = warntext & "[Tipp2: das Tool funktioniert auch mit Freigaben, also zB \\meinServer\home$\schueler]" & vbcrlf & vbcrlf & vbcrlf
warntext = warntext & "Chefmodus: (Experts only)" & vbcrlf
warntext = warntext & "unten abgebildeten Quellcode mit dem Notepad als BerechtigungenReparieren.vbs speichern und folgendes ändern:" &vbcrlf
warntext = warntext & "in der Zeile mit dem Quelltext //   ' Modus = ""yes""  // muss lediglich das Hochkomma am Beginn gelöscht werden" & vbcrlf
warntext = warntext & "dann kann das Script auch per Doppelklick SCHARF gestartet werden!" & vbcrlf
warntext = warntext & "jetzt wird durch jeden DOPPELKLICK auf diese Datei BerechtigungenReparieren.vbs im jeweiligen Ordner und Unterordner die Berechtigungen geändert!" & vbcrlf & vbcrlf
warntext = warntext & "ACHTUNG: Es wird keine Haftung für etwaige Schäden übernommen!!! Also VORSICHT bei der Verwendung" & vbcrlf & vbcrlf
warntext = warntext & "[Feedback an Edi Pfisterer --> edi@schulnetz.info --> www.schulnetz.info]" & vbcrlf & vbCrLf  & vbcrlf & vbCrLf

Set objFSO = CreateObject("Scripting.FileSystemObject")

dateiname = "Berechtigungsänderungen.txt"

ueberordner = WScript.Arguments.Named.Item("Userordner")
         if len(ueberordner)= 0 then
                  scriptname = Wscript.ScriptFullName
                  ueberordner = objFSO.getparentfoldername(scriptname)
         end if
warntext = warntext & "Aktuelles Verzeichnis: " & ueberordner & vbcrlf & vbcrlf
Modus = WScript.Arguments.Named.Item("scharf")

' Modus = "yes"

 call InDateiSchreiben(warntext)

                        Set objShell = CreateObject("WScript.Shell")
					    objShell.Popup "Es werden nun alle eventuell zu verändernden Ordner einzeln aufpoppen! " & vbcrlf & "Lesen Sie in der Datei Benutzerberechtigungen.txt, die soeben angelegt wurde nach, wie Sie dieses Tool ""scharfstellen""!" & vbcrlf & "Um diese Tool zu stoppen, müssen Sie im Taskmanager die Datei wscript.exe beenden!", 20, "Info"
					    Set objShell = Nothing

call Ordnerliste(ueberordner)

function Ordnerliste(pfad)

        Set objFolder = objFSO.GetFolder(pfad)
        Set colSubfolders = objFolder.Subfolders

        For Each objSubfolder in colSubfolders
              on Error resume next

                 vollername = objFSO.GetAbsolutePathName(objSubfolder)

                NT_Benutzer = UserNameIsolieren(vollername)
                if Benutzerabfrage(NT_Benutzer) = 1 THEN
                   if instr(1,modus,"yes",1) = 0 Then  'es wird lediglich eine txt erzeugt, Dateien bleiben unverändert
                        call InDateiSchreiben(vollername)
                        call InDateiSchreiben("USER GIBTS")
                        befehl = "icacls " & vollername & " /setowner " & NT_Benutzer & " /t /c /l /q"
                        call InDateiSchreiben(befehl)
                        call InDateiSchreiben(vbcrlf)

                        Set objShell = CreateObject("WScript.Shell")
					    objShell.Popup vollername & " würde auf den neuen Besitzer " & NT_Benutzer & " geändert werden, wenn Sie das Tool ""scharf"" stellen würden....", 5, "Info"
					    Set objShell = Nothing
                   Else           

                      befehl = "icacls " & vollername & " /setowner " & NT_Benutzer & " /t /c /l /q "

                      Set objShell = CreateObject("WScript.Shell")
                      objShell.Run "%comspec% /c echo j|" & befehl, 0, 1
                      'WshShell.Run "cmd /q echo j|" & befehl , 0, 1

                      Call InDateiSchreiben (befehl)
                      call InDateiSchreiben(vollername & " wurde auf den neuen Besitzer " & NT_Benutzer & " geändert!" & vbcrlf)

					    Set objShell = CreateObject("WScript.Shell")
					    objShell.Popup vollername & " wurde auf den neuen Besitzer " & NT_Benutzer & " geändert!", 5, "Info"
					    Set objShell = Nothing

						objFSO.DeleteFile(vollername & "\desktop.ini")

                end If
                end if

         call Ordnerliste(vollername)
        Next

end function

function InDateiSchreiben(inhalt)
  set logbuch1 =objFSO.opentextfile(dateiname, 8, true,0)  ' 8 zum anfügen
                logbuch1.write inhalt & vbcrlf
                logbuch1.close
end function

function UserNameIsolieren(strUsername)
  letzterBackslash = instrRev(strUsername,"\")
  laenge = len(strUsername)
  eigentlicherUsername = right(strUsername, laenge-letzterBackslash)
 ' call InDateiSchreiben(eigentlicherUsername)
  UserNameIsolieren = eigentlicherUsername
end function

Function Benutzerabfrage(strUserName)
BenutzerVorhanden = 0
Set rootDSE = GetObject("LDAP://RootDSE")
DomainName = rootDSE.Get("defaultnamingcontext")
DomainString = Replace(DomainName, "DC=", "")
DomainString = Replace(DomainString, ",", ".")

    Set objDomain = GetObject("WinNT://" & DomainString)
    objDomain.Filter = Array("user")
    For Each User In objDomain
        If lcase(User.Name) = lcase(strUserName) Then
           BenutzerVorhanden = 1
        End If
    Next
        if BenutzerVorhanden THEN Benutzerabfrage = 1
End Function

msgBox "Ich bin fertig!"



KMS – Freund und Feind zugleich…

Key Management Service (KMS) – eine Übersicht

Wer von Windows XP auf Windows 7 migriert (hat), wird schon bemerkt haben, dass die Art der Lizenzierung / Aktivierung (bei XP zu Erinnerung: Campuslizenz mit einem Key, der bereits im geklonten Image bereitgestellt werden kann) rapide geändert wurde.

Grundsätzlich gibt es 2 Möglichkeiten:
Die zentrale Aktivierung via KMS-Server (und daher bessere) und die dezentrale mit Eingabe der MAKs auf den einzelnen Clients inkl. manueller Aktivierung (und daher wesentlich arbeitsintensivere und schlechtere.)

Da mein Credo zu allen Tages- und Nachtzeiten (in Ahnlehnung an die schweizer Kollegen) lautet „Real Men don’t click [more than necessarily]“ verzichte ich auf die Besprechung der MAK-Variante völlig und wende mich nun in weiterer Folge der Konfiguration eines KMS-Servers (inkl. aller dabei auftretenden Schwierigkeiten) zu!

Step by Step Anleitung: „Installation eines funktionierenden KMS-Servers“

1.) Windows Server 2008 R2 installieren und manuell mittes des über die MS-ACH erhaltenen MAKs für Windows Server 2008 aktivieren (Start >> Systemsteuerung >> System >> Windows Aktivierung)

2.) KMS aktivieren
eine Command-Shell [= Eingabeaufforderung] als Administrator starten (rechte Maustaste >> „als Administrator ausführen“), dann folgende Befehle in der angeführten Reihenfolge absetzen:

cscript C:\windows\system32\slmgr.vbs /ipk <KMS Key>
cscript C:\windows\system32\slmgr.vbs /ato

Hinweis: nach jedem Befehl öffnet sich eine Meldung, die den Erfolg der Aktion ausgibt

3.) Firewall kontrollieren, ob der KMS auch „einen Passierschein hat“
[Stichwort: eingehende Regeln >> Schlüsselverwaltungdienst (TCP eingehend) >> Zulassen ]

4.) Eintrag am DNS-Server kontrollieren
DNS-Management-Konsole >> Forward-Lookupzonen >> FQDN >> _TCP >> _VLMCS (Eintrag des Servers, der
den KMS-Host darstellt
(Falls dieser Eintrag fehlt:
>> Forward-Lookupzonen >> FQDN >> _TCP >> rechte Maustaste >> weitere neue Einträge >> Dienstidentifizierung (SRV) >>  Dienst: _VLMCS // Protokoll: _tcp // Priorität: 0 // Gewichtung: 0 // Portnummer: 1688 // Host, der diesen Dienst anbietet = FQDN des KMS-Servers // beide Kontrollkästchen bleiben leer // Gültigkeit 0:1:0:0)

5.) KMS kontrollieren
Start / Ausführen:  slmgr.vbs /dli
Es erscheint – nach kurzem Warten – ein Popup mit einigen Daten, unter anderem der Zeile
aktuelle Anzahl: 7 (wobei hier 7 nur ein Beispiel ist…)

Sollten die Clients nicht innerhalb kürzester Zeit die Aktivierung erhalten, dann lohnt sich die weitere Lektüre dieses Artikels garantiert!!!!

Problemfelder bei der Lizenzierung mittels KMS
(Arbeitstitel: der Dreck funktioniert bei mir nicht…):

1.) Der KMS arbeitet erst ab einer durch ihn verwalteten Anzahl von 25 Clients!!!!

PROBLEM:
selbst, wenn man > 200 (z. B. mit WDS) geklonte Clients in Betrieb hat, kann es dennoch sein, dass den Clients die Aktivierung mit folgender Fehlermeldung verwehrt wird:

0xC004F038
Vom Softwarelizenzierungsdienst wurde gemeldet, dass der Computer nicht aktiviert werden konnte. Die vom Schlüsselverwaltungsdienst (Key Management Service, KMS) gemeldete Anzahl reicht nicht aus. Wenden Sie sich an den Systemadministrator.

die Ursache hierfür könnte nun darin liegen, dass wir zwar mehr als 25 Clients verwalten möchten, der KMS-Server aber keinen Unterschied zwischen unseren Clients erkennt…
Mit anderen Worten: für ihn gleichen unsere Clients wie ein Ei dem anderen…
Dies führt uns zu folgendem:

2.) mindestens 25 Clients müssen eine unterschiedliche CMID haben!
damit einhergehend:
3.) What the hell is a CMID?

Jeder Client generiert überlicherweise eine einzigartige Client Machine ID (CMID). Um dies zu gewährleisten, sollten Clients vor deren Klonen auch mit
sysprep /generalize [/oobe /shutdown]

darauf vorbereitet werden.

Sollte das Klonen per Windows Deployment Service (WDS) erfolgen, so ist zwecks Lite- bzw. Zerotouch-Deployment das Hinterlegen einer ImageUnattend.xml unumgänglich!

Sollte nun in dieser ImageUnattend.xml der Eintrag
<SkipRearm>1</SkipRearm>
vorhanden sein, dann werden – auch bei fehlerfrei ausgeführtem SYSPREP – keine neuen CMIDs generiert.

Daher zählt der KMS auch die Anzahl der Anfragen nicht hinauf, und dann wären wir wieder bei Problem Nummer 1: der KMS arbeitet erst aber einer Anzahl von 25 Clients!!!

4.) Zwischenfrage: Welche CMID hat der Client?

Grundsätzlich scheint die CMID auf, wenn man am Client slmgr.vbs /dli ausführt UND der Client bereits aktiviert ist!
Wenn der Client noch nicht aktiviert ist (was auch der Fall sein dürfte, sonst wäre uns die CMID nämlich ziemlich
všecko jedno) funktioniert dies aber nicht!

Um bei nicht aktivierten Clients die CMID zwecks Vergleichens zu ermitteln, ist ein Blick in die Ereignisanzeige anzuraten:

Protokollname: Application
Quelle:        Microsoft-Windows-Security-SPP
Datum:         20.02.2012 23:58:24
Ereignis-ID:   12288
Aufgabenkategorie:Keine
Ebene:         Informationen
Schlüsselwörter:Klassisch
Benutzer:      Nicht zutreffend
Computer:      DV101.hak-neusiedl.local
Beschreibung:
Vom Client wurde eine Aktivierungsanforderung an den Computer mit dem Schlüsselverwaltungsdienst gesendet.
Info:
0x00000000, 0x00000000, wicky.hak-neusiedl.local:1688, 586a12e2-5e2f-4c55-a6c0-0152af448ec4, 2012/02/20 22:58, 0, 3, 43200, ae2ee509-1b34-41c0-acb7-6d4650168915, 25

CMID in diesem Fall:586a12e2-5e2f-4c55-a6c0-0152af448ec4

Wenn nun alle geklonten Clients eine idente CMID haben, dann wäre es nun an der Zeit für folgendes:

4.) Holt mich hier raus, ich bin ein Star 😉

3 Lösungsansätze stehen zur Verfügung (The Good, The Bad, The Ugly)

LÖSUNG – Variante 1
>> mindestens 25 Clients neu zu klonen:
(The UGLY!)

die richtige Vorgehensweise dabei:
Client vorbereiten mit
sysprep /generalize /oobe /shutdown
+
in der ImageUnattend.xml
<SkipRearm>0</SkipRearm>

Nachteil dieser Variante: Arbeitsintensiv, im laufenden Betrieb nicht machbar!

LÖSUNG – Variante 2
>> mindestens 25 Clients manuell mit neuen CMIDs versehen:
(The BAD)

Wenn slmgr.vbs /rearm am Client ausgeführt wird, so wird eine neue CMID generiert.
Btw: Dies kann auf jedem Client bis zu 3 mal wiederholt werden, die aktuell verbleibende Anzahl kann am Client mit slmgr.vbs /dlv abgelesen werden!

Da mindestens 25 Clients mit unterschiedlicher CMID zu einem funktionierenden KMS führen würde, könnten wir jetzt kurzerhand zu 25 Clients laufen, dort slmgr.vbs /rearm eingeben, jeden Client neu starten und der KMS läuft jetzt endlich!

Doch halte inne und bedenke:
Real Men don’t click (and – of course –  don’t run around)

LÖSUNG – Variante 3
>> mindestens 25 Clients per Startscript mit neuen CMIDs versehen:

(The GOOD!!!!)

Hier ein Script, das – per Gruppenrichtlinie als Starskript – für Dich die Arbeit erledigt:

'############## Edi Pfisterer -- 11/5/2012 -- REARM_IT ##############

on Error resume next
logdatei = "c:\rearm.txt"
Set fs = CreateObject("Scripting.FileSystemObject")
If NOT fs.FileExists (logdatei) then

'############################ just rearm it, baby ############################'

Set WshShell = WScript.CreateObject("WScript.Shell")
WSHShell.Run("wscript ""c:\windows\system32\slmgr.vbs"" /rearm ")

'##########################   LOGDATEI schreiben, die anzeigt,
ob REARM schon einmal gelaufen ist ########################

    Set a = fs.CreateTextFile(logdatei, True)
    a.WriteLine("rearmed wurde am " & now())
    a.Close
END IF

Funktionsweise:
Es wird auf C:\ eine Datei namens rearm.txt angelegt, weiters wird slmgr.vbs /rearm aufgerufen.
Beim nächsten Aufruf des Startscripts wird geprüft, ob die rearm.txt vorhaden ist, und in diesem Fall auf slmgr.vbs /rearm verzichtet….

5. wie schauts mit einer GUI aus?

Kein Problem! Mit dem VAMT (Volume Activation Management Tool) 2.0 (ACHTUNG: ZWEI — PUNKT — NULL // Das 1.0 war zum Vergessen!!!) hat man ein feines Tool zur Hand, das einen klaren Überblick über die Lizenzierungssituation gibt!
Aber ACHTUNG: Wenn der KMS nicht richtig funktioniert, dann wir man mit dem VAMT auch keinen Spass haben!!! Das VAMT ersetzt den KMS NICHT!!!

Vorgangsweise Installation / Verwendung von Volume Activation Management Tool:

  • VAMT 2.0 bei Microsoft downloaden (googlen ist den Menschen zumutbar)
  • am KMS installieren und starten
  • im mittleren Fenster „Search for computers in the Active Directory“ auswählen
  • alle im unteren, mittleren Fenster gefunden Clients mit STRG + A makieren
  • Rechte Maustaste >> Update Status / Current Credential (sofern man als Domainadmin angemeldet ist)
  • Nun erfolgt eine Einteilung in
    Licensed
    Out-of-Box
    Out of Tolerance Grace
    (Tipp: Falls dort alle Clients landen und keine bei Licensed, dann wurde das Problem der identen CMIDs – noch – nicht gelöst!)
  • Wenn sich noch nicht alle Clients unter „Licensed“ einreihen, dann hilft
    recht Maustaste auf den/die Clients >> Activate >> KMS Activate >> …

Im Idealfall sieht das ganze dann so ähnlich aus (in dieser Umgebung sind > 160 Clients vorhanden, da wäre eine Aktivierung via MAKs kein Spass gewesen…):

Da fällt mir mein Schwager ein, der bei dieser Gelegenheit sagen würde
„Hätte es immer schon SO ausgesehen, hätte man nichts machen müssen… 😉 “

FAZIT:

Der KMS ist – wenn man eine große Anzahl von Windows 7 Clients administrieren darf – eine feine Sache! Wenn er erst einmal funktioniert…

praktische Software: „ADMINOMAT“, um Remote ganze Schulungsräume aufzusetzen

Adminomat_2.0


Ziel der Software „Adminomat“:

Main Feature:
Ganze Schulungsräume remote über WDS aufzusetzen, in dem alle gewünschten Clients remote per WOL gestartet werden.

Dies ist möglich durch die Kombination von Windows Active Directory (AD), Wake on Lan (WOL) und Windows Deployment Service (WDS) in einem einzigen Tool!

Dadurch können Rollouts von Images für ganze Organisationseinheiten eines Active Directory erfolgen, ohne dass der Administrator physikalisch zum Client gehen muss!

Zusatzfeatures:
ganze Organisationseinheiten (zb. Schulungsräume, Abteilungen, etc) können remote gestartet werden, neu gebootet werden, oder heruntergefahren werden.
Weiters kann eine Auswahl getroffen werden, nach folgenden Kriterien:

  • angemeldete User
  • OU des angemeldeten Users
  • x86/x64
  • Datum der letzten Installation
  • Gerätehersteller bzw. -typ
  • RAM
  • etc etc

Voraussetzungen (für die volle Funktionalität):

Server:
Betriebssystem: ab Windows Server 2003 R2 / 2008 / 2008 R2
WDS sollte installiert sein (optional, damit der WDS bedient werden kann)
Verwendung von Microsoft – DHCP – Server ist vorteilhaft

Clients:
Im BIOS muss Wake On Lan einmalig aktiviert werden (inkl. bei Remotesitzung von Remoteserver booten);
Unter Windows muss in der Energieverwaltung der Netzwerkkarte folgendes aktiviert werden:
„Gerät kann Computer aus dem Ruhezustand aktivieren“

Download / Installation:

Das Tool wird NICHT installiert, sondern wird lediglich von einem beliebigen Ordner (auch USB-Stick o. ä.) am Server gestartet.
Am System wird NICHTS verändert!!!
Das Tool läuft auf jedem Windows Client ab XP!!!
Um den WDS zu bedienen und so ein Zero-Touch-Rollout zu starten, muss das Tool allerdings auf einem WDS-Server gestartet werden

Download unter:

www.adminomat.at

Handhabung und Funktion:
WICHTIG: das Tool sollte mit erhöhten Rechten ausgeführt werden –>
Rechte Maustaste auf das Tool –> „als Administrator ausführen“

Bedienung:

Clients remote per WDS neu aufsetzen:

a) kontrolliere deine „UnattendedPE.xml“ auf das gewünschte INSTALLATIONSabbild im Abschnitt

<InstallImage>
<ImageName>schulungsraum</ImageName>
<ImageGroup>windows7</ImageGroup>
<Filename>schulungsraum.wim</Filename>
</InstallImage>

btw: meine 100%ig funktionierende .xml gibt’s hier zum DOWNLOAD

b) Wichtig: Du solltest nur 1 STARTabbild aktiviert haben!!!

c) wenn ADMINOMAT am WDS-Server gestartet wird, gibt es den Menüpunkt „WDS“ –>  „ohne F12“
-> dadurch muss auf den Clients nicht mehr die Taste F12 gedrückt werden!!!
(es erscheint ein roter Hinweis, dass derzeit alle startenden Clients neu aufgesetzt werden…)

d) STARTE nun die gewünschten Clients oder die gesamte OU durch drücken des Buttons

e) WARTE ein paar Minuten (bis auf allen Clients PE gebootet hat)

f) drücke anschließend wieder den Button „mit F12“
(ansonsten wiederholt sich der Vorgang beim 1. Reboot und der Client wird zum 2. mal neu aufgesetzt…)

 

technischer Hintergrund
Wake on LAN wurde über das Tool wake.exe von Matthias Zirngibl (http://masterbootrecord.de/docs/wakeup.php) realisiert.)

 

in diesem Sinne

Have fun!

Microsoft’s Virenscanner „Security Essentials“ per Script installieren

Microsoft Security Essentials bzw. Forefront Endpoint Protection ist ein Virenscanner, der im Schulpaket enthalten ist. Für Einheiten bis zu 10 Clients ist er gratis einsetzbar!
Download beispielsweise hier:
http://windows.microsoft.com/de-DE/windows/products/security-essentials

  • Kurzüberblick:
    • Updates zieht der Virenscanner über den WSUS
    • zentral Managen lässt sich der Forefront Endpoint Protection erst mit Einsatz des Systemcenter Configuration Manager
    • Updatezeiten, Schedules für vollständige Scans, auszuschließende Ordner, etc können zentral über Gruppenrichtlinien gesteuert werden
    • eine „stille“ Installation via Loginscript ist einfach zu handhaben:

      FEPInstall.exe zentral auf einer Freigabe hinterlegen, folgendes Script als installFEP.bat als LoginScript:

    • 

@echo off & setlocal
:: x86 oder 64
wmic path win32_operatingsystem get caption
wmic path win32_operatingsystem get caption|FINDSTR "x64" && goto:neuerPC
start \\SERVER\Software\Forefront_Virenscanner\x86\client\FEPInstall.exe /s /q /i
goto ende
:neuerPC
start \\SERVER\Software\Forefront_Virenscanner\x64\client\FEPInstall.exe /s /q /i
:ende

Ping Statistik in einer .txt speichern

In Anlehung an ein Script von Kollege Biber aus www.administrator.de hier eine kleine Abwandlung, mit der man den Zustand eines Netzwerks über einen längeren Zeitraum erfassen kann.

Was macht das Batch-Script?
Es speichert die Statistik von einer definierten Anzahl von Ping-Paketen in eine .txt, die nach dem Muster IP_Adresse_des_Clients__Datum.txt im Verzeichnis „Testergebnisse“ direkt unter dem Ordner, in dem die .bat gespeichert werden. (wenn das Script unverändert bleibt, dann läuft es ca. 10 Stunden)

Ergebnis:
Test ausgefuehrt von 10.1.198.10
23.01.2012 18:41:59,53 an 10.1.198.254; gesendet: 30 erhalten: 30 verloren: 0  minimum: 1ms Maximum: 5ms Durchschnitt: 1ms
23.01.2012 18:42:28,56 an 10.1.198.254; gesendet: 30 erhalten: 30 verloren: 0  minimum: 1ms Maximum: 1ms Durchschnitt: 1ms

Ping_statistik.bat

:: aus http://www.administrator.de/index.php?content=25022


@echo off & setlocal
for /F "tokens=13,*" %%i in ('ipconfig^|find "IP-Ad"') do set IP=%%j
echo Test ausgefuehrt von %IP% >>Testergebnisse/%IP%_%date%_Ergebnis_Statistik_ping.log
 

 SET count=1
 SET jeweiligeAnzahl=30
 SET ABBRUCHNANZAHL=1200
 SET ipadr=10.1.198.254

 :Again
 echo ...bisher %count% Ping-Tests mit %ipadr%
 Ping %ipadr% -n %jeweiligeAnzahl% >Testergebnisse/%IP%_thisping.log
 for /F "delims==,( skip=2 tokens=2,4,6" %%i in ('find "Pakete" Testergebnisse/%IP%_thisping.log') do Set "SEND_RECV_LOST=gesendet:%%i erhalten:%%j verloren:%%k"
 for /F "delims==, skip=2 tokens=2,4,6" %%i in ('find "Minimum" Testergebnisse/%IP%_thisping.log') do Set "MIN_MAX_AVG=minimum:%%i Maximum:%%j Durchschnitt:%%k"
 echo %date% %time% an %ipadr%; %SEND_RECV_LOST% %MIN_MAX_AVG% >>Testergebnisse/%IP%_%date%_Ergebnis_Statistik_ping.log

set /a count=count+1 
IF %count% LEQ %ABBRUCHNANZAHL% Goto Again: 
goto :eof