blog.icewolf.ch

Let's talk about IT!
posts - 1548, comments - 295, trackbacks - 0

My Links

Archives

Post Categories

icewolf

Sunday, July 12, 2020

Exchange Online PowerShell V2 and Modern Auth with Application in AzureAD (Step-by-step)

Hallo zusammen,

Vor ein paar Tagen hat Microsoft auf dem Exchange Team Blog erklärt, wie man mit sich mit Modern Auth und dem Exchange Online PowerShell V2 Module authentifizieren kann. Dies benötigt jedoch die Preview vom Exchange Online PowerShell V2 Module.

Modern Auth and Unattended Scripts in Exchange Online PowerShell V2
https://techcommunity.microsoft.com/t5/exchange-team-blog/modern-auth-and-unattended-scripts-in-exchange-online-powershell/ba-p/1497387

App-only authentication for unattended scripts in the EXO V2 module
https://docs.microsoft.com/en-us/powershell/exchange/app-only-auth-powershell-v2?view=exchange-ps

A first look at Certificate-Based Authentication for Exchange Online Remote PowerShell
https://www.quadrotech-it.com/blog/certificate-based-authentication-for-exchange-online-remote-powershell/

Als erstes muss eine Applikation im Azure AD registriert werden.

Dort nur einen Namen vergeben, den Rest so belassen

Am besten merkt man sich dann gleich die Application ID

Nun müssen der Applikation noch Berechtigungen vergeben werden.

Hier einfach "Exchange" auswählen

Nun muss das Recht "Exchange.ManageAsApp" ausgewählt werden

Danach muss der Admin diese Rechte bestätigen (Admin Consent)

Hier einfach auf "Yes" klicken um den Admin Consent zu erteilen (Braucht Global Admin)

Und so sollte es dann aussehen.

Nun muss man ein SelfSignedCertificate erstellen

$cert=New-SelfSignedCertificate -Subject "CN=ExOPowershell" -CertStoreLocation "Cert:\CurrentUser\My"  -KeyExportPolicy Exportable -KeySpec Signature

Danach kann die Zertifikatskonsole gestartet werden

certmgr.msc

Das Zertifikat muss nun exportiert werden

Um eine weitere Art der Verbindung zu zeigen, mache ich auch einen Export mit privatem Schlüssel (*.pfx Datei)

Das Zertifikat muss nun in der Azure AD Applikation unter "Certificates & secrets" raufgeladen werden.

Das *.cer File auswählen und hochladen

Danach sieht es so aus.

Nun muss der Applikation noch eine Rolle zugeteilt werden - ich nehme hier die Exchange Administrator Rolle

Dort auf "Add assignments" klicken

Und die Application ID einfügen

Danach ist das Service Principal der Applikation in der Rolle Exchange Administrators hinzugefügt worden.

Variante 1:

Verbinden über den Certificate Thumbprint (das Zertifikat muss beim Benutzer unter MyCertificates installiert sein) und die ApplicationID

Connect-ExchangeOnline -CertificateThumbprint "cf1dcd32e78b6ccc9a89be93b31a98a30fe7f760" -AppID "f38d26a7-740e-425f-aef5-2da3f3d595db" -Organization "icewolfch.onmicrosoft.com"

Variante 2:

Mit dem *.pfx und dem Zertifikatspasswort sowie Application ID verbinden

$CertPassword = ConvertTo-SecureString "DemoPassword!" -AsPlainText -Force
Connect-ExchangeOnline -CertificateFilePath "E:\Scripting\ExOPowershell.pfx" -CertificatePassword $CertPassword -AppID "f38d26a7-740e-425f-aef5-2da3f3d595db" -Organization "icewolfch.onmicrosoft.com"

Grüsse
Andres Bohren

posted @ Sunday, July 12, 2020 10:37 AM | Filed Under [ Exchange Powershell O365 ]

Visual Studio Code and Azure DevOps Repo

Hallo zusammen,

Kürzlich habe ich einen Blog Artikel geschrieben, wie man mit Visual Studio Code ein Version Control Repository in GitHub verwaltet.

In diesem Artikel zeige ich euch Azure DevOps und wie man hier Code in einem Repository verwalten kann.

Für die ersten fünf Benutzer ist Azure DevOps kostenlos. Danach kostet der Basci Plan 5.91 pro Benutzer und Monat. Für meine Zwecke reicht der Basis Plan.

