Drücke "Enter", um den Text zu überspringen.

Schlagwort: Windows Server

Windows Server 2022 Preview

Seit ein paar Tagen steht er fest – der Name des nächsten Windows Servers. Und wenig überraschend lautet er Windows Server 2022. Dieses ist nun als öffentlich zugängliche Preview verfügbar, sowohl als Image zum Download für lokalen Einsatz, als auch als Marketplace-Image in Azure.

Dazu können folgende Links benutzt werden:

http://aka.ms/WS2022Preview

http://aka.ms/WS2022AzurePreview

Viel Spaß beim Ausprobieren! Wenn ich etwas Zeit finde, werde ich dazu auch einen ersten Review (vermutlich dann auf YouTube) veröffentlichen.

Schreibe einen Kommentar...

PowerShell – Windows Client oder Windows Server als NTP Server benutzen

Sicherlich ist den Meisten bekannt, dass Windows seit vielen Generationen out-of-the-box als NTP-Client genutzt werden kann – also die Uhrzeit von einem NTP-Server beziehen kann. Aber dass sowohl Windows Server (seit WS2003) als auch Windows Client (seit Win XP) auch mit Bordmitteln als NTP-Server genutzt werden können, dürfte weitgehend unbekannt sein. Das Ganze lässt sich in einigen wenigen Schritten erreichen:

  • Windows Zeitdienst W32Time auf automatischen Start setzen
  • W32Time als NTP-Server konfigurieren (Registrierungsschlüssel)
  • W32Time Dienst neustarten
  • Firewall auf udp/123 für Verbindungen von außen öffnen

Natürlich kann man das sehr effizient mittels PowerShell erledigen. Dazu habe ich ein einfaches Script geschrieben:

# This script makes a Windows 10 PC acting as a NTP server 
 
#Enable autostart for W32Time Service
Set-Service -Name W32Time -StartupType Automatic
 
# Configure W32Time Service to act as a NTP server
Set-ItemProperty -Path HKLM:\System\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer -Name Enabled -Value 1
 
# Update W32Time service
w32tm.exe /config /update
 
# Restart W32Time service
Restart-Service -Name W32Time
 
# Check configuration - VMICTimeProvider / Enabled should be "1" now
w32tm.exe /query /configuration
 
# Create an inbound rule for the Windows Firewall
New-NetFirewallRule -DisplayName "Allow NTP UDP/123 Incomming" -Profile Any -Action Allow -Direction Inbound -LocalPort 123 -Protocol udp -Enabled true
1 Kommentar

Windows Server – nächste Version offiziell angekündigt

Microsoft hat vor wenigen Stunden in einem längeren Blogartikel (siehe Link) viele Details zum nächsten Windows Server veröffentlicht. Dieser wird „Windows Server 2019“ heißen und bereits in der zweiten Jahreshälfte diesen Jahres erscheinen. Über das Insider-Programm kann bereits eine Preview heruntergeladen und genutzt (natürlich nur zu Testzwecken!) werden:

https://insider.windows.com/de-de/for-business-getting-started-server/

Nach Aussage von Microsoft soll der neue Server vor allem 4 Hauptthemen adressieren:

  • Hybrid,
  • Security,
  • Application Platform und
  • Hyper-converged Infrastructure

Der neue Windows Server wird das nächste Release im LTSC (Long term servicing channel sein). In diesem wird es wieder eine GUI-Installationsoption sowie den Core-Server geben. Für den Semi-Annual-Channel (eher nicht für klassische Server-Szenarien geeignet) gibt es nur Core- und Nano-Server-Installationen.

Die Lizensierung des Server 2019 wird genau so wie bei 2016 organisiert sein. Microsoft kündigt aber eine Erhöhung der Preise für CALs an.

Details und weiteres siehe Blog-Artikel.

Quelle: https://cloudblogs.microsoft.com/windowsserver/2018/03/20/introducing-windows-server-2019-now-available-in-preview/

Schreibe einen Kommentar...

PowerShell: Alte Offline-Backups von Windows Server Sicherung entfernen

