Netz-Weise Logo

Weisheiten - der Netz-Weise Blog

Hier finden Sie Tipps und Tricks für vor, während und nach der Schulung.

Mit Powershell ein Kennwort gegen AD prüfen

Wenn Sie mit Powershell überprüfen möchten, ob eine gegebene Kombination aus einem AD-Benutzernamen und Kennwort korrekt ist (z.B. aus einer GUI-Eingabe), hilft Ihnen die .NET-Assembly System.Directore.Accountmanagement weiter (mind. .NET-Framwork 3.5). Die Klasse "PrincipalContext" enthält eine Methode ValidateCredentials, die die Überprüfung übernimmt. Die Funktion check_AdUserPassword liefert True oder False zurück und kann z.B. direkt in einem IF-Statement weiter genutzt werden.

Function Test-AdUserPassword
{

param (
    [string]
    $UserName,
    [string]
    $Password,
    [string]
    $UserDomain)

   # Lädt die Assembly "System.DirectoryServices.AccountManagement" in Powershell
   $Null = Add-Type -AssemblyName System.DirectoryServices.AccountManagement
   $ContextType = [System.DirectoryServices.AccountManagement.ContextType]::Domain
   $PrincipalContext = New-Object System.DirectoryServices.AccountManagement.PrincipalContext($ContextType, $UserDomain)
   $PrincipalContext.ValidateCredentials($UserName,$Password)

}

 

Zwei XML-Dateien mit Powershell vergleichen und einen HTML-Report erzeugen

Das XML-Format ist allgegenwärtig. Als Windows-Administrator stolpert man regelmäßig über Eventlogs im XML-Format, Anweisungsdateien für die unbeaufsichtigte Installation, Vorlagen für Gruppenrichtlinien usw. Und manchmal wäre es ganz schön, wenn man sich den Unterschied zwischen zwei ähnlichen XML-Dateien einfach anzeigen lassen könnte. Mit Powershell und ein bißchen .net ist das in der Tag auch gar kein Problem, denn Microsoft hat vor fast 15 Jahren eine .Net-Bibliothek zur Verfügung gestellt, die genau das tut - das XML Diff & Patch GUI Tool. Das Tool stellt eine Klasse zur Verfügung, über die es möglich ist, zwei XML-Dateien zu vergleichen und die Unterschiede in der XML DIfference Language (Diffgram) auszugeben. Mit einer weiteren Klasse kann man aus einer Diffgram-Datei und einer der beiden Vergleichsdateien eine HTML-Datei erzeugen, die die Unterschiede grafisch darstellt.

Wenn Sie die heruntergeladene Bibliothek entpacken, finden Sie im zwei .dlls, die Sie laden müssen, die XmlDiffPath.dll, die die Compare()-Methode zur Verfügung stellt, und die XmlDiffPath.View.dll, die die Methode GetHtml() bereitstellt. GetHtml erstellt aus einer Diffgram-Datei eine HTML-Datei. Laden Sie die Klassen und erstellen Sie zwei neue Objekte.

Add-Type -Path "xmldiffpatch.dll"
$XmlDiff = New-Object -TypeName Microsoft.XmlDiffPatch.XmlDiff
Add-Type -Path "XmlDiffPatch.View.dll"
$XmlDiffView = New-Object -TypeName Microsoft.XmlDiffPatch.XmlDiffView

Anschließend können Sie die Methode Compare() aufrufen. Compare hat eine Reihe von Überladungen (verschiedene Parameter-Kombinationen). Zum Erstellen eines Diffgramwriters benötigen Sie die beiden zu vergleichenden XML-Dateien, $false und einen .Net-Streamwriter zum Schreiben der Diffgram-Datei:

$DiffGramWriter = [System.Xml.XmlWriter]::Create( 'C:\temp\Diffgram.xml' )
#call Compare method from Microsoft.XmlDiffPatch.XmlDiff object
$XmlDiff.Compare('C:\temp\File1.xml','C:\Temp\File2.xml',$false,$DiffGramWriter)
$DiffGramWriter.Close()

Weiterlesen
Markiert in:

USB-Geräte mit Powershell und WMI auslesen

Am USB angeschlossene Geräte kann man per WMI auslesen. WMI stellt dafür die WMI Association Klasse Win32_USBControllerDevice zur Verfügung, die zwei Klassen miteinander verbindet - in diesem Fall die Daten des USB-Controllers und die installierten Treiber. Die verknüpften Treiber kann man aus der Eigenschaft Dependent auslesen.

Get-WmiObject Win32_USBControllerDevice | Foreach-Object { [Wmi]$_.Dependent }

