Arbeitsprofil daheim nutzen mit Kniff

Vielleicht hattet ihr das auch: Ihr geht nach den Guide der c’t vor und trotzdem geht etwas nicht. Zum Beispiel taucht der „Anderer User“ anmelden Dialog nicht auf. Bei mir ging zudem die Ausführung von Outlook nicht, weil sich der AADBroker dazwischen geschaltet hat, den der Benutzer nicht quittieren konnte. Dazu unten mehr.

Zuerst muss ich natürlich einen Benutzer anlegen, mit dem ich die Programme und Daten für die Arbeit nutzen möchte.

Hier noch einmal die Schritte in „Kurzfassung“. Es wird ein Benutzer angelegt, ein virtuelles Laufwerk erstellt, das Laufwerk verschlüsselt und das Benutzerprofil verschlüsselt.

Weiterlesen

0x%1!X! – Sprachpakete in Windows 10

Sprachpakete… Man kann nicht mit ihnen, aber ohne sie geht halt auch nicht. Vor allem, wenn man Mitarbeiter im Unternehmen hat, die kein englisch oder deutsch verstehen. Ich halte das noch immer für eine dreiste Lüge, aber was soll ich machen. Dann halt mit Sprachpaketen.

Also erst einmal das aktuelle Sprachpaket laden. Wo gab es das noch einmal? Ach was solls, wir haben doch den uupdump. Datei „microsoft-windows-client-languagepack-package_<lang>-<processor>-<lang>.esd“ laden und im SCCM einbinden. Zum Schluss noch in der aktuellen Windows 10 Task Sequenz die Sprachpakete einbinden und fertig.

Das funktioniert auch soweit, nur dass nach dem ersten Boot und dem Wechsel von der Sprache die man installieren wollte – bzw. installiert hat – in die Sprache, die auf der ISO installiert war ein „Fehler“ auftritt. Dieser ist als solches beim ersten Hinschauen nicht erkennbar, da die Meldung in den „Nein, nicht abmelden“-Dialog gestopft wird.

Kurz gesagt ist ein Fehler aufgetreten und ein paar Sprach-Funktionen konnten nicht korrekt geladen werden („you can try again later… Error code: 0x%1!X!“). Unter der Sprachauswahl steht ein ähnlicher lokalisierter Text: „Sorry, we’re having some trouble on our end. Retry?“

In diesem konkreten Fall, reicht es aus, das Windows Update anzuschmeisen und damit das letzte CU neu installieren zu lassen. Anschließend haben die installierten Sprachpakete eine andere Version, nämlich die des aktuellen Builds (beispielsweise 18363.476).

Als kleinen Nachtrag (ich bin faul): LXP sind keine vollständigen Language Packs (siehe MS TechNet, „[…] however, for full languages (aka SKU languages), we have not yet retired the legacy language packs (lp.cab) […]“). Daher sind LXPs nichts für unsere Umgebung. Sollte Microsoft hier mal etwas ändern um es den Admins „leichter“ zu machen, werde ich mich dessen annehmen… Vielleicht…

SCCM Hidden Operating System Deployment

Sodele,

wieder etwas aktuelles:

Ich habe intern die neue Windows Server 2019 Insider Preview Build eingepflegt. Diese soll allerdings nicht für alle Workstations erreichbar sein, auch wenn die Collection ausgewählt wurde, sondern nur durch ein „Hintertürchen“, wenn man dies so nennen möchte.

Als Anmerkung: Ich mag keine VBS Lösungen. Das übermächtige PowerShell ist mir da doch lieber. Ich werde mir da demnächst mal etwas kleines zusammen basteln. Wenn es klappt, setze ich dies hier hinein.

Als erstes müssen wir das hinterlegte Boot-Image anpassen.

Achtung: Damit nichts wichtiges gefährdet wird, sollte die boot.wim gesichert werden!

Schritt 1: Boot.WIM einbinden

Den entsprechenden Pfad einfach anlegen. WinPEMount gibt es schließlich nicht. Die Angabe des Index ist erforderlich, auch wenn nur ein Index existiert.

Schritt 2: Daten in den temporären Pfad kopieren