Mir ist kürzlich bei einem Server das Sicherungsziel der täglichen Windows Serversicherung gestorben, da dieser (sehr einfache) Hyper-V-Server nur auf eine USB-Disk sichert, deren Speicherplatz per iSCSI an die VMs durchgereicht wird. Dies hat zur Folge, dass die Windows Serversicherung die dort abgelegten Sicherungen für alle Ewigkeit weiterhin anzeigt und mitzählt. Bei dem Versuch einer Wiederherstellung von Daten auf der gestorbenen Platte würde angezeigt werden, dass das Sicherungsziel offline ist und man hätte die – praktisch nicht mehr umsetzbare – Möglichkeit, die Daten verfügbar zu machen.

wsbkp1

Wenn man jetzt die Infos über die nicht mehr vorhandenen Sicherungen löschen will, um eine saubere “Statistik” zu haben, kann man sich eines PowerShell-Cmdlets bedienen: Remove-WBBackupSet.

Der Aufruf dazu sieht so aus:

Remove-WBBackupSet –MachineName SERVERNAME -KeepVersions 4

Der Parameter –KeepVersions gibg dabei an, wieviele der letzten Sicherungen man behalten möchte. Alternativ kann man mit –DeleteOldest die X ältesten Sicherungen entfernen.

wsbkp2

Bei dem Aufruf wird es aber sehr wahrscheinlich zu vielen Fehlern kommen, wie man im Screenshot sieht. Da die Sicherungen nicht mehr erreichbar sind, das Cmdlet aber eigentlich die Files dazu löschen würde, muss man sich hier zusätzlich des –Force Parameters bedienen:

wsbkp3

Dabei wird die Tatsache, dass die Sicherungen auf der ausgefallenen Platte nicht mehr erreichbar sind, ignoriert und nur der Verweis auf diese Sicherungen entfernt.

Mit dem Aufruf Get-WBBackupSet kann man sich nochmal ausgeben lassen, wieviele Sicherungen Windows Server Backup “kennt”:

wsbkp4

2 Comments

Hyper-V: Welcher Host ist am besten für eine neue VM geeignet?

Mir stellt sich im Administrations-Alltag immer wieder die Frage, welcher unserer Hyper-V-Hosts derzeit am besten für eine neue VM geeignet ist (Nein, wir verwenden leider kein VMM…). Anstatt aber dabei jedes Mal jeden Host hinsichtlich seiner freien Ressourcen “abzuklappern”, habe ich mir ein entsprechendes PowerShell-Skript geschrieben, was eine passende Function bereithält. Ihr könnt das Skript gerne für eure Zwecke anpassen oder direkt so übernehmen.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
$AllHyperVHosts = "HostNr1","HostNr2","HostNr3"
 
function Get-HyperVHostInfo([string]$HyperVHost)
{
 
    $vCores = ((Get-VM -ComputerName $HyperVHost).ProcessorCount | Measure-Object -Sum).Sum
 
    $Property = "numberOfCores", "NumberOfLogicalProcessors"
    $CPUs = Get-Ciminstance -class Win32_Processor -Property  $Property -ComputerName $HyperVHost| Select-Object -Property $Property 
    $Cores = ($CPUs.numberOfCores | Measure-Object -Sum).Sum
    $logCores = ($CPUs.NumberOfLogicalProcessors | Measure-Object -Sum).Sum
 
    $os = Get-Ciminstance Win32_OperatingSystem -ComputerName $HyperVHost
    $MemFreePct = [math]::Round(($os.FreePhysicalMemory/$os.TotalVisibleMemorySize)*100,2)
 
    $object = New-Object -TypeName PSObject
    $object | Add-Member –MemberType NoteProperty –Name PhysicalCores –Value $Cores
    $object | Add-Member –MemberType NoteProperty –Name LogicalCores –Value $logCores
    $object | Add-Member –MemberType NoteProperty –Name VirtualCores –Value $vCores
    $object | Add-Member –MemberType NoteProperty –Name MemTotalGB -Value ([int]($os.TotalVisibleMemorySize/1mb))
    $object | Add-Member –MemberType NoteProperty –Name MemFreeGB -Value ([math]::Round($os.FreePhysicalMemory/1mb,2))
    $object | Add-Member –MemberType NoteProperty –Name MemFreePct -Value $MemFreePct
 
    Return $object
}
 