https://azure.microsoft.com/de-de/pricing/details/devops/azure-devops-services/

Nun muss man die Region auswählen

Der Organisation einen Namen vergeben - ich übernehme den Vorschlag

Die DevOps Organisation ist vorbereitet. Nun kann man ein Projekt erstellen. Ich erstelle ein privates Projekt um dort Code zu verwalten.

Es gibt aber noch mehr: Boards / Repos / Pipelines / Test Plans / Artifacts

Ich öffne das Repo mit dem Link

Melde mich mit meinem Azure AD Konto an

Und schon kann ich den Code hinzufügen und verwalten.

Nach dem Commit und dem Push Request ist der Code im Repo sichtbar.

Grüsse
Andres Bohren

posted @ Sunday, July 12, 2020 8:51 AM | Filed Under [ Powershell Azure ]

Thursday, July 09, 2020

How to install Exchange Online Powershell V2 Preview Module

Hallo zusammen,

Es gibt eine Preview vom ExchangeOnlineManagement Modul - musste ich natürlich ausprobieren.

https://www.powershellgallery.com/packages/ExchangeOnlineManagement/2.0.3-Preview

Um PowerShell Module zu installieren, muss die PowerShell als Administrator gestartet werden. Damit keine Module über die PowerShell Profile geladen werden, starte ich eine cmd als Administrator. Dort führe ich dann folgenden Befehl aus:

start PowerShell -noprofile

Als ich den Befehl für die Installation eingegeben habe, war der Parameter "-AllowPrerelease" unbekannt

Install-Module -Name ExchangeOnlineManagement -AllowPrerelease

Tja das heisst wohl, dass PowershellGet zu alt ist.

Get-Module PowershellGet --ListAvailable
Find-Module PowershellGet
Install-Module PowershellGet
Install-Module PowershellGet -Force

Nun kann die neue Version vom ExchangeOnlineManagement PowerShell Modul installiert werden.

Falls nicht schon passiert, zuerst die alte Version deinstallieren

Uninstall-Module -Name ExchangeOnlineManagement
Install-Module -Name ExchangeOnlineManagement -AllowPrerelease

Nun schaue ich, ob das Modul auch funktioniert

Import-Module ExchangeOnlineManagement
Connect-ExchangeOnline
Get-Mailbox -Identity <Mailbox>

Soweit so gut, aber wie deinstalliere ich jetzt die alte Version von PowerShellGet?

Get-Module PowershellGet -ListAvailable

Ich habe dann einfach den Ordner gelöscht C:\Program Files\WindowsPowerShell\Modules\PowershellGet

Nun sieht es gut aus

Get-Module PowershellGet -ListAvailable

Habe im M365 Message Center gesehen, dass am PowerShell 7 Support für das Modul gearbeitet wird.

Also mal testen - scheint aber noch nicht zu funktionieren.

Import-Module ExchangeOnlineManagement
Connect-ExchangeOnline

Grüsse
Andres Bohren

posted @ Thursday, July 09, 2020 10:35 PM | Filed Under [ Exchange Powershell ]

PowerShell 7.0.2

Hallo zusammen,

Das Update der PowerShell 7 mit der Version 7.0.2 gibt es schon ein paar Wochen. Höchste Zeit das mal zu installieren.

v7.0.2 Release of Powershell

https://github.com/PowerShell/PowerShell/releases/tag/v7.0.2

Grüsse
Andres Bohren

posted @ Thursday, July 09, 2020 10:15 PM | Filed Under [ Powershell ]

M365 New Portal homepage layout and navigation

Hallo zusammen,

Schon vor einiger Zeit wurde informiert, dass es eine neues Layout und Navigation auf der M365 Startseite https://office.com geben wird.

So hat es bisher ausgesehen

Gestern habe ich das neue Layout auf der Seite zum ersten mal gesehen.

Klickt man oben auf das Viereck mit den Punkten öffnet sich das Menü.

Klickt man auf "Alle Apps" gehen die Apps seitlich auf.

Grüsse
Andres Bohren

posted @ Thursday, July 09, 2020 10:06 PM | Filed Under [ O365 ]

Saturday, July 04, 2020

Visual Studio Code and Version Control - Part 3

Hallo zusammen,

Im letzten Artikel haben wir uns mit den Grundlagen von GIT vertraut gemacht.