[WMI] Wandelt den String, der in der Eigenschaft $_.Dependent hinerlegt ist, wieder eine WMI-Klasse um. Um einen überschaubaren Überblick über die installierten Geräte zu bekommen, wählt man am Besten erst einmal die Eigenschaften Descritption und DeviceID aus.

Get-WmiObject Win32_USBControllerDevice | ForEach-Object { [wmi]$_.dependent } | select-Object description,deviceid

Das Ergebnis sieht dann ungefähr so aus:

Weiterlesen

Den Windows Lizenzkey aus der Firmware aka Bios auslesen und aktivieren per Powershell

Letzte Woche habe ich durch Zufall festgestellt, dass der Rechner einer Kollegin, der schon vor Jahren per automatischem Update auf Windows 10 aktualisiert worden ist, immer noch nicht aktiviert war, obwohl das vorher installierte Windows 8.1 es war und Windows 10 sich außerdem den Key automatisch aus der Firmware ziehen soll, wenn er da hinterlegt ist. Glücklicherweise ist die Aktivierung von Windows 10 immer noch mit den Keys voriger Versionen möglich. Der Key selbst ist im BIOS nicht einsehbar, läßt sich aber über WMI einfach auslesen. Er ist in der Klasse SoftwareLicensingService in der Eigenschaft OA3xOriginalProductKey hinterlegt. Mit Powershell nutzen Sie für das Auslesen einfach Get-WMIObject oder Get-CIMClass:

(Get-WmiObject -Class SoftwareLicensingService).OA3xOriginalProductKey

oder ab Powershell 4 auch

(Get-CimInstance -ClassName SoftwareLicensingService ).OA3xOriginalProductKey

Mit dem Tool slmgr.vbs können Sie die LIzenz auch gleich installieren und aktivieren:

Weiterlesen

Kalenderdaten aus Outlook in Excel übertragen und Tage zählen

Letztes Wochenende wollte ich wissen, wie viele Tage ich im letzten Jahr geschult habe. Da alle Schulungstermine in einem Outlook-Kalender gepflegt sind, liegt es Nahe, die Termine von Outlook nach Excel zu übertragen und dann per Excel auszuwerten. Das geht tatsächlich, ist aber nicht unbedingt intuitiv.

Zuerst müssen Sie Ihren Kalender öffnen und Outlook im Menü Ansicht über den Eintrag "Ansicht ändern" in die Listenansicht umstellen. Anschließend können Sie die Ansicht über das Suchfenster filtern und die Termine, die Sie in Excel übertragen wollen, markieren und kopieren. Im Suchfenster können Sie mehrere mit Leerzeichen getrennte Wörter als einen zusammengehörigen Suchbegriff angeben, indem Sie ihn in Anführungszeichen setzen. Soll Outlook also nicht alle Termine mit Trainer oder alle Termine mit Holger im Titel finden, sondern alle des Trainers Holger, geben Sie an: "Trainer: Holger". Der Text muss dann genau so in der Terminbeschreibung eingegeben sein.

In Excel sollten sie Daten korrekt als Tabelle eingefügt werden. Sie verfügen jetzt mehrere Spalten wie Betreff, Ort, Beginn, Ende usw.

Erstellen Sie jetzt in einer neuen Spalte eine Funktion, die das Start- und Enddatum, die als Text übertragen wurden, in einen Datumswert umwndelt. Dazu benötigen Sie die Funktion Datum(), die Text in ein Datum umwandlet. Datum() hätte das Datum aber gerne im Format (Jahre;Monat;Tag), während Beginn und Ende in der Tabelle im Format "Mo 04.09.2017 09:00" vorliegen. Wir müssen aus dem Text also den Tag, den Monat und das Jahr extrahieren. Das geht mit der Funktion Teil(), die 3 Übergabewerte benötigt - Den Text oder die Zelle, die bearbeitet werden soll, das Startzeichen und die Menge der Zeichen, die augeschnitten werden sollen.Um das Jahr aus dem angegebenen Datumsformat auszuschneiden, brauchen wir die Spalte C, als Startwert 10 und 4 Zeichen:

Teil(C2,10,4)

Weiterlesen
Markiert in:

Für Powershell Cmdlet-Parameter Standardwerte definieren

Das Feature ist nicht neu, aber trotzdem noch mal eine Erinnerung wert. Wenn Sie in einem Skript für einen Parameter immer wieder das gleiche Argument verwenden, können Sie es auch als Standard-Wert hinterlegen. Konkret könnte das z.B. der Domänencontroller sein, der die Einzelbetriebsmasterrolle PDC-Emulator inne hat. Powershell stellt Ihnen dafür die Systemvariable $PSDefaultParameterValues zur Verfügung. Sie wird mit einem Hash-Array befüllt, das für jedes Cmdlet als Schlüsselwert den Cmdlet-Namen und, mit einem ":" getrennt, den Parameternamen enthält, sowie als Wert das Standard-Argument.

