Januar 26 2024

.NET 4.8 Probleme auf Windows Server 2019

Quick Note – Wenn .NET 4.8 auf einem Server 2019 nach einem Update Probleme macht, prüft mal die RegKeys ob (noch) alle vorhanden sind. Der Installer löscht hier gerne etwas zuviel raus.

So sollte es aussehen:


Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319]
"AspNetEnforceViewStateMac"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319\SKUs]
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.0]
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.0,Profile=Client]
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.0.1]
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.0.1,Profile=Client]
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.0.2]
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.0.2,Profile=Client]
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.0.3]
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.0.3,Profile=Client]
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.5]
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.5.1]
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.5.2]
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.5.3]
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.6]
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.6.1]
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.6.2]
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.7]
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.7.1]
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.7.2]
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.8]
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319\SKUs\Client]
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319\SKUs\Default]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"AspNetEnforceViewStateMac"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.0]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.0,Profile=Client]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.0.1]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.0.1,Profile=Client]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.0.2]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.0.2,Profile=Client]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.0.3]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.0.3,Profile=Client]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.5]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.5.1]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.5.2]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.5.3]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.6]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.6.1]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.6.2]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.7]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.7.1]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.7.2]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.8]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\Client]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\Default]

Dezember 15 2023

Windows OS Patch Build Level (System.BuildExt)

Um die Betriebssysteme nach dem aktuellen Patch Level im ConfigMgr zusammen zu suchen verwende ich ein Collection Query:

select SMS_R_SYSTEM.ResourceID,SMS_R_SYSTEM.ResourceType,SMS_R_SYSTEM.Name,SMS_R_SYSTEM.SMSUniqueIdentifier,SMS_R_SYSTEM.ResourceDomainORWorkgroup,SMS_R_SYSTEM.Client from SMS_R_System where SMS_R_System.BuildExt like „10.0.1904%.3803“ or SMS_R_System.BuildExt like „10.0.226%1.2861“

Damit finde ich alle Windows 10 21H2 (19044), 22H2 (19045) sowie Windows 11 22H2 (22621) und 23H2 (23631) Clients mit dem jeweilig aktuellen Build Stand siehe Liste:

Patch MonthWin 10 1904%.Win 11 226%1.WinSrv 2016 14393.WinSrv 2019 17763.WinSrv 2021 20348.
2023/1035702428635149742031
2023/1136932715645251222113
2023/1238032861652952062159
2024/0139303007661453292227

 

Juli 27 2022

IE11 Abschaltung – Visio Viewer funktioniert nicht mehr

Nach dem Deaktivieren des IE11 per Gruppenrichtlinie („Disable Internet Explorer 11 as a standalone browser“) funktioniert der Visio Viewer nicht mehr. Beim Doppelklick auf eine Visio Datei öffnet sich zwar MS-Edge jedoch nur mit einem leeren Fenster.

Das ist soweit auch zu erwarten, da der alte Visio Viewer noch als ActiveX Applet daher kommt und das kann der Edge nicht mehr. Die Lösung ist auch hier, mal wieder, der IE-Enterprise Mode.

Dazu muss per GPO / Reg erstmal die Shell Command von der iexplorer.exe auf die msedge.exe abgeändert werden und zustätzlich eine File Extentsion Allow List eingetragen werden. Hier sind die benötigten HKLM Rey Keys:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\VisioViewer.Viewer\shell\open\command]
@="\"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe\" -ie-mode-file-url -- \"%1\""


[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Edge]
"InternetExplorerIntegrationLevel"=dword:00000001 "InternetExplorerIntegrationLocalFileAllowed"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Edge\InternetExplorerIntegrationLocalFileExtensionAllowList]
"1"=".vdw"
"2"=".vdx"
"3"=".vss"
"4"=".vssx"
"5"=".vsd"
"6"=".vsdm"
"7"=".vsdx"
"8"=".vst"
"9"=".vstm"
"10"=".vstx"
"11"=".vsx"
"12"=".vtx"
Februar 25 2022