Visual Studio Code and Version Control - Part 2

http://blog.icewolf.ch/archive/2020/07/04/visual-studio-code-and-version-control-part-2.aspx

Nun folgt die praktische Anwendung im VS Code

Ein paar Tips hierzu gibt's auch hier:

Using Version Control in VS Code

https://code.visualstudio.com/docs/editor/versioncontrol

Mit Ctrl + Shift + P kommt man in die Command Palette. Dort gibt man folgendes ein:

Git: Clone

Ich habe mir schon vor einiger Zeit ein GitHub Konto angelegt und dort ein Repository angelegt.

https://github.com/BohrenAn/ExOIPChecker

Auf dem Knopf "Clone or Download" kann man die URL vom Repository kopieren.

Diese URL gibt man nun im VS Code ein.

Anschliessend muss man noch ein Working Directory konfigurieren. Ich habe mir dazu einen Ordner "GIT_WorkingDir" angelegt.

Unten rechts schlägt VS Code vor, das geclonte Repository gleich aufzumachen.

Mit Ctrl + Shift + G kommt man ins Source Control Menü. Mit dem Gutzeichen kann man die Änderungen vom Stage in den Head zu übernehmen. Damit macht man ein "Commit".

Dazu muss man einen Kommentar hinzufügen.

Klickt man unten auf das Symbol mit den zwei kreisförmigen Pfeilen wird ein Pull Request durchgeführt und der Code wieder ins entfernte Repositroy hinaufgeladen.

Dazu muss ich mich natürlich noch mit meinem GitHub Login anmelden

Anschliessend ist das Script auf Github mit dem Commit Kommentar sichtbar.

So, nun könnt ihr euer eigenes Repository erstellen und damit Code mit Visual Studio Code verwalten.

Liebe Grüsse
Andres Bohren

posted @ Saturday, July 04, 2020 10:38 AM | Filed Under [ Powershell ]

Visual Studio Code and Version Control - Part 2

Hallo zusammen,

Im vorangegangenen Artikel habe ich euch gezeigt, wie man VS Code und GIT installiert. 

Visual Studio Code and Version Control - Part 1

http://blog.icewolf.ch/archive/2020/07/04/visual-studio-code-and-version-control-part-1.aspx

Nun muss man sich erstmal mit den Grundlagen von GIT auseinander setzen. Ich habe den untenstehenden Link gefunden und finde, er zeigt recht gut die Grundlagen der Versionsverwaltung mit GIT auf. Natürlich ist das stark vereinfacht, aber ich denke, das wichtigste steht da.

git - Der einfache Einstieg

https://rogerdudler.github.io/git-guide/index.de.html

Ich habe mir erlaubt, die wichtigsten Dinge zusammenzufassen. Also eine Art Zusammenfassung der Zusammenfassung :)

 

#neues repository erstellen

git init

 

#ein repository auschecken

git clone /pfad/zum/repository

#Falls du ein entferntes Repository verwendest, benutze:

git clone benutzername@host:/pfad/zum/repository

 

#Du kannst Änderungen vorschlagen (zum Index hinzufügen) mit

git add <dateiname>

git add *

 

#Jetzt befindet sich die Änderung im HEAD, aber noch nicht im entfernten Repository.

git commit -m "Commit-Nachricht"

 

#Push

git push origin master

#Erstelle einen neuen Branch mit dem Namen "feature_x" und wechsle zu diesem:

git checkout -b feature_x

 

#Um zum Master zurück zu wechseln:

git checkout master

 

#und um den eben erstellten Branch wieder zu löschen:

git branch -d feature_x

 

#Ein Branch ist nicht für andere verfügbar, bis du diesen in dein entferntes Repository hochlädst:

git push origin <branch>

 

#Um dein lokales Repository mit den neuesten Änderungen zu aktualisieren, verwende:

git pull

 

#Wenn du einen anderen Branch mit deinem aktuellen (z.B. master) zusammenführen willst, benutze:

git merge <branch>

 

#Du bist verantwortlich, diese Konflikte durch manuelles Editieren der betroffenen Dateien zu lösen.

#Bist du damit fertig, musst du das git mit folgendem Befehl mitteilen:

git add <dateiname>

 

#Bevor du Änderungen zusammenführst, kannst du dir die Differenzen auch anschauen:

git diff <quell_branch> <ziel_branch>

 

