Office 365 Powershell Zugänge unter Windows 10 (1809+)

Nachdem der letze Beitrag zum Thema Office 365 Powershell ja mittlerweile veraltet ist, hier die aktuelle Methode eine Verbindung zu Office 365 herzustellen.

„Heute“ nutzt man direkt die AzureAD Module die man via NuGet installiert und nicht mehr die MSOnline „Extra“ Shell.

Installation des AzureAD Module (Lizenzen, Office 365 Benutzer …)

  1. Öffnen der Powershell „Als Administrator“ und das Modul installieren:
PS C:\> Install-Module -Name AzureAD

Nicht vertrauenswürdiges Repository
Sie installieren die Module aus einem nicht vertrauenswürdigen Repository. Wenn Sie diesem Repository vertrauen, ändern
 Sie dessen InstallationPolicy-Wert, indem Sie das Set-PSRepository-Cmdlet ausführen. Möchten Sie die Module von
'PSGallery' wirklich installieren?
[J] Ja  [A] Ja, alle  [N] Nein  [K] Nein, keine  [H] Anhalten  [?] Hilfe (Standard ist "N"): j
PS C:\>

2. Herstellen der Verbindung zum AzureAD (Office 365)

PS C:\> Connect-AzureAD

Account                     Environment TenantId                             TenantDomain    AccountType
-------                     ----------- --------                             ------------    -----------
<UPN>> AzureCloud  affeaffe-b00b54e0e-a0c4-a5b16ca62f5b <DOMAIN> User
PS C:\>

… fertig. Und schon kann man mit den AzureAD-CMDlets wie Get-AzureADUser, Get-AzureADUserLicenseDetail und allen anderen loslegen.

Eine Liste aller CMDlets gibt es mit:

Get-Command -Module AzureAD

Server 2016/Windows 10 Software im „Abgesicherten Modus“ deinstallieren

Problem

Programme im abgesicherten Modus deinstallieren ist, interessanterweise, nicht ohne weiteres möglich. Wenn man bedenkt das über 90% aller Windows-Abstürze die so eine Operation notwendig machen durch (AV)Software entsteht eine sehr seltsame Desingentscheidung … aber nunja. Wie entfernt man nun Progamme im „Abgesicherten Modus“?

Lösung

  1. Windows im „Abgesicherten Modus“ starten
  2. Unter HKLM/SYSTEM/CurrentControlSet/Control/SafeBoot/Minimal einen neuen Schlüssel mit dem Namen „MSIService“ erstellen
  3. Darin Schlüssel „(Standard)“-Wert auf „Service“ umstellen

Der Schlüssel Minimal enthält die Liste der Treiber und Dienste, die im Abgesicherten Modus zur Verfügung stehen. Nach einem Neustart (oder einem manuellen Dienststart) ist es wieder möglich, programme zu deinstallieren.

Der Schlüssel „network“ beinhaltet übrigend selbiges, nur für den „Abgesicherten Modus mit Netzwerk“.

SQL Express 2012/2014 Windows Authentifizierung nach crash zurücksetzen

Problem

Der Microsoft SQL Server Express Edition ist sehr praktisch, aber leider nach der Installation auch leicht zu übersehen. Nach einem Domänenwechsel, Domänen-Autritt oder einem Crash (der zum Verlust der Anmeldekonten führte) ist eine SQL-Express-Instanz nicht mehr zugänglich. Standardmäßig sind nur Windows-Anmeldungen erlaubt, die es nun ja nicht mehr gibt.

„Zugriff verweigert“ oder „Access to Database denied“ lauten die Fehlermeldungen dazu.

Lösung

Man kann die Authentifizierung im SQLEE insofern zurücksetzen, als das man sein eigenes Anmeldekonto (sofern administrativ) zum SYSADMIN in der Datenbankinstanz macht. Dann kann mann sich wieder anmelden, die Rechte zurücksetzen und seine Datenbanken richtig konfigurieren.

Dazu muss die Datenbank im „Einzelbenutzermodus“ gestartet werden:

  • SQL Server Configuration manager („SQL Server 2014-Konfigurations-Manager“) öffnen
  • Links im Baum unter den „SQL Server-Diensten“ rechts den SQL Server auswählen
  • Eigenschaften > Startparameter > „-m“ hinzufügen („Add“), ohne Anfürungszeichen
  • Dienst neu starten (nun ist die DB im Einzelbenutzermodus)
  • Mit SQLCMD zur Instanz verbinden:
C:\> "%ProgramFiles%\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn\SQLCMD.EXE" -S .\<INSTANZNAME>
  • Am SQL Prompt dann den Admin hinzufügen