Microsoft Certificate Authortity

Wartung der Microsoft CA Datenbank 

  1. Backup der EDB Datenbank
    CertUtil -BackupDB
  2. „Certificates Services“ Dienst beenden
  3. Datenbank defragmentieren
    EseUtil /d
  4. „Certificates Services“ Dienst starten
  5. Backup der EDB Datenbank erstellen wenn Funktion getestet

Der Speicherort ist im Standard unter %windir%\System32\CertLog

 

Bereinigen von Einträgen (Failed, Revoked, …)

Einzelnen Eintrag löschen:
CertUtil -deleterow $ROWID

Alle Pending Requests vor dem 01.01.2022 löschen:
CertUtil -deleterew 01/01/2022 Request

Hinweis: Es sollten nicht mehr als 2000-3000 Objekte auf einmal gelöscht werden. Backup wegen dem Datenbank Log nicht vergessen.

Record Types:
Request = Failed and Pending requests
Cert = Expired and revoked certificates
Ext = Extension table
Attrib = Attribute table
CRL = CRL table

September 25 2017

Windows 10 + CorelDraw X3 = Startmenü defekt

Quick & Dirty

Fehler: CorelDraw X3 installiert (setup.exe lässt sich unter Win10 nicht mehr ausführen, Workaround ist die setup.msi + de.msi zu installieren), danach funktioniert weder das Startmenü noch Modern/Store Apps.

Lösung: regedit ausführen, Berechtigungen für HKEY_CLASSES_ROOT überprüfen. Scheinbar wirft hier das Corel MSI die „ALL APPLICATION PACKAGES“ raus. Sobald diese wieder eingetragen sind, funktioniert wieder alles…

September 13 2017

NTFS Berechtigungen anhand Ordnername setzen

Neuer Fileserver, neue Homedrives… Diese liegen alle in einem Verzeichnis und haben als Ordnername den Username. Auf dem Ordner muss der User berechtigt werden (NTFS ACL). Dies kann mit folgendem Powershell Script schnell und einfach erledigt werden:

Download des Script

 