#Du erhältst die Liste der Commit-IDs mit:

git log

 

#Du kannst einen neuen Tag namens 1.0.0 mit folgendem Befehl erstellen:

#1b2e1d63ff steht für die ersten 10 Zeichen der Commit-Id

git tag 1.0.0 1b2e1d63ff

 

#die lokalen Änderungen auf den letzten Stand im HEAD zurücksetzen.

git checkout -- <filename>

 

#Wenn du aber deine lokalen Änderungen komplett entfernen möchtest,

#holst du dir den letzten Stand vom entfernten Repository mit folgenden Befehlen:

git fetch origin

git reset --hard origin/master

In diesem Teil des Artikels habt ihr die Grundlagen von GIT erlernt. Im Part 3 dieser Serie geht es um die praktische Anwendung.

Grüsse
Andres Bohren

posted @ Saturday, July 04, 2020 10:06 AM | Filed Under [ Powershell ]

Visual Studio Code and Version Control - Part 1

Hallo zusammen,

Die Rolle des Systemadministrators verändert sich schon seit ein paar Jahren. Obwohl Engineering immer noch ein grosser Teil des Alltags ist, wird die Automatisierung immer wichtiger. Ein Systemadministrator, welcher sich nur im GUI zurechtfindet, hat es immer schwieriger. Wer kein PowerShell oder ein paar andere Programmiersprachen wie C#, Javascript, Java, Phyton (die Liste lässt sich beliebig erweitern) kann, hat es immer schwerer.

Seit einigen Jahren wird in der IT Industrie das DevOps Modell vorangetrieben. Dabei werden Teams aus Entwicklern (Developer) und Systemadministratoren (Operator) zusammengestellt, welche dann gemeinsam für ein Produkt verantwortlich sind.

In meiner Laufbahn habe ich mich mit verschiedenen Programmiersprachen auseinandergesetzt und teilweise selbst gelernt. Dazu gehören: QBasic, Turbo Pascal, Visual Basic, ASP, ASP .NET, VBS, Perl, PowerShell.

Als Exchange Administrator kam im 2007 ebenfalls die PowerShell dazu. Ein wirklich mächtiges Werkzeug, wenn es um Automatisierung geht. Einige Einstellungen konnten nur per PowerShell gemacht werden und so wurde das ganz natürlich zu einem täglichen Instrument. In den letzten 13 Jahren habe ich viele Scripts zur Automatisierung und Verbesserung des Services und Lösungen für ganz verschiedene Problemstellungen entwickelt.

Auch die eingesetzten Technologien verändern sich ständig. Früher musste man sich mit XML und Webservices auskennen, heute ist eher JSON und REST gefragt.

All dieser Code muss nun irgendwie verwaltet und abgelegt werden. Am besten in einem Version Control System. Populäre Beispiele hierzu sind Git, Subversion (SVN) oder auch der Microsoft Team Foundation Server.

In diesem Blog Artikel zeige ich euch, wie man Visual Studio Code und GIT installiert.

Installation Visual Studio Code

Visual Studio Code

https://code.visualstudio.com/

Wechselt man links im Menü auf das Source Control Menü, so fordert Visual Studio Code auf, sich Git zu installieren.

Installation GIT

Mit dem Link landet man auf der Seite von GIT und kann sich dort Git für Windows herunterladen

Downloading Git

https://git-scm.com/download/win

Ich setzte VS Code als den default Editor für GIT

Die Grundinstallation ist nun Vorgenommen. Weiter geht es mit dem nächsten Artikel. 

Grüsse
Andres Bohren

posted @ Saturday, July 04, 2020 9:46 AM | Filed Under [ Powershell ]

Friday, July 03, 2020

Check Exchange Online Protection IP's with PowerShell (ExOIPChecker)

Hallo zusammen,

Die Dokumentation der Office 365 URL's und IP's existiert schon sehr lange. Anfänglich konnte man sich ein XML herunterladen. Seit knapp zwei Jahren gibt es einen Webservice, welches ein JSON zurückliefert.

Office 365 URLs and IP address ranges

https://docs.microsoft.com/en-us/office365/enterprise/urls-and-ip-address-ranges

 

Office 365 IP Address and URL web service

https://docs.microsoft.com/en-us/office365/enterprise/office-365-ip-web-service

 

