Windows PowerShell: Installation von NuGet schlägt fehl

Wenn man auf einem Windows-Server – in meinem Fall ein Windows Server 2016 – den NuGet Paketmanager nachinstallieren will – z.B. um die Azure PowerShell-Module zu installieren – schlägt dies seit geraumer Zeit (Seit April 2020) fehl:

Die Fehlermeldung von Install-PackageProvider -Name NuGet lautet:

Install-PackageProvider : Für die angegebenen Suchkriterien für Anbieter „NuGet“ wurde keine Übereinstimmung gefunden.
Der Paketanbieter erfordert das PackageManagement- und Provider-Tag. Überprüfen Sie, ob das angegebene Paket über die
Tags verfügt.

Der Grund ist vermutlich ein „Upgrade“ des Azureedges, der den Lookup-Provider stellt (onegetcdn.azureedge.net/providers). Der Endpunkt lässt seit etwa April 2020 keine TLS1.0 und TLS1.1 Verbindungen mehr zu und wurde auf „TLS1.2 min“ konfiguriert. Die PowerShell (< 14393.3474) spricht per Default aber nur TLS1.1.

Lösung

Mit folgendem Befehl stellt man die PowerShell auf TLS 1.2 um:

[Net.ServicePointManager]::SecurityProtocol=[Net.SecurityProtocolType]::Tls12

Danach funktioniert die Installation:

Quelle: https://www.zueschen.eu/

Hyper-V: Nested Virtualization aktivieren

Will man auf einem Hyper-V-Host ein VM mit aktivierter Virtualisierung – z.B. einen Server mit der Hyper-V-Rolle – installieren, muss man die VM erstellen und dann das Nested Virtualization-Feature für die VM mit folgenden Befehlen per Powershell aktivieren:

get-vm VMNAME | Set-VMProcessor -ExposeVirtualizationExtensions $true
get-vm VMNAME | Set-VMNetworkAdapter -MacAddressSpoofing On

Hier als Beispiel mit der VM mit dem dem Namen 55_HyperV:

get-vm 55_HyperV | Set-VMProcessor -ExposeVirtualizationExtensions $true
get-vm 55_HyperV | Set-VMNetworkAdapter -MacAddressSpoofing On

Danach lässt sich – in dem Fall HyperV – der Hypervisor installieren/aktivieren

Powershell: Base64-Decodierung und Encodierung

Man muss ja öfters mal Base64-codierte Strings decodieren oder eben Zeichenketten in Base64-Strings encodieren.

Dazu kann man unter Windows entweder Online-Dienste wie base64decode.org verwenden oder relativ einfach die Powershell 🙂

Decodieren

$string = "VGVzdC1TdHJpbmc="
[Text.Encoding]::Utf8.GetString([Convert]::FromBase64String($string))

Codieren

$string = "Test-String"
[Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($string))

Ziemlich easy 🙂

Windows: NTP-Server abfragen

Ich wollte auf einem Windows-System testen ob ich einen NTP-Server erreiche und ob mir dieser Server auch eine Zeit zurückgibt.

Das kann man ganz einfach per w32tm-Befehl testen:

w32tm.exe /stripchart /computer:ip.addresse.oder.dnsname /dataonly /samples:1

Also z.B. mit IP

w32tm.exe /stripchart /computer:172.17.9.78 /dataonly /samples:1

oder auch per DNS-Namen:

w32tm.exe /stripchart /computer:ptbtime1.ptb.de /dataonly /samples:1

Active Directory: Wert löschen per Powershell

Ich hatte bei einer Migration eines ActiveDirectorys das Problem das bei vielen Usern noch Login-Scripte definiert waren die ich aber nicht mehr verwenden wollte.

Will man von vielen Usern einen Wert im Active Directory löschen geht das einfach über die Powershell 🙂

Hier ein Beispiel um bei allen Usern im AD den ScriptPath zu löschen:

Get-ADUser -filter * | set-aduser -Clear scriptPath

Das kann natürlich über die Filter noch eingeschränkt werden und funktioniert natürlich auch für andere Parameter 🙂

Hier noch ein Beispiel für das Löschen des Profil-Pfads für alle User eine OU:

Get-ADUser -Filter * -SearchBase „OU=TestUser,DC=domain,DC=local“ | Set-ADUser -Clear profilepath

Active Directory: FSMO-Rollen per Powershell übertragen

Um die fünf FSMO-Rollen in einer Domäne von einem auf einen anderen Domain Controller zu verschieben hab ich früher immer das ntdsutil verwendet – aber das geht natürlich auch mit der Powershell 🙂

Zuerst zeigen wir uns am besten alle Rolleninhaber an. Dazu die AD-Powershell am Domain Controller öffnen oder die Module mit

Import-Module ActiveDirectory

importieren.

Die Rollen des Forest:

Get-ADForest domain.local | ft DomainNamingMaster, SchemaMaster

Und die Rollen der Domäne

Get-ADDomain domain.local | ft InfrastructureMaster, PDCEmulator, RIDMaster

Um eine Rolle zu verschieben muss man jetzt nur das Move-ADDirectoryServerOperationMasterRole Module im folgenden Schema verwenden:

Move-ADDirectoryServerOperationMasterRole -Identity „Ziel-DC“ Role

Also z. B. :

Move-ADDirectoryServerOperationMasterRole -Identity „dc-02“ PDCEmulator

Tipp: Man kann die Rollen auch super mit 0 – 4 abkürzen:

0 : PDCEmulator
1 : RIDMaster
2 : InfrastructureMaster
3 : SchemaMaster
4 : DomainNamingMaster

So kann man nämlich den Befehl schön verkürzen 🙂

Es reicht so z.B. ein

Move-ADDirectoryServerOperationMasterRole -Identity „dc-02“ –OperationMasterRole 0,1

Wenn mann z.B. alle Rollen auf einmal verschieben will lohnt sich das abkürzen richtig – so reicht ein

Move-ADDirectoryServerOperationMasterRole -Identity „dc-02“ –OperationMasterRole 0,1,2,3,4

statt

Move-ADDirectoryServerOperationMasterRole -Identity „dc-02“ –OperationMasterRole PDCEmulator, RIDMaster, InfrastructureMaster, SchemaMaster, DomainNamingMaster

Danach nochmal überprüfen:

Get-ADForest domain.local | ft DomainNamingMaster, SchemaMaster

und

Get-ADDomain domain.local | ft InfrastructureMaster, PDCEmulator, RIDMaster

Falls eine der Rollen nicht verschoben werden kann – weil z.B. der alte Inhaber der Rolle nicht mehr erreichbar ist – kann mit dem Parameter -force die Übertragung erzwungen werden (wie unter ntdsutil mit seize).

Move-ADDirectoryServerOperationMasterRole -Identity “dc-02” –OperationMasterRole, DomainNamingMaster,PDCEmulator,RIDMaster,SchemaMaster,InfrastructureMaster –Force

Selbstverständlich sollte der alte Domain Controller von dem wir die Rollen mit -Force verschoben haben nie wieder angeschaltet werden!

Active Directory: Zeitsynchronisation für die Domain konfigurieren

Die Zeit ist in einem Active Directory extrem wichtig – so kann man sich z.B. (bei Default-Einstellungen) mit einer Zeitdifferenz mehr als 5 Minuten zwischen Domain Controller und Client nicht authentifizieren und deshalb nicht einloggen.

Der Windows Zeitdienst (W32Time) ist dafür zuständig das überall in der Domäne die gleiche Zeit ist. Alle Clients syncen mit „ihrem“ Domain Controller und die Domain Controller syncen mit dem DC der die PDC-Rolle inne hat.

Damit überall die gleiche – und am besten auch noch die richtige 😉 – Zeit ist konfiguriert man an dem DC mit der PDC-Rolle den Windows Zeitdienst folgendermaßen per Powershell:

w32tm /config /manualpeerlist:timeserver /syncfromflags:manual /reliable:yes /update

also z.B. :

w32tm /config /manualpeerlist:0.de.pool.ntp.org /syncfromflags:manual /reliable:yes /update

oder mit mehreren NTP-Servern:

w32tm /config /syncfromflags:manual /manualpeerlist:“0.de.pool.ntp.org 1.de.pool.ntp.org“ /reliable:yes /update