1> EXEC sp_addsrvrolemember '<SERVER/DOMAINNAME>\<BENUTZER>', 'sysadmin'
2> GO
1> exit
  • Dann den Startparameter „-m“ wieder entfernen, den Dienst neu starten und an der Instanz mit dem gerade hinzugefügten Konto anmelden.

Fertig 🙂

PHP Manager 1.2 for IIS 7 Installation failed (1603)

Unter Windows Server 2016 möchte der PHP Manager für den IIS via Plattform-Installer nicht so recht installiert werden. Das Logfile dazu sagt:

...
MSI (s) (2C:10) [ZEIT]: Product: PHP Manager 1.2 for IIS 7 -- Installation failed.
MSI (s) (2C:10) [ZEIT]: Windows Installer installed the product. Product Name: PHP Manager 1.2 for IIS 7. Product Version: 1.2.0. Product Language: 1033. Manufacturer: . Installation success or error status: 1603.
...

Ähnlich wie die scheinbar von Selbstzweifeln geprägte Aussage „Installation success or error“ ist auch der Rest des Logfiles nicht wirklich hilfreich.

Lösung

Die Lösung ist einfach, wenn auch (bis heute zumindest) nicht dokumentiert. Es geht nicht – der IIS PHP Manager ist nur für Windows 8.1 oder kleiner (IIS 8) gedacht, nicht für den IIS 10.0 (Windows 10 / Server 2016). Glücklicherweise lässt sich die IIS-Versionserkennung recht einfach patchen:

  1. Ändere diesen REG_DWORD auf 8 (dezimal): HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\MajorVersion
  2. Instaliere den PHP Manager
  3. Ändere den Schlüssel wieder zurück auf 10

Uns sind bisher keine negativen Folgen der Änderungen bekannt.

„Outlook kann Ihre Suche nicht ausführen“ Outlook 2013/2016/2019/365 unter Server 2016

Problem

Man sucht mit Outlook in der Schnellsuche (oben), aber man erhält keine Ergebnisse. Genauer gesagt, die Anzeige verändert sich überhaupt nicht. Der Indizierungsstatus meldet aber noch „0 Elemente“ und die erweiterte Suche funktioniert einwandfrei. Ganz unten, unterhalb der E-Mails sieht man in Kursiv die Meldung

"Outlook kann Ihre Suche nicht ausführen"
oder auf Englisch:
"Outlook cannot perform the search."

Das passiert auf Windows Server 2016 RDS („Terminal Server“).

Lösung

Das passiert mehr oder weniger automatisch, wenn man das Windows-Update KB4467684 installiert (27. November 2018, Build 14393.2639). Das ist ein bekannter Bug in diesem Patch. Das Problem kann (temporär) gelöst werden durch (kein Scherz):

sfc /scannow

Windows Server 2016 RDS Effekte (Black Screen, Startmenü defekt)

Problem:

Ein Terminal Server (RDS Session Host) zeigt nach einiger Zeit verschiedene Effekte, wie z.B. „schwarzer Bildschirm nach der Anmeldung“, „nicht mehr funktionierendes Startmenü“, allgemeine Performance- oder Anmeldeprobleme.

Dies betrifft übrigens nicht zwingend nur RDS-SHs, sondern prinzipiell alle Windows Server 2016 Maschinen, auf Terminalservern (insbesondere mit User Profile Disks, UPDs) ist das ganze aufgrund potenziell größerer Anmelde-/Benutzeranzahl nur deutlich wahrscheinlicher anzutreffen.

Lösung:

Schuld könnte ein Bug sein, welcher dafür sorgt, dass bei der Benutzeranmeldung erstellte Firewall-Regeln beim löschen des Benutzerprofils (hier kommen die UPDs ins spiel, unter Einsatz dieser wird das Profil nämlich bei der Abmeldung automatisch wieder vom Server gelöscht) nicht mehr entfernt werden.

Das verursacht einen Registry-Bloat in 

HKLM:\System\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules

und/oder

HKLM:\System\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\RestrictedServices\Configurable\System

Sind diese Keys bereits „überfüllt“, kann es gut sein, dass sich die Werte nicht mehr per GUI (regedit) entfernen lassen – der Key lädt schlichtweg ewigkeiten. Abhilfe schafft folgendes PowerShell-Script:

$profiles = get-wmiobject -class win32_userprofile
Clear-Host
Write-Host "`n`n`n`n`n`n`n`n"
Write-Host "Getting Firewall Rules..."
$Rules1 = Get-NetFirewallRule -All | 
  Where-Object {$profiles.sid -notcontains $_.owner -and $_.owner }