Falls auf einer Firewall die IP's für Exchange Online Protection eingeschränkt werden, so sollte man zumindest mitbekommen, wenn sich die IP's ändern, damit man die Firewall Regeln angepasst werden können. Dafür habe ich ein entsprechende Script entwickelt.

 

Es gibt sogar Scripte für Checkpoint Firewalls, welche das automatisch anpassen https://github.com/leinadred/IPaddressFeed2CheckPointAPI

 

So sieht das JSON aus und ist einfach zu lesen.

Für die Abfage muss man eine GUID angeben. Man kann mit folgendem Code eine GUID erzeugen

$GUID = ([guid]::NewGuid()).guid
$ClientRequestId = $GUID

Die Endpoints kann man sich mit folgendem Query abfragen. Mit dem NoIPv6=True Parameter erhält man nur IPv4 Adressen

#Get Exchange Endpoints
$uri =
https://endpoints.office.com/endpoints/worldwideServiceAreas=Exchange&NoIPv6=true&ClientRequestId=$ClientRequestId
Write-Host "DEBUG: URL: $uri"
$Result = Invoke-RestMethod -Method GET -uri $uri

Mit dem folgenden Filter grenze ich die Resultate auf eine bestimmte URL ein.

#EOP IP's
$addresses = ($Result | where {$_.urls -match "mail.protection.outlook.com"}).ips | Sort-Object -Unique

Beim Centralized Mail Transport, werden die ausgehenden Mails über die On-Prem Exchange Organisation ausgeliefert. Manchmal wird dazu auch ein Exchange Edge Server eingesetzt.

Mit dem von mir entwickelten Script kann man sich nicht nur über die Changes informieren lassen, sondern gleich den Exchange Receive Connector mit den Remote IP Ranges aktualisieren.

 

Für den Einsatz in einer Anderen Umgebung, müssen einfach die Variablen im Script angepasst werden.

So sieht das Script bei der Ausführung aus.

Danach ist der Receive Connector mit den Remote IP's aktualisiert. Achtung die IP Adresse 127.0.0.1 darf nicht entfernt werden, sonst funktioniert die Managed Availability von Exchange nicht mehr. Das ist aber im Script bereits berücksichtigt.

Ausserdem kann man sich über das Array $CustomRemoteIPRanges weitere Ranges hinzufügen, welche beim Update ebenfalls hinzugefügt werden.

Will man den Exchange Receive Connector nicht updaten, so stellt man einfach die Variable $UpdateExchangeConnector auf $false

So sieht das info Mail aus, wenn es keine Änderungen gibt.

Das Script habe ich auf GitHub publiziert

https://github.com/BohrenAn/ExOIPChecker

Grüsse
Andres Bohren

posted @ Friday, July 03, 2020 11:13 PM | Filed Under [ O365 ]

Check for pending reboot with PowerShell

Hallo zusammen,

Nachdem ich mich beim Exchange Update wieder mal durch den Wizard geklickt hatte und dann darauf hingewiesen wurde, dass noch ein Pending Reboot offen ist. Habe ich gedacht, das könnte man auch rasch vorher checken. Die folgende Tabelle habe ich im Internet gefunden. Daraus habe ich dann rasch ein PowerShell Script gebastelt.

How to Check for a Pending Reboot in the Registry (Windows)

https://adamtheautomator.com/pending-reboot-registry-windows/

KEY VALUE CONDITION
HKLM:\SOFTWARE\Microsoft\Updates UpdateExeVolatile Value is anything other than 0
HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager PendingFileRenameOperations value exists
HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager PendingFileRenameOperations2 value exists
HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired NA key exists
HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Services\Pending NA Any GUID subkeys exist
HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\PostRebootReporting NA key exists
HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce DVDRebootSignal value exists
HKLM:\Software\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending NA key exists
HKLM:\Software\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootInProgress NA key exists
HKLM:\Software\Microsoft\Windows\CurrentVersion\Component Based Servicing\PackagesPending NA key exists
HKLM:\SOFTWARE\Microsoft\ServerManager\CurrentRebootAttempts NA key exists
HKLM:\SYSTEM\CurrentControlSet\Services\Netlogon JoinDomain value exists
HKLM:\SYSTEM\CurrentControlSet\Services\Netlogon AvoidSpnSet value exists
HKLM:\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName ComputerName Value ComputerName in HKLM:\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName is different

Daraus habe ich dann folgende PowerShell Script gemacht:

###############################################################################
# Check-PendingReboot.ps1
# Andres Bohren / www.icewolf.ch / blog.icewolf.ch / a.bohren@icewolf.ch
# Version 1.0 / 03.06.202020 - Initial Version
###############################################################################
<#
.SYNOPSIS
    This Script checks diffrent Registry Keys and Values do determine if a Reboot is pending.
 
.DESCRIPTION
 I found this Table on the Internet and decided to Write a Powershell Script to check if a Reboot is pending.
 Not all Keys are checked. But feel free to extend the Script.
 
 https://adamtheautomator.com/pending-reboot-registry-windows/
 KEY VALUE CONDITION
 HKLM:\SOFTWARE\Microsoft\Updates UpdateExeVolatile Value is anything other than 0
 HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager PendingFileRenameOperations value exists
 HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager PendingFileRenameOperations2 value exists
 HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired NA key exists
 HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Services\Pending NA Any GUID subkeys exist
 HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\PostRebootReporting NA key exists
 HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce DVDRebootSignal value exists
 HKLM:\Software\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending NA key exists
 HKLM:\Software\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootInProgress NA key exists
 HKLM:\Software\Microsoft\Windows\CurrentVersion\Component Based Servicing\PackagesPending NA key exists
 HKLM:\SOFTWARE\Microsoft\ServerManager\CurrentRebootAttempts NA key exists
 HKLM:\SYSTEM\CurrentControlSet\Services\Netlogon JoinDomain value exists
 HKLM:\SYSTEM\CurrentControlSet\Services\Netlogon AvoidSpnSet value exists
 HKLM:\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName ComputerName Value ComputerName in HKLM:\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName is different
 
.EXAMPLE
 ./Check-PendingReboot.ps1

#>

function Test-RegistryValue {
 param (
  [parameter(Mandatory=$true)][ValidateNotNullOrEmpty()]$Path,
  [parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()]$Value
 )
 try {
  Get-ItemProperty -Path $Path | Select-Object -ExpandProperty $Value -ErrorAction Stop | Out-Null
  return $true
 }
 catch {
  return $false
 }
}

[bool]$PendingReboot = $false

#Check for Keys
If ((Test-Path -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired") -eq $true)
{
 $PendingReboot = $true
}

If ((Test-Path -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\PostRebootReporting") -eq $true)
{
 $PendingReboot = $true
}

If ((Test-Path -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired") -eq $true)
{
 $PendingReboot = $true
}

If ((Test-Path -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending") -eq $true)
{
 $PendingReboot = $true
}

If ((Test-Path -Path "HKLM:\SOFTWARE\Microsoft\ServerManager\CurrentRebootAttempts") -eq $true)
{
 $PendingReboot = $true
}

#Check for Values
If ((Test-RegistryValue -Path "HKLM:\Software\Microsoft\Windows\CurrentVersion\Component Based Servicing" -Value "RebootInProgress") -eq $true)
{
 $PendingReboot = $true
}

If ((Test-RegistryValue -Path "HKLM:\Software\Microsoft\Windows\CurrentVersion\Component Based Servicing" -Value "PackagesPending") -eq $true)
{
 $PendingReboot = $true
}

If ((Test-RegistryValue -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager" -Value "PendingFileRenameOperations") -eq $true)
{
 $PendingReboot = $true
}

If ((Test-RegistryValue -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager" -Value "PendingFileRenameOperations2") -eq $true)
{
 $PendingReboot = $true
}

If ((Test-RegistryValue -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" -Value "DVDRebootSignal") -eq $true)
{
 $PendingReboot = $true
}

If ((Test-RegistryValue -Path "HKLM:\SYSTEM\CurrentControlSet\Services\Netlogon" -Value "JoinDomain") -eq $true)
{
 $PendingReboot = $true
}

If ((Test-RegistryValue -Path "HKLM:\SYSTEM\CurrentControlSet\Services\Netlogon" -Value "AvoidSpnSet") -eq $true)
{
 $PendingReboot = $true
}

Write-Host "Reboot pending: $PendingReboot"

Und so sieht das Ergebnis dann aus.

Grüsse
Andres Bohren

posted @ Friday, July 03, 2020 8:54 PM | Filed Under [ Powershell ]

Powered by:
Powered By Subtext Powered By ASP.NET