Kopiert wird hier die devel.vbs [LINK FOLGT]. In diesem Script wird eine temporäre Datei angelegt, die nach der Eingabe des Kennwortes überprüft wird. Ich schaue hier aber auch noch, ob ich nicht ein PowerShell Tool schreibe.

Schritt 3: Änderungen an der Boot.WIM bestätigen

Schritt 4: Boot Image im SCCM bearbeiten

Als Prestart Command folgendes eingeben:

Den Pfad zur check_hidden.vbs auswählen und den „command support“ aktiveren. Alles soweit bestätigen und abschließen.

Im SCCM PXE Menü F8 drücken und im Command Prompt „devel“ eingeben (das Script). Nach Eingabe des Kennwortes folgt eine Prompt zur Eingabe der Deployment ID. Nach dem Bestätigen wird das Deployment gestartet.

Falls man lieber ein eigenes Script entwickeln möchte, lässt sich nach der Eingabe des Kennwortes auch mit F8 direkt in der Konsole arbeiten. Hier aber immer mit Bedacht vorgehen 😉

Die Scripts:

 

SCCM Task Sequence Manipulation

Lange ist es her, dass ich mal etwas geschrieben habe. Etwas schwer, wenn man sich in einen neuen Job einarbeitet; Da hat man kaum Lust noch etwas online zu stellen.

Hier kann ich nun endlich mal mit einer vernünftigen (wenn auch nicht an allen Punkten durchdachten) Software-Verteilung arbeiten. Auch PowerShell kann ich weiter verteifen, womit auch auch direkt zu meinem letzten Problem komme: Die Anzeige von mehr Schritten, als SCCM mit weißmachen wollte. Im Netz kursieren dazu unter anderem Guides zum manipulieren von MDT Scripts (ZTIUtility.vbs) unter ConfigMgr2007. (2 (VBScript, der Name der Seite passt irgendwie dazu :D), 3 (SMS und C)). Da ich aber mit PowerShell Script bestimmte Einstellungen vornehmen möchte, suche ich nach etwas anderem.

Damit ich darauf später wieder zugreifen kann (und vielleicht auch dem einen oder andern damit helfe) hier die Fortschritts-Manipulation:

Was die einzelnen Einträge zu bedeuten haben, kann detailierter im MSDN / „Developer Network“ von Microsoft nachgelesen werden. Task Sequence Variablen gibt es ebenfalls bei Microsoft nachzulesen.

 

WDS PXE Pre-Set (Custom Images)

Sodele,

nun zu einer Sache die ich seit meiner Ausbildung leider nie in Aktion erlebt habe und wohl auch eine längere Zeit erst einmal nicht mehr sehen werde: Die Verteilung von Images und das Ausführen von Live-CDs über WDS / PXE.

Damit dies nicht nur mit Windows Abbildern funktioniert, müssen am WDS ein paar Einstellungen vorgenommen werden.

Dazu kann man sich diesen Beitrag hier durchlesen.

Wichtig vor allem das entsprechende Standard Boot-Image auszuwählen. Dies geht im Windows Server eigenen WDS Manager mittlerweile nicht mehr und muss über die PowerShell geändert werden.

Falls man sich umentscheiden sollte lässt sich hiermit der Standard wiederherstellen:

wdsutil /set-server /bootprogram:boot\x86\pxeboot.com /architecture:x86
wdsutil /set-server /N12bootprogram:boot\x86\pxeboot.n12 /architecture:x86
wdsutil /set-server /bootprogram:boot\x64\pxeboot.com /architecture:x64
wdsutil /set-server /N12bootprogram:boot\x64\pxeboot.n12 /architecture:x64

Ich habe entsprechend noch die Abbilder angepasst (viele sind für das Menü nur als dummies hinterlegt) und mir ein eigenes Hintergrundbild angelegt. Dies passt zu den hinterlegten Farben ganz gut.

Dazu noch einmal der Link zum im Beitrag verlinkten Download. Hier einfach den im Paket enthaltenen Liesmich-Dateien folgen.

Soviel dazu.

Luke

Aktuelles #2017.10

Freunde der Sonne,

habe lange nichts mehr von mir hören lassen. War durch den neuen Job seit 01.01.2017 auch nicht leicht. Hatten durch verschiedene Projekte viel zu tun. Jetzt wurde die letzten Wochen der neue ESXi in Betrieb genommen (endlich; Hyper-V ist nicht mein Fall, und Veeam lief auch nicht zu 100%. So wurde das application processing nicht korrekt ausgeführt und die Transaction Logs des Exchange mussten manuell entfernt werden… aber das ist eine andere Geschichte).