ForEach($OneHost in $AllHyperVHosts)
{
    $HostData = Get-HyperVHostInfo -HyperVHost $OneHost
 
    Write-Host "$OneHost has $($Hostdata.PhysicalCores) physical cores, $($Hostdata.LogicalCores) logical cores and $($Hostdata.VirtualCores) virtual cores are used in all VMs overall." -ForegroundColor Yellow
    Write-Host "The Core:vCore ratio is `t`t1:$([math]::Round(($Hostdata.VirtualCores) /  ($Hostdata.PhysicalCores),2))"
    Write-Host "The Log.Core:vCore ratio is `t1:$([math]::Round(($Hostdata.VirtualCores) /  ($Hostdata.LogicalCores),2))"
    Write-Host "The system has $($Hostdata.MemFreeGB)GB of free memory and $($Hostdata.MemTotalGB)GB memory at all, which is $($Hostdata.MemFreePct)% free"
    Write-Host ""
 
}
Write-Host "The conservative approach for logical cores is `t1:8 "

 

Eine Beispielausgabe sieht dann so aus:

hyperv1

Schreibe einen Kommentar...

PowerShell – RAM-Konfiguration eines Systems auslesen

Bei der Frage, ob ein Server (oder auch Client) noch etwas mehr RAM vertragen kann, stellt sich oft die Frage, wieviel RAM dann aktuell in wie vielen Modulen verbaut ist und wieviele Slots noch frei sind. Natürlich gibt es dazu auch bereits grafische Werkzeuge, die das können, aber spätestens, wenn mehrere Maschinen (ggf. auch Core-Server ohne GUI) abgefragt werden sollen, kann die PowerShell ihre Stärken ausspielen. Daher habe ich ein kleines Skript gebaut, welches diese Aufgabe erfüllt:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[Cmdletbinding()]
Param(
    [string]$Computername = "localhost"
)
cls
$PysicalMemory = Get-WmiObject -class "win32_physicalmemory" -namespace "root\CIMV2" -ComputerName $Computername
 
Write-Host "Memory Modules:" -ForegroundColor Green
$PysicalMemory | Format-Table Tag,BankLabel,@{n="Capacity(GB)";e={$_.Capacity/1GB}},Manufacturer,PartNumber,Speed -AutoSize
 
Write-Host "Total Memory:" -ForegroundColor Green
Write-Host "$((($PysicalMemory).Capacity | Measure-Object -Sum).Sum/1GB)GB"
 
$TotalSlots = ((Get-WmiObject -Class "win32_PhysicalMemoryArray" -namespace "root\CIMV2" -ComputerName $Computername).MemoryDevices | Measure-Object -Sum).Sum
Write-Host "`nTotal Memory Slots:" -ForegroundColor Green
Write-Host $TotalSlots
 
$UsedSlots = (($PysicalMemory) | Measure-Object).Count 
Write-Host "`nUsed Memory Slots:" -ForegroundColor Green
Write-Host $UsedSlots
 
If($UsedSlots -eq $TotalSlots)
{
    Write-Host "All memory slots are filled up, none is empty!" -ForegroundColor Yellow
}

Die Ausgabe sieht dann etwa so aus:

PS_Memory1

Auf meinem Notebook mit nur zwei RAM-Slots (beide belegt) kommt zusätzlich noch eine kleine “Warnung”:

PS_Memory2

Ihr könnt das Skript auch hier herunterladen:

https://gallery.technet.microsoft.com/scriptcenter/Get-Memory-RAM-configuratio-35dda12e

Schreibe einen Kommentar...

Hyper-V Server 2012 R2 / 2016 bzw. Server Core: SNMP-Dienst konfigurieren

Wenn man auf einem Hyper-V Server (gemeint ist der kostenlose Server, der ohne GUI, also vergleichbar einer Server Core Installation, und nur mit Hyper-V as Rolle betrieben werden kann) den SNMP-Dienst installiert hat, muss diese noch konfiguriert werden.

Die Installation selber kann remote über den Servermanager oder lokal über PowerShell erfolgen:

snmp0

Add-WindowsFeature -Name SNMP-Service,SNMP-WMI-Provider

snmp0b

Nach der Installation würde man auf einem grafischen Server jetzt einfach die Dienste-Konsole oder die Computerverwaltung öffnen und den Dienst dort entsprechend konfigurieren. Die grafischen Werkzeuge stehen aber lokal nicht zur Verfügung. Verwendet man jetzt bspw. die Computerverwaltung von einem grafischen Server aus und verbindet sich von dort mit dem Hyper-V Server bzw. dem als Server Core installierten Server, wird man leider feststellen, dass dort einige Optionen im SNMP-Dienst fehlen:

