Oktober 2 2024

Force Intune Sync on Windows User Logon

Wird ein Windows Client in Intune ausgerollt werden mehrere geplante Aufgaben für den Device Sync angelegt:

Damit wird gewährleistet, dass sich das Gerät regelmässig (später dann alle 8 Stunden) bei Intune selbstständig meldet.

Ich bevorzuge es jedoch, wenn sich Geräte direkt nach dem User Login beim MDM melden und einen Sync durchführen.
Dazu lege ich auf meinen Clients einen weiteren Task an, der ebenfalls die deviceenroller.exe aufruft.
Die Herausforderung hierbei ist jedoch, dass jedes Gerät eine eindeutige Enrollment-ID hat welche beim Aufruf als Parameter mit gegeben werden muss, das ist die GUID unterhalt des Schlüssels „EnterpriseMgmt“.

Hier ist mein Zweizeiler Powershell dafür:

$EnrollmentID = Get-ScheduledTask | Where-Object { $_.TaskPath -like "*Microsoft*Windows*EnterpriseMgmt\*" } | Select-Object -ExpandProperty TaskPath -Unique | Where-Object { $_ -like "*-*-*" } | Split-Path -Leaf
schtasks /create /tn "Intune Policy Sync" /sc ONLOGON /delay 0005:00 /rl highest /ru system /tr "C:\Windows\system32\deviceenroller.exe /o $EnrollmentID /c /b"
Zuerst wird die Enrollment-ID des Gerätes ausgelegt und dann eine geplante Aufgabe entsprechend angelegt. Diese wird 5 Minuten nach dem Userlogin am Gerät ausgeführt und macht einen Intune Device Sync im Hintergrund.
Für meine Umgebung funktioniert das so wunderbar, kurz nach dem Login wird ein Sync ausgeführt was man u.a. auch im Konten Bereich der Systemeinstellungen sehen kann:
September 3 2024

UNRAID Home Server mit ZFS

Das Thema „Home-Server“ beschäftigt mich schon seit vielen Jahren. Los ging es mit externen Festplatten über welche mit rudimentären NAS-Funktionen hin zu einem WD myCloud. Danach war ich über viele Jahre zufrieden mit mehreren 2-Bay QNAP NAS Server welche ich nun aber seit längerem mit einem Eigenbau UNRAID Server ersetzt habe.

Mit diesem Post werde ich mal mein Setup beschreiben und warum ich von QNAP auf UNRAID gewechselt habe.

Mein UNRAID Server besteht aus einem lüfterlosem Barebone mit einer Intel Core i7-4785T CPU und 16 GiB DDR3 Speicher. Damit habe ich genug Performance um mehre Docker Container sowie VMs parallel zu betreiben – dank der x86/x64 Architektur muss ich auch nicht hier auf Windows for ARM ausweichen. Auch wenn die CPU inzwischen schon recht alt ist, mit 35W Stromaufnahme im Maximum ist das gar nicht so schlecht. Kleiner Spoiler, mein gesamter unRAID Server lümmelt i.d.R. bei so 20-25W herum. Bei den Datenträger habe ich verbaut, was so rumlag: 1x 16GB USB-Stick, 1x 256GB mSATA SSD für das Array sowie eine 2TB SSD und eine 2TB NVMe für den Datenpool. Als Boot-Device nutze ich einen 64GB USB-Stick. Hier sieht man gleich einen der großen Voreile von UNRAID: Es frisst so ziemlich alles, was man  ihm vorsetzt. :-)

Die Array Funktion von UNRAID ignoriere ich und habe nur ein 16GB leeres Array angelegt weil eben eines vorhanden sein muss. Zur UNRAID Architektur schreibe ich vielleicht ein anderes mal mehr, findet sich aber alles auch im Web.
Beim Data Pool setze ich auf ZFS als Dateisystem und habe mir ein 2TiB Mirror angelegt worauf all meine Shares und Daten liegen. Für mein Home-Server reichen mir die ca. 1.8TiB aus, das ganze würde aber auch entsprechend mit größeren oder mehreren Datenträgern skalieren.

Backup mache ich natürlich auch, dazu stecke ich im Wechsel immer wieder eine 2TB USB SSD ran die ich per Script mounte, das Backup fahre und dann wieder auswerfe. Auch dazu ein anderes mal mehr…

 

Warum?

Bei QNAP kam ich mit meinem VMs an die Grenzen zumal ich gern eine x86/x64 CPU einsetzen sollte. Auch nervten mich die Grenzen im Umgang mit Docker-Container und dass man auf einem Hersteller Dateisystem festhängt. Beruflich arbeite ich viel mit ZFS weshalb ich mich da deutlich heimischer fühle und einen gewissen Basteltrieb hat man ja auch… :)

 

Mehr ein anderes mal…

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 der letzten Monate:

Patch MonthWindows 10Windows 11Server 2016Server 2019Server 2022
2024/081904%.4780226%1.403714393.725917763.618920348.2655
2024/071904%.4651226%1.395814393.715917763.605420348.2582
2024/061904%.4529226%1.388014393.707017763.593620348.2529

 

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.