September 13

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

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

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

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

August 7

Domain Controller offline entfernen

Die richtige Vorgehensweise um einen Domain Controller zu entfernen, ist diesen mit DCPROMO zu depromieren. Allerdings gibt es immer wieder Situationen, in welchen dies nicht möglich ist und man den DC von Hand offline entfernen muss. Dazu sind mehrere manuelle Schritte nötig:

 

Active Dirctory Users and Computers > Domain Controllers

Den betroffenen Domain Controller auswählen und löschen, im folgenden Dialog muss dann noch die Warnung quittiert werden.

Wenn der DC ein Global Catalog war kommt noch ein zusätzlicher Hinweis, welcher bestätigt werden muss.

Sollte die Meldung „Access is denied“ erscheinen ist vermutlich die Option „Protect object from accidental deletation“ an dem Objekt gesetzt. Diese ist mindestens an drei Stellen zu kontrollieren und ggf. zu entfernen:

  • Active Directory Users and Computers > Server Properties > Object
  • Active Directory Users and Computers > Server Properties > General > NTDS Settings > Object
  • Active Directory Sites and Services > Site > Servers > Server Properties > Object

Im Anschluss kann der Server im ADUC gelöscht werden.

Danach kann man das Server Objekt im Active Directory Sites and Services ebenfalls entfernen. Sollte der ausgefallene Domain Controller eine der FSMO-Rollen inne gehabt werden, muss diese einem anderen Server zugewiesen werden > NTDSUtil > roles > connections > connect to server %domaincontroller% > seize %fsmo-rolle%

März 20

Windows Server Patching mit PoshPAIG

Jeden Monat das selbe… Es gibt neue Windows Server Updates und diese sollten zeitnah auf allen Servern eingespielt werden. Mit WSUS und Gruppenrichtlinien kann man das vollständig automatisieren was aber nicht in jeder Umgebung gewünscht ist.

Sich auf jeden Server per RDP aufschalten und die Updates von Hand zu installieren ist jedoch auch müssig.

Unterstützen kann hier das PowerShell Patch/Audit Utility (PoshPAIG) von Boe Prox:

Mit PoshPAIG kann man eine Liste von Servern automatisiert auf folgende Optionen hin abprüfen:

  • Audit Patches
  • Install Patches
  • Check Pending Reboot
  • Ping Sweep
  • Services Check
  • Reboot Systems

Zusätzlich kann man sich noch eine handvoll CSV Reports erstellen lassen.

 

Alles in allem eine feine Sache für alle, die den Patchvorgang nicht vollständig durch automatisieren möchten.

Februar 6

Win10 GP-Pack von Mark Heitbrink

Mark Heitbrink bzw. gruppenrichtlinien.de hat ein neues GPO Paket erstellt:

gp-pack PaT – Privacy and Telemetry

welches er für 89 Euro vertreibt.

 

Das GP Pack beinhaltet unter anderem 70 Policies welche 250 Registry Keys setzen sowie ein eigenes ADM Template und Scripte für Windows 10. Damit können 40 Apps im Hintergrund deaktiviert/deinstalliert werden, man kann die Windows 10 Telemetrieübermittlung deaktivieren und es beinhaltet Vorlagen für ein minimalistisches Startmenü.

Alles in allem kann man sich das auch einzeln im Internet zusammensammeln, ich für meinen Teil werde mir das gp-pack bestellen (und dann berichten). :-)