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.

Wir finde ich schnell heraus, welcher Prozess auf einem Port lauscht?

Manchmal muss ein Admin „mal eben“ wissen, welcher Prozess einen listening Port blockiert nutzt. Auf Servern mit vielen abhörenden Ports in TCP und UDP wird die Ausgabeliste von netstat nur schnell unübersichtlich

Lösung

An der CMD- oder PowerShell geht das schneller als gedacht. ⚠️ Achtung: da die Shell international übersetzt ist, muss man find das jeweilig passende Suchwort mitgeben (English: „LISTEN“, deutsch „ABHÖREN“).

(CMD/PS) Zuerst die PID des lauschenden Prozesses finden …

netstat -ano | find "<PORT>" | find "ABH"

(PS) … dann den Prozess mit Pfad auflisten:

Get-WmiObject Win32_Process | Select ProcessId,CommandLine | findstr <PID>

(CMD) Das geht natürlich auch mit tasklist, allerdings nur ohne Pfad:

tasklist /fi "PID eq <PID>"

Die allerschnellste und PowerShell-Only Variante geht so:

Get-Process -Id (Get-NetTCPConnection -LocalPort <PORT>).OwningProcess

Schnell große Dateien an der Windows Kommandozeile erstellen

Manchmal braucht mal „auf die Schnelle“ eine Testdatei. Sei es um Fileserver zu testen, Netzwerkverbindungen auszulasten oder ein Dateisystem zu stressen.

Der schnellste bekannte Weg große Dateien zu erstellen ist mit dem Tool fsutil. Das geht an der CMD-Shell und natürlich auch in der PowerShell.

Lösung

fsutil file createnew <DATEINAME> <GROESSE>

Die Größe wird dabei in bytes angegeben.

Beispiele

fsutil file createnew 01MB-TESTDATEI.TEST 1048576

fsutil file createnew 01GB-TESTDATEI.TEST 1073741824

fsutil file createnew 05GB-TESTDATEI.TEST 5368709120

fsutil file createnew 10GB-TESTDATEI.TEST 10737418240

Falls man Probleme hat MB/MiB, KB/KiB und so weiter auseinanderzuhalten, es gibt da ein wundervolles XKCD das einiges erklärt 🙂

Veeam Backup for Microsoft 365: „Cannot change WebPart ExportMode to ‘All’. WebPart will be skipped“ Warnung bei SharePoint Sites

Bei der Sicherung von SharePoint-Sites für eine Organisation, die die moderne App-Authentifizierung nutzt, wird die folgende Warnung im Veeam Backup log angezeigt:

10.10.2010 01:01:01 :: Processing site <URL> finished with warning: Cannot change web part export mode to ‘All’, because custom scripting is disabled for site: <URL>. Web part will be skipped (web part ID: <GUID>, page: <URL>/pendingreq.aspx).

Um Webparts (Funktionsblöcke wie Tabellen, Bilder oder Remote-Inhalte) mit der modernen „App-Only“ Authentifizierung zu sichern, muss die Eigenschaft „Exportmodus“ des Webparts von „„Keine“ auf „Alle“ gesetzt werden.

Manchmal ist die Änderung der Eigenschaft durch den Admin verboten worden, sodass Veeam Backup for Microsoft 365 das nicht selber ändern kann; dann passierte diese Warnung.

Lösung

Man muss die Eigenschafte manuell (als Administrator) an der PowerShell setzen:

# SharePoint Online Modul installieren (falls noch nicht vorhanden)
Install-Module -Name Microsoft.Online.SharePoint.PowerShell

# Mit SPO verbinden
# -- Ohne MFA
$cred = Get-Credential
Connect-SPOService -Url https://<TENANTNAME>-admin.sharepoint.com -Credential $cred

# -- Mit MFA
Connect-SPOService -Url https://<TENANTNAME>-admin.sharepoint.com

# Custom Script in dieser SharePoint Site zulassen
Get-SPOSite -Identity https://<TENANTNAME>.sharepoint.com/sites/<SITENAME> | Set-SPOSite -DenyAddAndCustomizePages 0

# Custom Script in ALLEN Sites auf einmal erlauben
Get-SPOSite | Set-SPOSite -DenyAddAndCustomizePages 0

Ein paar „Cloud-Minuten“ später, meint ein paar Stunden Realzeit, funktioniert das Backup wieder. Natürlich gibt es ein paar Security Considerations wenn man Custom-Scripts zulässt.

Bonus-Tipp:

Um eine übersichtliche Auflistung der fehlgeschlagenen Sites im Veeam-Job zu erhalten, folgenden einzeiler in der „Veeam Backup for Microsoft 365 365 PowerShell“ ausführen:

(Get-VBOJob | ? LastStatus -eq Warning | Get-VBOJobSession | select -First 1).Log | ? Title -like '*custom scripting*' |ft Title

Update für Fehler „401“

Die PowerShell-Verbindung gibt möglicherweise hartnäckig den Fehler „401“ aus:

PS C:\> Connect-SPOService -Url https://<TENANTNAME>-admin.sharepoint.com
Connect-SPOService : Der Remoteserver hat einen Fehler zurückgegeben: (401) Nicht autorisiert.
In Zeile:1 Zeichen:1
+ Connect-SPOService -Url https://<TENANTNAME>-admin.sharepoint.com
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Connect-SPOService], WebException
    + FullyQualifiedErrorId : System.Net.WebException,Microsoft.Online.SharePoint.PowerShell.ConnectSPOService

Das liegt dann daran, das der Administrator der das gerade ausführt nicht Mitglied der Rolle „SharePoint Administrator“ ist. Die Rolle muss im Microsoft 365 Admin Center nur schnell dazugeklickt werden, nach der nächsten Anmeldung geht das sofort wieder.

Mitglider von Office 365 Gruppen können keine Ordner in gemeinsamen Postfächern erstellen

Benutzer in Office 365 Gruppen können Gruppen-E-Mails effektiver organisieren, wenn sie Ordner erstellen und/oder Regeln innerhalb des Gruppenpostfachs anlegen können. Das ist standardmäßig deaktiveirt.

Regeln können aber auch weiterhin nur im OWA (Outlook-Webanwendung) über „Postfach eines anderen Benutzer öffnen“ angelegt werden.

Lösung

Der Admin muss nur das Feature „Ordner und Regeln“ akivieren. Das gilt dann für alle Microsoft 365-Gruppen in der gesammten Organisation (im ganzen Tenant).

Ordner- und Regeln für Gruppen einschalten:

Set-OrganizationConfig -IsGroupFoldersAndRulesEnabled

Status der Richtlinie prüfen:

Get-OrganizationConfig | fl IsGroupFolders*