Kategorieauswahl

Active Directory

PowerShell Script um Quest-Migration-Manager Datenbank aufzuräumen

Das folgende Script löscht Einträge aus der Ressource Processing Datenbank des Quest Migration Manager, die älter als 3 Monate sind:

# Bitte unter dem Namen cleanQuestDB.ps1 abspeichern, damit das u.a. Beispiel passt
 param(
 [String]$Server=“localhost“,
 [int]$Port=50000,
 [int]$Month=3,
 [String]$LogPath=“~\Desktop\DeletedQuestDBEntries.log“
)
Import-Module ActiveDirectory
$ErrorActionPreference=“SilentlyContinue“
Get-ADObject -filter * -server „$($Server):$($Port)“ -searchbase *
$Root=($Error[0] | select -expandprop Exception | select -expandprop message).split(„:“)[1].split(„,“)[-1].substring(1).trimend(„‚.“)
$ErrorActionPreference=“Continue“
$Project=(Get-ADObject -filter * -server „$($Server):$($Port)“ -searchbase $Root -searchscope Onelevel | ? {$_.ObjectClass -eq „aelita-Amm-Workspace“}).Distinguishedname
$ComputerLogCollection=Get-ADObject -filter * -server „$($Server):$($Port)“ -searchbase „cn=Computers,cn=ResourceProcessing,$Project“ -searchscope onelevel -properties aelita-Amm-LastOperationTime,aelita-Amm-Name
$TimeSpan=(get-date)-(new-timespan -days ($Month*30))
$ToDelete=@()
$TotalCounter=$ComputerLogCollection.count
$DeleteCounter=0
„Searching Database. Please be patient!“
foreach ($Item in $ComputerLogCollection) {
 $Timestamp=$Item | select -expandprop aelita-Amm-LastOperationTime
 if ($Timestamp -and $Timestamp -lt $TimeSpan) {
  $ToDelete+=$Item  
  $DeleteCounter++
 }
}
if ((read-host -prompt „$DeleteCounter from $TotalCounter to delete, proceed (Yes/No)“) -notlike „Y*“) {„Aborted!“;exit}
„Deleted Entries of Questdatabase“ > $LogPath
„Run from: $(get-date)“ >> $LogPath
foreach ($Item in $ToDelete) {
 $Name=$Item | select -expandprop aelita-Amm-Name
 $Timestamp=$Item | select -expandprop aelita-Amm-LastOperationTime
 „Deleting $Name from $Timestamp“ | tee $LogPath -Append
 $Item | Remove-ADObject -Recursive -confirm:$false
}

Im einfachsten Fall starten Sie einfach das Script. Zunächst wird geschaut wieviele Einträge insgesamt vorhanden sind und wieviele davon gelöscht werden würden. Dann fragt es, ob Sie den Vorgang durchführen möchten und listet Ihnen die entsprechenden Objekte auf. Nebenbei werden diese Angaben in eine LogDatei auf Ihrem Desktop protokolliert. Sie können das Skript natürlich auch mit anderen Parametern aus dem Parameter Block aufrufen, wie z.B.:

./cleanQuestDB.ps1 -Server QuestServer -Port 40000 -Month 2 -LogPath C:\Quest.log

Voraussetzungen:
PowerShell 2.0 oder höher
AD-Modul verfügbar
Der Benutzer unter dem das Script läuft benötigt Vollzugriff auf die Quest-Datenbank
Muss mit erhöhten Rechten (UAC – Benutzerkontensteuerung) ausgeführt werden

Active Directory Replication Status Tool

Das Active Directory Replication Status Tool  liefert wertvolle grafisch aufbereitete Informationen zum Replikationsstatus von Active Directory Domain Controllern.

Einfache Powershell-Befehle für den Active Directory Papierkorb und eine GUI

Hier ein kleines Powershellscript, dass die Powershell um einfache Befehle für die Verwaltung und Einrichtung des Active Directory Papierkorbs erweitert (sollte der Downloadlink nicht angezeigt werden, klicken Sie bitte auf die Überschrift des Artikels):

AD-Papierkorb-Cmdlets

Um den AD-Papierkorb zu aktivieren muss das Script als Organisationsadministrator ausgeführt werden, da nur dieser berechtigt ist im gesamten Forest den Papierkorb zu aktivieren. Dieses Feature kann nicht auf Domänenebene aktiviert werden. Der Forestlevel muss auf 2008 R2 hochgestuft sein. Falls Sie befürchten, dass irgendwelche schädlichen Aktionen im Script versteckt sind, schauen Sie einfach hinein, oder lassen Sie es von jemand überprüfen der sich damit auskennt.

Wurde der Papierkorb bereits aktiviert, kann das Script zukünftig auch als Domänenadministrator aufgerufen werden.

Das Script selbst schafft zunächst nur die Voraussetzungen für die Befehle, damit diese auf der aktuellen Maschine in der aktuellen Domäne ausgeführt werden können und baut die Befehle als Funktion in Ihre aktuell laufende Powershell ein. Wenn Sie die aktuelle Powershell Konsole schließen sind die Befehle auch schon wieder vergessen. Sie müssen also jedes mal das Script starten, bevor Sie auf die Befehle zugreifen können. Selbstverständlich dürfen Sie das Script auch verändern, damit es zukünftig zu Ihrem Standardbefehlssatz gehört.

Der Papierkorb kann nur Objekte wiederherstellen, die nach seiner Aktivierung gelöscht wurden. Die Befehle können alle Objekte wieder herstellen, also nicht nur Benutzer ,Gruppen OUs und Computer.

Hier nun die 3 einfachen Befehle zur Verwaltung des Papierkorbs die sich automatisch an die Domäne in der Sie sich angemeldet haben anpassen:

Start-RecycleBin

Achtung! Ist der Papierkorb aktiviert, kann diese Funktionalität (generell – auch über die Standardwerkzeuge) nicht mehr zurückgezogen werden.

Einfach nur eintippen und der Papierkorb wird aktiviert. Ggf. fragt das Script noch ein paar Dinge ab. Auf jeden Fall informiert der Befehl darüber ob der Papierkorb aktiviert ist.

Show-DeletedADObjects

Aufruf auch hier ohne weitere Parameter. Zeigt alle sich derzeit im Papierkorb befindlichen Objekte an.

Restore-DeletedADObjects Suchbegriff

Dieser Befehl holt gelöschte Objekte aus dem Papierkorb zurück. Geben Sie den Befehl gefolgt von einem Suchbegriff ein. Der Suchbegriff verarbeitet keine Platzhalterzeichen wie z.B. ein *. Dies wird automatisch im Script vor und nach dem Suchbegriff eingesetzt. Sollten Sie nicht wissen was Sie gelöscht haben, können Sie sich mit Show-DeletedADObjects einen Überblick über den Inhalt des Papierkorbs verschaffen.

Wenn Sie eine komplette OU gelyncht haben, können Sie einfach den Namen der OU angeben. Alle enthaltenen Objekte werden automatisch mit angezeigt.

Der Befehl stellt nicht einfach alles wieder her was dem Suchbegriff entspricht, sondern listet erst einmal alles was er zum Suchbegriff findet und fragt dann nach ob er die Objekte wiederherstellen soll. Dies beantworten Sie dann mit Ja oder Nein.

Grafische Oberfläche für den AD-Papierkorb mittels Powershellscript:

Wenn Sie zu den Mausschubsern gehören, können Sie auch das folgende Powershellscript nutzen um per GUI (grafischer Oberfläche) den AD-Papierkorb zu verwalten:

AD-Recyclebin-Tool

Vorteile des Scripts:

  • Multiple Domain tauglich
  • Löschzeitraum kann angegeben werden
  • Schneller als so manche kommerzielle .EXE Datei
  • Kann mit etwas Glück sogar Objekte restaurieren, die vor Aktivierung des Papierkorbs gelöscht wurden.

GUIADRecycleBin

 

 

 

Das ZIP-Archiv ist in einen Ordner Ihrer Wahl zu entpacken. Darin enthalten sind ein paar Icons und das Script selbst. Einfach nur das Script ohne Parameter starten.

Der Einsatz der Scripte für den AD Papierkorb ist auch für den gewerblichen Einsatz kostenfrei. Gegen eine Spende (siehe PowerShell-Buch) habe ich aber sicher nichts einzuwenden ;-). Eine Haftung bei evtl. auftretenden Schäden wird nicht übernommen. Verbesserungsvorschläge nehme ich gerne über Kommentare oder das Kontaktformular entgegen.

Terminalserverprofilepath mittels Powershell abfragen

Benutzer aus dem AD (Active Directory) mit Powershell auszulesen ist nicht besonders schwierig. Alles was man dazu braucht ist entweder einen DC (Domänencontroller) oder einen Client mit installiertem AD-Modul für Powershell aus den RSAT (Remote-Server-Administration-Tools) und natürlich die Powershell Version 2.0 oder höher.

Mit dem Befehl get-aduser Benutzername erhält man aber nur einen kleinen Teil der Benutzereigenschaften. Wenn Sie mal richtig aufdrehen wollen (alle Eigenschaften haben) müssen Sie erst noch einmal etwas nachhelfen: get-aduser Benutzername -properties *. Leider ist der Pfad, den mal eventuell im Terminalserver bzw. Remotedesktopdienste -Profilepfad angegeben hat dort nicht wirklich auszulesen. Es gibt im LDAP zwar extra das Attribut msTSProfilePath doch legt Microsoft dort überhaupt nichts ab!!! Der Profilepfad ist im Attribut userParameters mit viel anderem Krempel leider codiert hinterlegt. Nichts desto trotz kann man hier wenigstens feststellen ob der TS Profilpfad beim Benutzer angegeben wurde, oder nicht. Das unten aufgeführte Script sollte weiter helfen. Wünschen Sie Verbesserungen/Anpassungen hinterlassen Sie einen entsprechenden Kommentar.

 

function SetTSProperties()
{
 $ou = [adsi]"LDAP://ou=mytestou,dc=nwtraders,dc=com"
 $user = $ou.psbase.get_children().find($userDN)
 $user.psbase.invokeSet("allowLogon",1)
 $user.psbase.invokeSet("TerminalServicesHomeDirectory",$hDirValue)
 $user.psbase.invokeSet("TerminalServicesProfilePath",$ppValue)
 $user.psbase.invokeSet("TerminalServicesHomeDrive",$hdValue)
 $user.setinfo() 
} #end SetTSProperties

function QueryTSProperties()
{
 $ou = [adsi]"LDAP://ou=mytestou,dc=nwtraders,dc=com"
 $user = $ou.psbase.get_children().find($userDN)
 foreach($property in $aryTSProperties)
 {
  "$($Property) value: $($user.psbase.invokeget($Property))"
 } #end foreach
} #end QueryTSProperties

$userDN = "CN=My User"
$hDirValue = "\\Hamburg\TSUsers\Home\TestUser"
$hdValue = "t:"
$ppValue = "\\Hamburg\TSUsers\Profiles\TestUser"
$aryTSProperties="allowLogon","TerminalServicesHomeDirectory",
  "TerminalServicesHomeDrive","TerminalServicesProfilePath"
SetTSProperties
queryTSProperties