#############################################################################
# Script: changePermissions.ps1
# Author: Internet & Luis Goncalves & Rui Duarte & Manuel Kuss
# Date: 13/09/2017
# Keywords:
# Comments: Fixed Version for Powershell v3
# Pre-Requisites: Full Control over destination folder.
#
# DISCLAIMER
# ==========
# THIS CODE IS MADE AVAILABLE AS IS, WITHOUT WARRANTY OF ANY KIND. THE ENTIRE
# RISK OF THE USE OR THE RESULTS FROM THE USE OF THIS CODE REMAINS WITH THE USER.
#############################################################################
#
# Where is the root of the home drives?
$homeDrivesDir="F:\DATA"
# Report only? ($false = fix problems)
$reportMode = $false
# Print all valid directories?
$verbose = $true
# What domain are your users in?
$domainName = "DOMAINNAME.LOCAL"
#
# ACL Options:
# Grant the user full control (FullControl, Modify, ...)
$accessLevel = "Modify"
# Should permissions be inherited from above? (ContainerInherit, ObjectInherit or None)
$inheritanceFlags = "ContainerInherit, ObjectInherit"
# Should permissions propagate to below?
$propagationFlags = "None"
# Is this an Allow/Deny entry?
$accessControlType = "Allow"
#############################################################################
# Save the current working directory before we change it (purely for convenience)
pushd .
# Change to the location of the home drives
set-location $homeDrivesDir
# Warn the user if we will be fixing or just reporting on problems
write-host ""
if ($reportMode) {
Write-Host "Report mode is on. Not fixing problems"
} else {
Write-Host "Report mode is off. Will fix problems"
}
write-host ""
# Initialise a few counter variables. Only useful for multiple executions from the same session
$goodPermissions = $unfixablePermissions = $fixedPermissions = $badPermissions = 0
$failedFolders = @()
# For every folder in the $homeDrivesDir folder
foreach($homeFolder in (Get-ChildItem $homeDrivesDir | Where {$_.psIsContainer -eq $true})) {
# dump the current ACL in a variable
$acl= (Get-Item $homeFolder).GetAccessControl("Access")
# create a permission mask in the form of DOMAIN\Username where Username=foldername
# (adjust as necessary if your home folders are not exactly your usernames)
$compareString = "*" + $domainName + "\" + $homeFolder.Name + " Allow FullControl*"
# if the permission mask is in the ACL
if ($Acl.AccessToString -like $compareString) {
# everything's good, increment the counter and move on.
if ($verbose) {Write-Host "Permissions are valid for" $homeFolder.Name -backgroundcolor green -foregroundcolor white}
$goodPermissions += 1
} else {
# Permissions are invalid, either fix or report
# increment the number of permissions needing repair
$badPermissions += 1
# if we're in report mode
if ($reportMode -eq $true) {
# reportmode is on, don't do anything
Write-Host "Permissions not valid for" $homeFolder.Name -backgroundcolor red -foregroundcolor white
} else {
# reportmode is off, fix the permissions
Write-Host "Setting permissions for" $homeFolder.Name -foregroundcolor white -backgroundcolor red
# Add the user in format DOMAIN\Username
$username = $domainName + "\" + $homeFolder.Name
try {
# Create the Access Rule
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($username,$accessLevel,$inheritanceFlags,$propagationFlags,$accessControlType)
# Attempt to apply the access rule to the ACL
$Acl.SetAccessRule($accessRule)
Set-Acl -Path $homeFolder -AclObject $Acl
# if it hasn't errored out by now, increment the counter
$fixedPermissions += 1
} catch {
# It failed!
# Increment the fail count
$unfixablePermissions += 1
# and add the folder to the list of failed folders
$failedFolders += $homeFolder
}
} #/if
} #/if
} #/foreach
# Print out a summary
Write-Host ""
Write-Host $goodPermissions "valid permissions"
Write-Host $badPermissions "permissions needing repair"
if ($reportMode -eq $false) {Write-Host $fixedPermissions "permissions fixed"}
if ($unfixablePermissions -gt 0) {
Write-Host $unfixablePermissions "ACLs could not be repaired."
foreach ($folder in $failedFolders) {Write-Host " -" $folder}
}
# Cleanup
popd

 

Die Powershell v2 Version ist ursprünglich von hier.

September 6 2017

Quick and Dirty Referenz PC für OSD

Aktuell baue ich an einem neuen Referenz Image für Windows 10 mit Office 2016 in mehreren Sprachen. Hier gibt es viele Wege die ans Ziel führen können, den automatischen Build and Capture Prozess vom ConfigMgr, eine MDT Task Sequenz oder das ganze manuell durchzuführen. Aus unterschiedlichen Gründen baue ich eine Referenz PCs derzeit noch von Hand, dazu eine kleine Quick and Dirty Vorgehensweise:

  1. Eine neue VM mit möglichst wenig Hardware erstellen (SATA, kein Sound, keine Drucker, …)
  2. Windows 10 aus dem aktuellesten Image in Englisch installieren, einen Dummy User anlegen
  3. Windows 10 aktivieren
  4. Alle benötigten Sprachpakete aktivieren und herunterladen
  5. .NET 3.5 Feature und Middleware installieren (VC++ Runtimes)
  6. Office 2016 inkl. Sprachpaketen installieren (dazu verwende ich die Source der SCCM Application)
  7. Windows Update inkl. Office
  8. Den Builtin Administrator Account aktivieren, sich mit diesem anmelden
  9. Den Dummy User inkl. Profil löschen, Cleanup durchführen
  10. Einen VM Snapshot erstellen und das Referenz Image abziehen

