Archiv für den Monat: Juni 2017

Neue Rolle für NanoServer – in Zukunft nur noch als Container-Host (?)

Wie es aussieht, hat Microsoft die künftige Rolle von NanoServer komplett neu definiert. Anstelle einer Kombination aus Core OS und diversen Rollen soll NanoServer in Zukunft ausschließlich Anwendungscontainer ausführen. Es soll darüber hinaus keine Unterstützung für Rollen mehr geben:

https://blogs.technet.microsoft.com/hybridcloud/2017/06/15/delivering-continuous-innovation-with-windows-server/?MC=OfficeO365&MC=SecSys&MC=IoT&MC=MSAzure&MC=WinServer

Damit wird auch die Frage hinfällig, ob NanoServer als DC fungieren kann, wenn sich Microsoft entschließen würde, die AD DS-Rolle zur Verfügung zu stellen. Wer einen Server mit Minimalausstattung wünscht, muss dafür in Zukunft wieder Server Core verwenden.

Schade, ich denke, dass diese Entscheidung insofern falsch ist, dass Microsoft damit einen falschen Schwerpunkt setzt und ein weiteres Signal aussendet, dass „On Premise“-Lösungen in der strategischen Plannung keine große Rolle mehr spielen. Und: Ich habe noch niemanden getroffen, der Container einsetzt, daher kann ich diese Fokusierung auf einen Nischenbereich nicht nachvollziehen. Wenn es stimmt, dass in NanoServer 10 Jahre Entwicklungsarbeit stecken, dann ist die Reduzierung auf einen Container-Host als Ergebnis etwas dürftig. Und: Kooperiert Microsoft nicht mit Docker, die das alles bereits im Programm haben dürften?

Natürlich wird es Gründe gegeben haben. Einer dürfte die nach wie vor geringe Nutzung von NanoServer sein.

PS: Das wäre eine weitere Frage, die jemand Jeffrey Snover, der als Leiter der Windows Server-Gruppe auch für NanoServer zuständig ist, auf der letzten PowerShell-Konferenz hätte stellen können.

Tipp: Mit Subst nicht mehr existierende Laufwerke mappen

Es kommt auch im Jahr 2017 noch vor, dass Anwendungen irgendwelche absoluten Pfade speichern und sollte das Laufwerk aus irgendeinem Grund nicht mehr existieren, lästige Fehlmeldungen anzeigen. Jedes Mal. Und das nicht bei irgendwelchen „Wald&Wiesen-Apps“, sondern z.B. auch bei Visual Studio.

Ich verstehe nicht, warum Microsoft Milliarden in Machine Learning investiert, aber Visual Studio nicht einfach lernen kann, dass z.B. ein Laufwerk H: nicht existiert, auch wenn der Laufwerksbuchstabe einem nicht existierenden USB-Laufwerk zugeordnet wurde.

Abhilfe schaft das Ur-Alt-Kommando Subst. Der folgende Befehl mapt den Pfad E:\ auf das nicht mehr existierende Laufwerk H:

Der Befehl kann in der PS-Befehlszeile direkt so eingegeben. In der Regel wird es aber einen Fehler geben, der besagt, dass H: ein ungültiger Parameter ist. Der Grund ist, dass der Laufwerksbuchstabe H: einem nicht existierenden USB-Laufwerk zugeordnet ist. Abhilfe schafft die Datenträgerverwaltung (einfach „Diskmgmt.msc“ eingeben), in der ihr bei dem Laufwerk einfach den Laufwerksbuchstaben löscht. Danach klappt es auch mit Subst und es gibt keine lästigen Fehlermeldungen nach jedem Windows-Start oder bei anderen Gelegenheiten.

Managed Service Accounts (MSAs) erstellen – per Befehlszeile und mit einem GUI-Tool

Ein Managed Service Account (MSA) ist, vereinfacht, ein Dienstkonto (also ein Benutzerkonto, das ausschließlich von Systemdiensten für die Anmeldung verwendet wird), das von Windows insofern verwaltet wird, dass sich der Admin nicht mehr um das Erneuern von Kennwörter kümmern muss.

MSAs wurden mit Windows Server 2008 R2 eingeführt.

Bis zur aktuellen Windows Server-Version können MSAs nur per PowerShell angelegt werden.

Das Anlegen eines MSA besteht aus drei Schritten:

1. Anlegen des MSA per New-ADServiceAccount-Cmdlet

Bei diesem Schritt wird das Konto auf einem DC angelegt.

2. Hinzufügen des MSA auf dem jeweiligen Computer, auf dem es später verwendet werden soll, per Add-ADComputerServiceAccount-Cmdlet

$ServiceAccountHost ist der Name des Computers, $ServiceAccount Name des MSA oder gleich das ganze Objekt, das den MSA repräsentiert.