$Rules1Count = $Rules1.count
Write-Host "" $Rules1Count "Rules`n"

Write-Host "Getting Firewall Rules from ConfigurableServiceStore..."
$Rules2 = Get-NetFirewallRule -All -PolicyStore ConfigurableServiceStore | 
  Where-Object { $profiles.sid -notcontains $_.owner -and $_.owner }
$Rules2Count = $Rules2.count
Write-Host "" $Rules2Count "Rules`n"

$Total = $Rules1.count + $Rules2.count
Write-Host "Deleting" $Total "Firewall Rules:" -ForegroundColor Green

$Result = Measure-Command {

  $start = (Get-Date)
  $i = 0.0

  foreach($rule1 in $Rules1){

    # action
    Remove-ItemProperty -Path "HKLM:\System\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules" -Name $rule1.name

    # progress
    $i = $i + 1.0
    $prct = $i / $total * 100.0
    $elapsed = (Get-Date) - $start
    $totaltime = ($elapsed.TotalSeconds) / ($prct / 100.0)
    $remain = $totaltime - $elapsed.TotalSeconds
    $eta = (Get-Date).AddSeconds($remain)

    # display
    $prctnice = [math]::round($prct,2) 
    $elapsednice = $([string]::Format("{0:d2}:{1:d2}:{2:d2}", $elapsed.hours, $elapsed.minutes, $elapsed.seconds))
    $speed = $i/$elapsed.totalminutes
    $speednice = [math]::round($speed,2) 
    Write-Progress -Activity "Deleting Rules ETA $eta elapsed $elapsednice loops/min $speednice" -Status "$prctnice" -PercentComplete $prct -SecondsRemaining $remain
  }

  foreach($rule2 in $Rules2) {

    # action  
    Remove-ItemProperty -Path "HKLM:\System\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\RestrictedServices\Configurable\System" -Name $rule2.name

    # progress
    $i = $i + 1.0
    $prct = $i / $total * 100.0
    $elapsed = (Get-Date) - $start
    $totaltime = ($elapsed.TotalSeconds) / ($prct / 100.0)
    $remain = $totaltime - $elapsed.TotalSeconds
    $eta = (Get-Date).AddSeconds($remain)

    # display
    $prctnice = [math]::round($prct,2) 
    $elapsednice = $([string]::Format("{0:d2}:{1:d2}:{2:d2}", $elapsed.hours, $elapsed.minutes, $elapsed.seconds))
    $speed = $i/$elapsed.totalminutes
    $speednice = [math]::round($speed,2) 
    Write-Progress -Activity "Deleting Rules from ConfugurableServiceStore ETA $eta elapsed $elapsednice loops/min $speednice" -Status "$prctnice" -PercentComplete $prct -secondsremaining $remain
  }
}

$end = Get-Date
Write-Host end $end 
Write-Host eta $eta

Write-Host $result.minutes min $result.seconds sec

Achtung: bei einem bereits länger laufenden Terminalserver, kann das Script schonmal so ein paar Stunden brauchen um alle Regeln zu entfernen. (In unserem Fall knapp 4 Stunden für etwa 95000 Regeln.)

Aus Performancegründen löscht das Script die Registry-Werte direkt, anstatt das Remove-NetFirewallRule Cmdlet zu verwenden.

Quelle: https://social.technet.microsoft.com/Forums/en-US/8dad5b1e-8236-4792-85fe-8725d74bbbcb/start-menu-not-coming-up-server-2016-rds?forum=winserverTS

WebDAV Fehler 0x800700DF: Die Dateigröße überschreitet die maximal zulässige Größe und kann nicht gespeichert werden.




Problem

Windows möchte auf einem via WebDAV eingebundenen Laufwerk (Sharepoint, NextCloud, NAS-System …) keine Dateien öffnen oder speichern, die 50Mbyte oder größer sind. Es gibt einen „0x800700DF“ Fehler. Das mit „net use l: https://…“ erstellte Laufwerk scheint überhaupt keine größeren Dateien anzunehmen oder rauszurücken.

Lösung

Es liegt – warscheinlich – nicht am Server.

Dieses Problem tritt aufgrund einer heute übertrieben wirkenden „Sicherheitsfunktion“ seit Windows XP SP2 (bis zum toaktuellen Windows 10). Ein bösartiger Server kann einen Windows Client so nicht „unendliche“ Datenmengen unterschieben. Und 50Mb waren damals ganz knapp vor „unendlich“.

Die Maximalgröße lässt sich in der Registry konfigurieren:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WebClient\Parameters 

Wert: FileSizeLimitInBytes auf FFFFFFFF

Windows neu starten (den Explorer abschießen reicht nicht), fertig.