PowerShell: Liste alle Dienste auf allen Servern auf, die als Benutzer (oder Administrator) starten

Bei einer Kennwortänderung in kleinen Domänen, also wenn das „Administrator“ Kennwort nach laaaanger Laufzeit geändert wird, müssen einige Dienste, die im Laufe der Zeit als solcher eingerichtet wurden, ebenfalls geändert werden. In den meisten Fällen ist im Laufe der Zeit auch die Anzahl der Server gewachsen.

Wie kommt der faule Administrator als nun an eine Liste der Server, wo die Anmeldedaten von Diensten angepasst werden müssen?

Lösung

Unter der Voraussetzung, dass PowerShell Remoting eingerichtet und funktionsfähig ist, hilft dieses kleine aber feine Script.

Zuerst wird eine Liste aller Server aus dem AD geholt und dann via WMIC eine gefilterte Liste der Dienste geholt, die nicht als „LocalSystem“ oder „NT Author%“ gestartet werden. Letzteres ist ein Trick, um sowohl „NT Authorität“ als auch „NT Authority“ auf Deutsch und Englisch zu erwischen.

Import-Module ActiveDirectory

$Servers = ( (Get-ADComputer -Filter 'operatingsystem -like "*server*" -and enabled -eq "true"').dnshostname )
$ServiceName =  @{ Name = 'ServiceName'; Expression = {$_.Name}}
$ServiceDisplayname = @{ Name = 'Service DisplayName';  Expression = {$_.Caption}}

foreach ($server in $servers) {
    Invoke-Command $server -ScriptBlock {
        Get-CimInstance -Class Win32_Service -filter "StartName != 'LocalSystem' AND NOT StartName LIKE 'NT Author%' " } | 
            Select-Object SystemName, $ServiceName, $ServiceDisplayname, StartMode, StartName, State | format-table -autosize
}

PowerShell startet nicht mehr (System.ArgumentException, SHostUserInterface.GetTranscriptOptionFromSettings, System.IO.Directory.CreateDirectory)

Unter Windows Server 2012R2 startet die PowerShell „auf einmal“ nicht mehr. Nach dem Start erscheint direkt „powershell funktioniert nicht mehr“ und der Konsolenhost schießt sich wieder.

Server 2012R2 ist zwar bekanntermaßen EOL und muss weg, aber manchmal braucht man für den Wechsel auf ein neues System nun ebenjene PowerShell.

Die PowerShell stürzt ab mit diesem Fehler:

Problemsignatur:
  Problemereignisname:	PowerShell
  NameOfExe:	powershell.exe
  FileVersionOfSystemManagementAutomation:	6.3.9600.21616
  InnermostExceptionType:System.ArgumentException
  OutermostExceptionType:System.ArgumentException
  DeepestPowerShellFrame:SHostUserInterface.GetTranscriptOptionFromSettings
  DeepestFrame:System.IO.Directory.CreateDirectory
  ThreadName:	Consol.. main thread
  Betriebsystemversion:	6.3.9600.2.0.0.400.8
  Gebietsschema-ID:	1031

Lesen Sie unsere Datenschutzbestimmungen online:
  http://go.microsoft.com/fwlink/?linkid=280262

Wenn die Onlinedatenschutzbestimmungen nicht verfügbar sind, lesen Sie unsere Datenschutzbestimmungen offline:
  C:\Windows\system32\de-DE\erofflps.txt

Lösung

In diesem Fall war es die Gruppenrichtlinie „PowerShell-Aufzeichnung aktivieren“ (Computer > Administrative Vorlagen > Windows-Komponenten/Windows PowerShell > PowerShell-Aufzeichnung aktivieren).

Die GPO setzt diesen Registry-Schlüssel:

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\PowerShell\Transcription]
"EnableTranscripting"="1"

Server 2012R2 erwartet aber nicht nur diesen Key, sondern auch noch den Ausgabepfad als Zeichenkette (OutputDirectory). Bleibt die Zeichenkette leer, startet die PowerShell nicht mehr. Als Gegenprobe: Setzt man den Eintrag „EnableTranscripting“ auf „0“ funktioniert sofort wieder alles – bis die GPO den Eintrag wieder zurückändert.

Also gibt es als schnelle Lösung eine *.reg-Datei, die einfach dort einen Pfad (den es geben sollte!) hinzufügt:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\PowerShell\Transcription]
"OutputDirectory"="C:\\Windows\\Temp"

Solle die GPO beim nächsten gpupdate den Pfad wieder leeren, müsste man seine Richtlinie entsprechend anpassen. Oder (empfohlen) die Migration des 2012R2-Systems ASAP abschießen.

Manchmal …

Ein Standort kann nicht mehr arbeiten. Links an den Geräten da, Gateway antwortet auf pings. Neustart des Gateways (VPN-Routers) hilft nicht.