$Pdc = Get-ADDomainController -Service PrimaryDC -Discover
$ServerDefaults = @{ "Get-ADUser:Server"=$pdc.HostName
   "Get-ADComputer:Server"=$Pdc.HostName
   "Get-ADObject:Server"=$Pdc.Hostname
 }
$PSDefaultParameterValues = $ServerDefaults
$PSDefaultParameterValues
Get-ADUser -Filter *

Markiert in:

Eine Zahlenreihe in zwei alternierende (wechselnde) Gruppen aufteilen mit Powershell

Stellen Sie sich vor, Sie haben eine aufsteigende Reihe natürlicher (ganzer) Zahlen. Sie wollen die Zahlenreihe in 2 Blöcke aufteilen, die nach einer bestimmten Menge von Zahlen jeweils wechselt. Dazu ein Beispiel:

Gruppe 1Gruppe 2
1-500501-1000
1001-1500 1501-2000
2001-25002501-3000

 

 

 

 

Weiterlesen
Markiert in:

Ein niedrig priveligiertes Konto zum Entsperren von Domänenbenutzern anlegen und damit Benutzer-Sperren retten

Das Sperren von Benutzerkonten ist ein bewährtes Mittel, um Brute-Force-Attacken gegen Kennwörter im Unternehmen zu verhindern. Allerdings empfehlen sowohl Microsoft als auch das BSI inzwischen, Kontosperrungen nicht zu verwenden, da eine Malware oder ein Hacker durch das Sperren sämtlicher Benutzerkonten ein Netzwerk komplett lahm lagen kann - man spricht auch von einem denial of Service.

Die alternative Empfehlung lautet, lange Kennwörter in Form von Passphrases und am Besten Multifaktor-Authentifizierung einzusetzen. Grundsätzlich ist das ein vernünftiger Ansatz, aber leider scheitert er in vielen Netzwerken immer noch an der Praxis. Zum einen muß man den Benutzern erklären, dass Sie jetzt lange komplexe Kennwort-Sätze verwenden sollen, zum Anderen muß man mit dieser Variante auch für eine ordentliche Anmeldungs-Überwachung sorgen, da ein großangelegter Angriff auf die Benutzerkennwörter sonst gar nicht auffällt. Mit aktivierter Kennwortsperrung merkt man normalerweise sehr schnell, dass etwas nicht stimmt.

Mein pragmatischer alternativer Ansatz, um die Kontosperrungen weiterhin nutzen zu können, arbeitet mit automatisierten Prozessen und Powershell. Denn mit Powershell ist es sehr schnell und einfach möglich, Benutzerkonten zu entsperren. Verwenden Sie dafür die Cmdlets Search-ADAccount und Unlock-ADAccount. Search-ADAccount kann mit dem Parameter -Lockedout alle gesperrten Benutzerkonten in einem Rutsch auflisten, Unlock-ADAccount kann sie  direkt entsperren. Mit Hilfe des Cmdlets Out-Gridview können Sie sich auch gleich noch eine grafische Benutzeroberfläche einrichten, um nur ausgewählte Benutzer zu entsperren.

Search-ADAccount -Lockedout | Out-Gridview -Passthru | Unlock-ADAccount

Damit wird das Entsperren nach einem Denial of Service zu einem Kinderspiel. Allerdings muß noch ein zweites Problem gelöst werden. Wenn Sie nämlich das Standard-Administratorkonto auf der Domäne deaktivieren, haben Sie eventuell gar keine Möglichkeit mehr, die Domäne zu entsperren, weil Ihr Administrator auch gesperrt ist. Deswegen legen Sie sich nun ein niedrig privilegiertes Konto an, dass neben dem Entsperren von Benutzern in der Domäne nichts kann, aber nicht gesperrt wird.

Weiterlesen

Computerkennwörter, der Secure Channel und die Fehlermeldung „Die Vertrauensstellung zwischen dieser Arbeitsstation und der primären Domäne konnte nicht hergestellt werden”