snmp1

Abhilfe schafft hier die Installation des SNMP-Features auch auf der Maschine, von der aus man mit dem grafischen Werkzeug arbeiten möchte. Danach kann man auch remote die passenden Einstellungen vornehmen:

snmp2

Viel Spaß beim Ausprobieren!

Schreibe einen Kommentar...

Active Directory: Benutzer GPOs mit Sicherheitsfilterung funktionieren nicht

Ja, ich weiß, ich erzähle jetzt hier nichts brandneues mehr. Aber vielleicht geht es anderen so wie mir diese Woche, daher also dieser Artikel. Aber erst mal von Anfang an:

Ich habe diese Woche in unserer ActiveDirectory Umgebung eine neue GPO angelegt. Mein Ziel war, damit eine neue Mailsignatur an alle Benutzer auszurollen. Die nötigen Einstellungen befinden sich im Benutzer-Zweig der GPOs, daher spreche ich gerne von einer “Benutzer-GPO”, was man bei mir auch immer im Namen sieht. Um das Ganze erstmal sinnvoll testen zu können, habe ich auf die Sicherheitsfilterung zurückgegriffen. Ihr wisst schon, damit kann man die GPO statt auf die gesamte verknüpfte OU auf einzelne Benutzer oder Gruppen anwenden. Also habe ich die “Authentifizierten Benutzer” entfernt, und stattdessen mich und einen weiteren Kollegen dort eingetragen:

gpo1

Das Problem

Leider wirkte sich die GPO dann nicht wie gewünscht aus. Auffällig war aber, dass ich plötzlich auch das Verzeichnis, in dem sich die GPO-Daten und damit auch das Skript, dass die GPO ausführen sollte, befanden, nicht mehr lesen konnte. Selbst mit einem Domänen-Admin-Konto nicht! Sobald ich die “Authentifizierten Benutzer” bzw. in meinem Fall “Authenticated Users” wieder hinzugefügt hatte, konnte ich die Dateien wieder lesen. Natürlich hätte ich damit aber auch die GPO für die gesamte GPO ausgerollt.

Die Ursache

Ein bisschen Recherche im Internet brachte mich dann auf die Ursache des Problems und damit auch auf dessen Lösung:

Microsoft hatte durch ein Update, dass bereits im Juni 2016 erschienen war, eine wesentliche Arbeitsweise von GPOs geändert:

Bisher war es so, dass für das Wirksamwerden von Computer-GPOs das Computerkonto für die GPO das Lesen-Recht haben musste und bei Benutzer-GPOs das Benutzerkonto. Das Ganze passte auch zur Logik, dass Computer-Richtlinien nur auf Computerkonten wirken und Benutzer-Richtlinien nur auf Benutzerkonten (Ausnahme: Loopback-Verarbeitung). Das hat man auch nicht geändert. Was allerdings geändert wurde ist, dass auch bei Benutzer-Richtlinien das Computerkonto die Leserechte auf die GPO braucht.

Wenn man entweder keine Benutzer-GPOs benutzt oder bei diesen immer die “Authenticated Users” in der “Security Filtering” drin lässt (womit dann faktisch nur noch eine Steuerung über die verknüpfte OU oder über WMI-Filter möglich wird, wenn man nicht vom “verweigern” der Berechtigungen Gebrauch machen will) ändert sich für einen selbst nichts.

Wenn man aber so wie ich gerne mal auch bei Benutzer-GPOs auf die Gruppen- oder Benutzerkonten-bezogene Filterung zurückgreift, dann muss man diese Änderung unbedingt kennen!

Die Lösung

Die Lösung des Problem ist eigentlich recht einfach – wenn man die Ursache kennt. Das Computerkonto des Computers, an dem der jeweilige Benutzer arbeitet muss also in die Lage versetzt werden, die GPO zu lesen. Da man nicht immer weiß, wer gerade wo arbeitet und sich das ja auch täglich ändern könnte, bleibt fast nur, den “Domänen-Computern” das Leserecht zu geben. Und das funktioniert über den Reiter “Delegation” bzw. “Delegierung”:

gpo2

Hier findet ihr noch den Blog-Artikel bei Microsoft, der mich zum Problem und dessen Lösung brachte:

https://blogs.technet.microsoft.com/askpfeplat/2016/07/05/who-broke-my-user-gpos/

8 Comments