Mit „Technikverständigen“ telefoniert, alles leuchtet, alles richtig. Viele Kilometer Anfahrt.

Vor Ort: Internet tatsächlich weg. Kommt auch nicht wieder. Nach (sehr) kurzem Hotline-Telefonat stellt sich raus: Die Rechnung wurde nicht bezahlt. Nach drei Mahnungen wurde der Dienst daher eingestellt.

m(

Fehlersuche. Die Rechnungen und Mahnungen wurden alle korrekt abgelegt. Man hat „neulich“ eine Aushilfskraft für die Ablage eingestellt. Die hat ihren Job gemacht: Alles abgelegt. Sofort. Ohne Ausnahme. Absolut alles. Mahnungen, Rechnungen, Vertragsänderungen, Lieferantenmitteilungen, Anwaltsschreiben, Falschparker-Tickets, Pizza-Flyer. Alles im Keller verschwunden: Post-Umschlag auf, Inhalt gelocht, Aktenordner auf, Ablage.

m(

Jetzt werden Prozesse geändert. BEVOR Dinge in der Ablage verschwinden, werden sie gelesen und (falls nötig) bearbeitet. Klingt nach einer guten Idee. Die Internet-Rechnung war auch nicht die einzige „verschwundene“ …

Danke an Netcologne für die unbürokratische, schnelle und wahnsinnig hilfreiche Sofort-Reaktion mit Internet-Freischaltung in diesem Fall. Eure Rechnungen werden jetzt korrekt bezahlt, die Mahngebühren auch. Der Kunde hat kein Geldproblem, nur ein Orga-Problem …

Windows Updates über die Eingabeaufforderung deinstallieren

Aus gegebenem Anlass 🥴 hier die schnelle Notiz zur Entfernung von Windows-Updates an der Kommandozeile. Das braucht man schon mal, wenn mal wieder ein Windows 11 den Nutzer mit einem leeren schwarzen Bildschirm begrüßt. Das eine oder andre Update löst diesen Effekt ja bekanntermaßen aus.

In so einem Fall kann man (zum Glück) mit STRG+ALT+ENTF den Taskmanager starten und von dort aus eine Kommandozeile „Als Administrator“ ausführen.

Lösung

Updates auflisten:

dism /online /get-packages

Updates deinstallieren:

dism /online /remove-package /packagename:<NAME>

Der Name ist die „Paketidentität“ in ganzer Länge. Die Liste ist zwar leider etwas länger und nicht nach einem erkennbaren Muster sortiert, aber so kann man imerhin das „neueste“ Rollup suchen und entfernen.

WordPress SVG Upload erlauben („Du bist leider nicht berechtigt, diesen Dateityp hochzuladen“)

WordPress erlaubt in der Standardkonfiguration leider bis heute noch keine Verwendung von SVG-Bildern in der Mediathek. Versucht man eine SVG-Datei hochzuladen erscheint der Fehler „<Name>konnte nicht hochgeladen werden. Du bist leider nicht berechtigt, diesen Dateityp hochzuladen.“

Das hat natürlich auch einen Grund: SVGs sind ja XML-Dateien mit potenziell ausführbarem JS-Inhalt. Die „falsche“ SVG Datei könnte, genau wie eine „falsche“ JS oder HTM* Datei möglicherweise Schaden anrichten.

Unverständlicherweise gibt es bis heute aber noch keine „offizielle“ Möglichkeit, SVGs in seinem eigenen privaten Blog zu erlauben.

Lösung

In der functions.php des aktuell verwendeten Themes kann man den Filter einfach umgehen.

<?php
/* SVG erlauben - the old way */
function kb_svg ( $svg_mime ){
	$svg_mime['svg'] = 'image/svg+xml';
	return $svg_mime;
}
add_filter( 'upload_mimes', 'kb_svg' );

/* SVG erlauben - the new way (WP 4.7+) */
function kb_ignore_upload_ext($checked, $file, $filename, $mimes){
if(!$checked['type']){
	$wp_filetype = wp_check_filetype( $filename, $mimes );
	$ext = $wp_filetype['ext'];
	$type = $wp_filetype['type'];
	$proper_filename = $filename;

	if($type && 0 === strpos($type, 'image/') && $ext !== 'svg'){
		$ext = $type = false;
	}

	$checked = compact('ext','type','proper_filename');
}

return $checked;
}
add_filter('wp_check_filetype_and_ext', 'kb_ignore_upload_ext', 10, 4);
?>

Natürlich sollte das nicht so sein, ein Theme sollte nicht die Sicherheitsfunktion des WordPress-Systems verbiegen müssen. Leider ist das bisher der schnellste Weg für Admins um SVG-Grafiken zu erlauben.