Wenn ein Domänen-Computer gestartet wird, sucht er im Netzwerk zuerst nach einem Domänen-Controller, indem der den DNS-Server nach den LDAP-Service-Records seiner Domäne fragt. Anschließend versucht er, mit dem Domänencontroller einen Secure Channel, also eine verschlüsselte, sichere Datenverbindung aufzubauen. Dies geschieht über einen RPC Netlogon. RPC ist ein Challenge-Response-Protokoll, bei dem der Client und der Server sich gegenseitig einen zufälligen 64 Bit-Zufallswert, den Client- bzw. Server Challenge, zuschicken, aus denen mit Hilfe des Computerkennworts (wegen gegenseitige Authentifizierung sowohl auf dem Client als auch auf dem Server) ein Session-Key berechnet wird. Das funktioniert, weil sowohl der Client als auch der Domänencontroller über das Computerkennwort des Clients verfügen. Wenn der Domänencontroller und der Client nicht das gleiche Kennwort gespeichert haben, schlägt die Erstellung des Secure Channels allerdings fehl und dem Client wird die Verbindung zum Domänencontroller verweigert. Stattdessen wird eine Fehlermeldung angezeigt, die vermutlich jeder Administrator schon einmal gesehen hat: „The trust relationship between this workstation and the primary domain failed” bzw. "Die Vertrauensstellung zwischen dieser Arbeitsstation und der primären Domäne konnte nicht hergestellt werden".

Wie und wo wird das Computerkennwort verwaltet

Der Client generiert beim Aufnehmen in die Domäne ein komplexes Kennwort, dass er ab Windows 2000 alle 30 Tage automatisch ändert. Da Computerkonten sind von den Kennwortrichtlinien der Domäne ausgenommen sind, können Sie auch nicht gesperrt werden, wenn sie länger offline sind.
Die Kennwortänderung führt der Client zuerst zuerst lokal aus. Danach ändert er sein Kennwort im AD. Schlägt die Aktualisierung im AD fehl, setzt er wieder das alte Kennwort. Das aktuelle Kennwort und sein Vorgänger werden im geschützten Kennwortschlüssel HKLM\SECURITY\Policy\Secrets\$machine.ACC gespeichert. Im AD sind die Kennwörter in den Attributen unicodepwd und lmpwdHistory abgelegt.
Ob und wie oft der Client sein Kennwort ändert, kann in der Systemregistrierung unter HKLM\SYSTEM\CurrentControlSet\Services\NetLogon\Parameters konfiguriert werden. Für die Konfiguration sind drei Schlüssel verantwortlich:

MaximumPasswordAge: Der Eintrag MaximumPasswordAge legt fest, nach welchem Zeitraum der Netlogon-Dienst versucht, das Kennwort zu ändern. Der Standardwert ist 30 (Tage).

ScavengeInterval: Das Scavengeinterval legt fest, wie häufig der Computer prüfen soll, ob das maximale Kennwortalter erreicht ist. Der Standardwert beträgt 900 (Sekunden), also 15 Minuten. Der Eintrag ist nicht in der Registry hinterlegt, kann hier aber geändert werden. Der Typ des Eintrags ist REG_DWORD.

DisablePasswordChange: Sie können die Kennwortänderung des Computers mit diesem Schlüssel auch komplett deaktivieren, indem Sie den Wert auf 1 setzen.

Weiterlesen

Windows Apps von Windows entfernen - vor und nach der Installation

Windows 10 kennt zwei verschiedene Anwendungstypen - die klassischen Anwendungen und Apps. Apps gibt es seit Windows 8, und sie sind vom App-Konzept von Apple und Google übernommen. Apps unterscheiden sich in einigen grundlegenden Dingen von Anwendungen:

  • Apps lassen sich von jedem Benutzer bereitstellen - es werden keine administrativen Berechtigungen benötigt
  • Eine App wird normalerweise für einen Benutzer bereitgestellt, nicht für den Computer
  • Das App-Berechtigungskonzept bietet mehr Sicherheit, da jeder App der Zugriff auf jedes Gerät explizit gesperrt werden kann.
  • Apps haben keinen Installer, sondern werden aus dem Microsoft Store oder per Sideloading installiert

 

Zumindest der letzte Punkt könnte sich ändern, denn Microsoft hat ein neues Format für die automatische Installation entwickelt, nämlich msix. Trotzdem möchte nicht jeder Administrator Apps in seiner Umgebung bereitstellen. Um die bereits mit Windows mitgelieferten Apps loszuwerden, muß man allerdings einige konzeptuelle Dinge verstehen:

Grundsätzlich werden Apps pro Benutzer installiert. Man spricht von Appx-Paketen. Um Appx-Pakete zu verwalten, können Sie Powershell-Cmdlets verwenden:

  • Get-AppxPackage listet installierte Apps auf
  • Remove-Appxpackage entfernt installierte Apps
  • Get-AppxLog zeigt das Installations- und Wartungslog für Apps an.

 

Weiterlesen

Netz-Weise Firmenlogo

Das Haupt-Tätigkeitsfeld von Netz-Weise sind Schulungen für Profis. Bei uns bekommen Sie das Programm für den fortgeschrittenen Praktiker, der die Tiefen des Systems ausloten möchte genauso wie Standard-Schulungen.

facebook   twitter   linkedin   xing   youtube   instagram