Hyper-V auf Windows Server 2012 R2 / 2016: VMs mittels Kerberos verschieben

Im Windows Server 2012 R2 und 2016 steckt ja nun schon seit einer Weile die so genannte “Shared Nothing Live Migration”, die es möglich macht, VMs zwischen Hyper-V-Hosts zu verschieben (auch im laufenden Betrieb), ohne, dass die VM auf einem Hyper-V-Cluster laufen muss, entsprechend ist hier auch kein Storage nötig.

Für die Shared Nothing Migration gibt es zwei Protokolle zur Authentifizierung: CredSSP und Kerberos.

CredSSP ist an sich sehr einfach in der Benutzung, bedarf es doch keiner echten Einrichtung. Lediglich den richtigen Radio-Button auswählen, einmal ab- und wieder anmelden und das war’s. Aber die Sache hat einen Haken: Bei CredSSP kann man nur dann eine VM verschieben, wenn man (lokal oder z.B. per RDP) an dem Hyper-V-Host angemeldet ist, von dem man die VM weg-verschieben will. MMC-Remoting mit dem Hyper-V-Manager geht hier nicht! Versucht man es doch, bekommt man folgende Fehlermeldung:

kerberos00

Im Wortlaut: “Failed to establish a connection with host HOSTNAME. The credentials supplied to the package were not recognized (0x8009030D).”

Insbesondere bei Core-Servern, auf denen es keinen Hyper-V-Manager gibt, wird das Verschieben also einigen Administratoren schwer fallen (wenngleich PowerShell eine nutzbare Lösung wäre).

Auch wenn man jetzt einfach im Hyper-V-Manager auf Kerberos umstellt:

kerberos7

..kommt es immer noch zu einem Fehler:

kerberos0

Im Wortlaut: “The Virtual Machine Management Service failed to authenticate the connection for a Virtual Machine migration at the source host: The specified target is unknown or unreachable (0x80090303).”

Was hier fehlt ist die sogenannte “Constrained Delegation”. Diese einzurichten ist an sich nicht kompliziert, bei steigender Host-Anzahl aber etwas aufwändiger (eine einfachere PowerShell-Lösung versuche ich zeitnah nachzuliefern).

Zur Einrichtung benötigt man Schreibrechte auf den Computer-Objekten der Hyper-V-Hosts im Active Directory oder einfacher gleich einen Domain-Admin-Account.

Über die “Active Directory Users and Computers” öffnet man sich nun der Reihe nach die Computerkonten aller Hyper-V-Hosts und führt dort folgende Einstellung durch:

kerberos1kerberos2kerberos3

kerberos4kerberos5

Im Ergebnis muss es auf jedem Host so aussehen:

kerberos6

Jeder Host muss jedem anderen bei den Diensten “cifs” und “Microsoft Virtual System Migration Service” vertrauen. Kerberos alleine genügt.

Danach muss man natürlich die Hyper-V-Hosts auf Kerberos-Migration umstellen (oder dies zumindest noch einmal überprüfen!)

kerberos7

Das war’s dann schon! Jetzt kann man von jedem Client oder Server aus mittels Hyper-V-Manager auf die Hosts zugreifen und eine Verschiebung initiieren. Viel Spaß dabei!

Hinweis: In einem neueren Artikel zeige ich, wie man die Delegierung unkompliziert per PowerShell einrichten kann:

Hyper-V & PowerShell – Kerberos Delegierung für LiveMigration für mehrere Server gegenseitig eintragen

2 Comments

Windows Server NIC-Teaming: Problem mit doppelter MAC beheben

Auf einem Test-Host unter Windows Server 2016 mit Hyper-V ist mir heute folgende Fehlermeldung im Eventlog aufgefallen:

lbfo1

(MAC Conflict: A port on the virtual switch has the same MAC as one of the underlying team members on Team Nic Microsoft Network Adapter Multiplexor Driver) – Source: MsLbfoSysEvtProvider / Event-ID 16945

Wenn man mittels PowerShell nach den MACs schaut bestätigt sich das auch schnell:

Get-NetAdapter | Sort MacAddress

lbfo2

Als Lösung habe ich die MAC des Teams (mittels PowerShell, da es ein Core-Server ist) geändert:

Get-NetAdapter “Name” | Set-NetAdapter –MacAddress 00-00-00-00-00-00

lbfo3

Schreibe einen Kommentar...