Danach den Windows Zeitdienst durchstarten

Restart-Service W32Time

und noch einmal syncen lassen

w32tm /resync

Mit

w32tm /query /status

kann überprüft werden ob der Sync funktioniert – fertig 🙂

Alle anderen DCs und/oder Clients der Domäne sollten sich jetzt mit dem PDC synchronisieren.

Ebenfalls mit

w32tm /query /status

kann überprüft werden ob das auch klappt.

Nach ein paar Minuten sollte auf allen Domain-Membern die gleiche Zeit sein 🙂

Quelle: blogs.technet.microsoft.com

PAC-Dateien mit IIS veröffentlichen

Ich konfiguriere in letzter Zeit öfters den Proxy der Clients mit einer PAC-Datei – und wollte hier mal eine kurze Anleitung erstellen 🙂

Ich erstelle meistens auf einem IIS – z.B. auf dem das Intranet läuft – eine eigene Webseite von der die PAC-Datei geladen wird – die bei mir meistens auf http://pac/proxy.pac hört – und verteile den Proxy-Eintrag dann per Gruppenrichtlinie.

So sieht das dann am Schluss beim Client aus:

1) PAC-Datei erstellen

Zuerst erstellen wir eine proxy.pac – hier eine als Beispiel der alles bis auf Webseiten aus dem eigenen Netz zu einem Proxy geschickt wird:

 
function FindProxyForURL(url, host) {
                
      if (isInNet(host, "10.10.10.0", "255.255.255.0")) {return "DIRECT";}
        	     
      return "PROXY 10.10.12.4:8080";
}

Hier gibts noch ein paar Infos für die Konfig einer PAC-Datei: https://findproxyforurl.com/example-pac-file/

2) IIS Einstellungen

Wir erstellen auf dem Server auf dem der IIS läuft den Ordner C:\inetpub\pac und kopieren die erstellte proxy.pac dort rein

Jetzt öffnen wir den Internetinformationsdienste (IIS)-Manager und erstellen eine neue Website:

Die folgende Konfiguration wäre für den Aufruf von http://pac/proxy.pac – will man mit einem FQDN arbeiten (z.B. http://pac.test.local/proxy.pac) muss man den Eintrag unter Hostname entsprechend anpassen:

Jetzt muss noch der MIME-Type für die PAC-Datei erstellt werden:

Jetzt auf Hinzufügen gehen:

Hier die Dateierweiterung .pac und den MIME-Typ application/x-ns-proxy-autoconfig angeben

3) DNS-Eintrag

Jetzt muss noch ein DNS-Eintrag erstellt werden der auf unseren IIS-Server zeigt – entweder einen Host- oder einen CNAME-Eintrag:

Jetzt sollte wenn man die URL http://pac/proxy.pac im Browser eingibt die Datei als Download angeboten werden:

4) Gruppenrichtlinie

Man muss jetzt eigentlich nur noch eine Richtlinie erstellen in der unter „Script für automatischer Konfiguration verwenden“ unser Script angegeben und „Einstellungen automatisch erkennen“ deaktiviert wird.

Falls noch der Internet Explorer verwendet wird muss noch unter Richtlinien – Administrative Vorlagen – Windows-Komponenten/Internet Explo-rer/Kompatibilitätsansicht die Kompatibilität für Intranet Seiten deaktiviert werden:

Jetzt nur noch auf die User anwenden und schon sind wir fertig 🙂

Quelle: marckean.com

Exchange: Mailbox erstellen für alle User einer Organisationseinheit

Wenn man mal für alle User einer Organisationseinheit eine Exchange-Mailbox erstellen will geht das super einfach per Powershell:

Get-User -OrganizationalUnit „OU=Finanzverwaltung,OU=Abteilungen,DC=test,DC=local“ | Enable-Mailbox

Kurze Erklärung: Mit Get-User zeigen wir uns alle Benutzer in der angegebenen OU an (muss im LDAP-Pfad-Format bzw. als DistinguishedName angegeben sein) und dann pipen wir es in ein Enable-Mailbox wo eben die Mailbox erstellt wird. fertig 🙂