Braucht man nun ein Update dann kann man quasi mit den Windows Updates beginnen, das Cleanup durchführen und das Capture durchführen.

 

Client Cleanup Schritte:

  1. Festplatten Bereinigungstool laufen lassen (cleanmgr.exe)
  2. hyberfil.sys entfernen (powercfg -H off)
  3. Windows Updates löschen (net stop wuauserv ; del %windir%\SoftwareDistribution /q /s ; net start wuauserv)
  4. dism.exe /online /Cleanup-Image /RestoreHealth
  5. dism.exe /online /Cleanup-Image /StartComponentCleanup /ResertBase

 

Das so erzeugte Image hat mit Win10/Off2016 und 6 Sprachen derzeit 9,8GB.

August 29 2017

In-Console Update SCCM 1702 -> 1707 breaks OSD

Nach dem In-Console Update des ConfigMgr 1702 auf 1706 funktionierten bei mir die PXE Task Sequenzen nicht mehr. Fehlermeldung:

Failed to Run Task Sequence

There are no task sequences available for this computer

 

Nach längerer Suche fand ich einen SCCM Bug, welcher eigentlich schon in 1702 behoben sein sollte, siehe KB4019926

 

Die Ursache ist so banal wie auch fatal: Die GUID des Objektes „x64 Unknown Computer (x64 Unknown Computer)“ wurde von einem anderen Client verwendet. Das kann, laut KB, wohl vorkommen wenn man mal den „Zurück“ Button während einer Task Sequence verwendet hat. Interessanterweise trat der Fehler bei mir Wochenlang nicht unter 1702 sondern erst nach dem Upgrade auf 1706 auf….

 

Lösung:

In der SQL erstmal die GUID der zwei Unknown Computer Objekte suchen:

select ItemKey, Name0,SMS_Unique_Identifier0 from UnknownSystem_DISC

Bei mir war das Objekt schon zum löschen markiert (Decommissioned=1) aber eben noch in der Datenbank vorhanden. Anstatt auf den Purge Prozess zu waren entschloss ich mich die zwei Unknown Objekte neu anzulegen:

 

Dazu brauchen wir die ItemKeys der zwei Objekte

select * from UnknownSystems

danach können beide aus der Datenbank gelöscht werden:

delete from UnknownSystem_DISC where ItemKey in (%ITEMKEY%)

 

Anschliessend muss man in der Registry auf dem Primary Site Server folgenden Key ändern:

HKLM\Software\Microsoft\SMS\Components\SMS_Discovery_Data_Manager
CreatedUnknownDDR: Von 0 auf 1 ändern

danach den SMS Executive Dienst durchstarten.

 

In Folge werden dann die zwei Objekte mit neuer GUID angelegt. Nachdem ich dann meine Task Sequenzen neu deployed hatte funktionierte alles wieder wie gehabt.

 

 

Vielen Dank an syswow64

August 23 2017

Windows 10 Suche findet keine Apps mehr

Seit dem Windows 10 Creators Update (1703) finden meine Windows 10 Rechner keine Anwendungen mehr über das Startmenü. Tippe ich beispielsweise „KeePass“ in die Windows Suche wird zwar eine Datei gefunden, jedoch nicht die Anwendung. Im Startmenü selbst ist KeePass vorhanden.

Nach längerer Suche und ändern der Cortana/Suche Einstellungen konnte ich die Ursache schlussendlich finden -> Die Ausführung von Hintergrund-Apps muss erlaubt werden:

Diese Einstellung ist noch auf 1610 Zeiten so in meiner Win10-GPO drin weshalb ich hier vorerst auch keinen Verdacht hatte. Zu finden ist diese Computereinstellung unter den Administrativen Templates -> Windows Components -> App Privacy

Nach einem Reboot funktioniert dann auch die Suche wie gehabt, selbst wenn man in den Einstellungen alle Apps auf „aus“ stellt solang der oberste Schalter aktiv bleibt.

Toll gemacht, Microsoft! #slowclap #facepalm