3. Installieren des MSA auf dem Computer, auf dem es später verwendet werden soll, per Install-ADServiceAccount-Cmdlet.

Das war im Prinzip alles. In der Praxis kann allerdings eines „schief gehen“, so dass die im Grunde einfachen Cmdlets zu Fehlermeldungen führen.

Ein Aspekt ist, dass auf dem DC ein „Kds Rootkey“ angelegt werden muss, der sofort wirksam wird.

Ein weiterer Aspekt ist ein Bug, der inzwischen behoben werden sollte, durch den der Name eines MSA nicht länger als 16 Zeichen werden dürfte.

Alles ein wenig umständlich. Zum Glück gibt es ein geniales GUI-Tool von Cjwdev, mit dessen Hilfe das Anlegen eines MSA sehr einfach wird:

http://cjwdev.co.uk/Software/MSAGUI/Info.html

Die aktuelle Version ist 1.6.

DSC – geplante Neuerungen

Auf der PoshConf Eu 2017 hat Jeffrey Snover in einer Folie die für DSC geplanten Neuerungen als Teil einer „Cloud Command Console“ zusammengestellt:

  • Ein portabler LCM für Windows und für Linux
  • Mehrere LCM-Instanzen
  • Ein Native Code-LCM (in C) für Umgebungen mit wenig Hardwareressourcen
  • Ein LCM als Bibliothek
  • Der LCM soll als Systemdienst ausführen (?)

Auch wenn diese Neuerungen auf der Folie „Core PowerShell in Azure“ aufgeführt wurden, gehe ich davon aus, dass sie allgemein verfügbar sein werden. Wann? Dieser Punkt ist noch offen.

Nuget-Packages direkt laden

Nuget-Packages sind Paketdateien, die in der Regel Assembly-Dateien enthalten, die von Entwicklern für ihre Projekte verwendet werden. Seit Visual Studio 2012 werden solches Packages über die Paketverwaltung oder über das PowerShell-Konsolenfenster per Install-Package hinzugefügt.

In einem PowerShell-Skript benötigt man im Allgemeinen keine Packages. Wie immer gibt es Ausnahmen. Eine solche Ausnahme ist das sehr nützliche HtmlAgilityPack, das aus einer Assembly-Datei besteht, mit deren Hilfe sich die Inhalte einer Html-Seite per XPath und vertrauten XML-Methoden wie SelectNodes und SelectSingleNode ansprechen lassen.

Lee Holmes beschreibt die Technik des „Html Scraping“ mit Hilfe des HtmlAgilityPack sehr schön unter der folgenden Adresse:

http://www.leeholmes.com/blog/2010/03/05/html-agility-pack-rocks-your-screen-scraping-world/

Ich habe darüber auch bereits etwas geschrieben, aber wer den Artikel von Lee Holmes liest, weiß damit alles Wissenswerte und kann sich das Lesen anderer Blog-Einträge erst einmal sparen.

Bis auf eine Kleinigkeit eventuell: Normalerweise lädt man die Assembly-Datei von der Codeplex-Projektseite herunter. Es gibt zwei Gründe, die dagegen sprechen: Das Codeplex-Portal soll irgendwann in naher Zukunft eingestellt werden. Die Methode ist nicht besonders elegant, wozu gibt es das PackageManagement-Modul seit PowerShell 5.0?

Damit auch Nuget-Packages geladen werden, muss eine Package Source für die Adresse https://www.nuget.org/api/v2 existieren (dies ist zwar die „alte“ Adresse, sie funktioniert natürlich nach wie vor). Das Get-PackageSource-Cmdlet fragt diese ab:

Sollte die Package Source wider Erwarten noch nicht dabei sein, muss sie zuerst per Register-PackageSource angelegt werden:

Dabei muss auch der Providername, in diesem Fall Nuget angegeben werden. Das Ergebnis ist eine neue Package Source mit dem Namen „NugetP“.

Damit kann das HtmlAgilityPack-Package per Install-Package-Cmdlet heruntergeladen werden:

Abgelegt wird das „Package“ mit seinen Dateien unter C:\Program Files\PackageManagement\NuGet\Packages. Die entscheidende Datei HtmlAgilitypack.dll befindet sich in einem der zahlreichen Unterverzeichnisse, z.B. unter HtmlAgilityPack.1.4.9.5\lib\Net45. Sie wird per Add-Type-Cmdlet und dessen Path-Parameter geladen.

Eine Alternative ist der direkte Aufruf von Nuget.exe, das zuerst per dir lokalisiert werden muss.

Sollte das aus irgendeinem Grund nicht funktionieren, kann es erforderlich sein, die Nuget-Paketquelle zuerst zu aktivieren:

Ein Nuget sources list listet alle vorhandenen Sources auf, ein Nuget list alle verfügbaren Pakete.