Da wir hier nur ein „kleines Büro“ eines lokal sehr gut vertretenen Bau-Unternehmens sind, wird nun allerdings meine Stelle eingespart. Jetzt stellt sich für die restlichen Angestellten aber die Frage, ob dies eine so gute Entscheidung war, da bestimmte Aufgaben immer noch auf jemanden mit entsprechendem Wissen abgewälzt werden müssten.

Ich werde die nächsten Tage und Wochen mal den aktuellen Arbeitsmarkt durchforsten und Bewerbungen schreiben.  Ich stelle mir allerdings schon die Frage, ob ich mich nicht selbstständig machen sollte. Wie sagte Jean-Jacques Rousseau noch so schön:

Die Freiheit des Menschen liegt nicht darin, dass er tun kann, was er will, sondern, dass er nicht tun muss, was er nicht will.

Ich werde mich hier mal etwas belesen und mit Freunden ein paar Gespräche führen und dann sehe ich weiter. Bis dahin

Luke

Java Threads und die Zeit

Guten Morgen meine IT-Kollegen,

gerade stieß ich wieder auf ein Problem, welches unter normalen Umständen nicht auftreten sollte: Die Uhrzeit des Hosts ändert sich. Dies sollte bei Programmen die keine Threads haben, oder Threads, die alle paar Stunden einmal ausgeführt werden sollen, in der Regel kein Problem sein. Bei Threads die wichtige Daten alle paar Minuten auswerten / verschieben / löschen sollen, kann dies aber unter Umständen zu dem Problem führen, dass der Thread erst bei der nächsten Uhrzeit ausgeführt wird (Thread.sleep(), Timer und der TimerTask sind hier so Kandidaten).

Zur Veranschaulichung folgende Situation die ich letztens hatte: Ein Programm verschiebt Daten alle X Sekunden (oder sobald eine Datei in ein C:\Pfad landet) auf einen UNC-Pfad. Jetzt wird die nächste Ausführung durch den Timer auf die aktuelle Zeit plus den eingestellten Delay gesetzt. Auf Grund eines Backup-Systems mit einer falschen Uhrzeit, wird die Zeit des Hosts mit der Zeit des Backup-Systems, ein eigenes System mit leider falsch eingestellter Uhrzeit welches von meinem Kollegen verwaltet wird, synchronisiert (sollte nicht passieren, aber das ist ein anderes Thema) und somit um 2 Stunden nachgestellt.

Der Thread wird wieder ausgeführt und setzt die Zeit wieder auf die veränderte aktuelle Zeit plus den vorher eingestellten Delay. Das Backup System wird anschließend fertig und die Zeit wird wieder auf die vorherige zurück gestellt. Jetzt hätten wir auf dem Host beispielsweise 10:00 Uhr, auf dem Backup-System 12:00 Uhr und der nächste Thread würde um 12:02 Uhr anfangen. In den zwei Stunden macht das Programm gar nichts, da der Thread geplant ist und so gesehen kein Fehler zum Auswerfen vorliegt.

So weit dazu.

Dies scheint vor allem an den von Java verwendeten Funktionen zu liegen. Allen voran die Funktion System.currentTimeMillis(). Man könnte nun eigene Klassen und Funktionen schreiben, die statt dieser die Funktion System.nanoTime() verwendet, aber dann müsste man die damit zusammenhängenden Funktionen auch neu schreiben und da diese leider meist private deklariert wurden die entsprechenden Klassen gleich mit dazu.

Sowas mache ich meist eher ungern 😉

Eine gute Möglichkeit für den Ersatz von java.util.Timer (oder entsprechender anderer Klasse) ist ein ScheduledThreadPoolExecutor. Dies könnte in Verwendung in etwa wie folgt aussehen:

Ist natürlich nur ein Beispiel. Man könnte unter anderem die return Werte von scheduleAtFixedRate() in einem Future Array speichern und dann abfragen, aber das gehört in einen anderen Beitrag 😉

Viel Spaß beim Programmieren

Lukas