PowerShell auf Server Core automatisch verwenden

18

Wenn ich mich lokal bei einer Server 2012 Core-Installation anmelde, muss ich jedes Mal etwas eingeben powershell, um zu einer PowerShell-Befehlszeile zu gelangen, anstatt einfach nur "cmd".

Angenommen, ich werde die PowerShell-Windows-Funktion niemals entfernen. Wie kann ich den Server so konfigurieren, dass ich direkt zu einer PowerShell-Eingabeaufforderung anstelle von cmd komme?

vcsjones
quelle

Antworten:

8

Fügen Sie einfach Ihre Powershell-Befehlszeile als neuen Wert zum "AvailableShells" -Regkey hinzu, um sie als maschinenweite Einstellung zu erhalten:

reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\AlternateShells\AvailableShells" /v "90000" /t REG_SZ /d "%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\Powershell.exe"

Referenz: http://andrewmorgan.ie/2012/03/30/changing-the-default-shell-of-windows-server-8-core/

Bearbeiten: Beachten Sie, dass die Standardregistrierungsberechtigungen für den Schlüssel "AvailableShells" die Änderung nicht zulassen. Sie müssen die Berechtigungen zuvor ändern (z. B. manuell über "regedit"), damit Ihr Konto (oder die Gruppe "Administratoren") diese Änderung vornehmen kann.

das-wabbit
quelle
2
Das sieht vielversprechend aus, aber anscheinend hat die Gruppe Administratoren keinen Schreibzugriff auf diesen AvailableShellsSchlüssel, sondern nur TrustedInstaller. Ich kann Berechtigungen nicht ändern, ohne den Schlüssel zu übernehmen. Denken Sie, dass die Inhaberschaft eines Systemschlüssels Probleme aufwirft? Hier sind die ACLs meiner Registrierung: gist.github.com/vcsjones/4dca25f94bfb1cfd5857
vcsjones
OK, nun, ich habe beschlossen, einen Snapshot der VM zu erstellen und trotzdem zu versuchen, es scheint zu funktionieren. Das einzige andere ist, dass der Wert 90000 und nicht 9000 sein sollte. Wenn der Wert zu niedrig ist, tritt cmd zuerst ein.
vcsjones
@vcsjones sollte es keine Probleme geben, solange TrustedInstaller FullControl über den Schlüssel lässt. Um auf der sicheren Seite zu sein, können Sie den Besitz einfach auf TrustedInstaller zurücksetzen, nachdem Sie fertig sind. Oh und danke für die Korrektur der Zahl - tatsächlich habe ich es in meinem reg addBeispiel falsch geschrieben .
the-wabbit
2
Oder stellen Sie dies über eine Gruppenrichtlinie für zusätzliche Automatisierung bereit und umgehen Sie die Notwendigkeit, Berechtigungen zu ändern;)
Ashley
Ich habe es gerade noch einmal versucht, funktioniert nicht. Zugriff abgelehnt. -1
Peter Hahndorf
4

Hier ist meine Lösung für diese Frage.

  • Ich wollte nicht damit herumspielen, die Berechtigungen des AvailableShellsPfades zu ändern .
  • Ich wollte eine einfache Gruppenrichtlinie, die sicher auf alle Systeme in der Domäne angewendet werden kann.
  • Das Erkennen, ob Sie über WMI über Server Core verfügen, unterscheidet sich zwischen 2008R2 und 2012, daher wollte ich das nicht verwenden.
  • Ich möchte Skripte so weit wie möglich vermeiden und nur Richtlinien und Einstellungen verwenden.

Meine Lösung, wie viele, die Sie bei einer Suche finden, besteht darin, den HKLM:SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\ShellWert in Powershell zu ändern . Ich habe das Targeting auf Elementebene verwendet, um diesen Wert nur auf Systemen ohne explorer.exe zu ändern. AFAIK, dies ist einer der einfachsten Tests, um Server Core-Systeme von Systemen mit einem Standard-Desktop zu sortieren.

Die Befehlszeile, die ich benutze ( powershell.exe -noexit -Command "Set-Location ${Env:USERPROFILE} ;start sconfig ; start runonce.exe /AlternativeShellStartup"), startet Powershell, startet die Runone-Tasks, legt mein aktuelles Verzeichnis fest und startet sconfig in einem anderen Fenster.

Legen Sie die Standard-PowerShell auf dem Server Core fest

Zoredache
quelle
2

Der Befehl in der Antwort von syneticon-dj funktioniert nicht, da ein normaler Administrator mit erhöhten Rechten keinen Schreibzugriff auf den Schlüssel hat. In den Kommentaren wird erwähnt, dass Sie die Berechtigungen ändern müssen. Dies ist jedoch mit vielen Mausklicks in regedit.exe verbunden und funktioniert bei skriptbasierten Installationen nicht.

Ich verwende das folgende PowerShell-Skript:

 $definition = @"
 using System;
 using System.Runtime.InteropServices;
 namespace Win32Api
 {
    public class NtDll
    {
       [DllImport("ntdll.dll", EntryPoint="RtlAdjustPrivilege")]
       public static extern int RtlAdjustPrivilege(ulong Privilege, bool Enable, bool CurrentThread, ref bool Enabled);
    }
 }
 "@

 Add-Type -TypeDefinition $definition -PassThru  | out-null

 $bEnabled = $false

 # Enable SeTakeOwnershipPrivilege
 $res = [Win32Api.NtDll]::RtlAdjustPrivilege(9, $true, $false, [ref]$bEnabled)

 $key = [Microsoft.Win32.Registry]::LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\AlternateShells\AvailableShells", [Microsoft.Win32.RegistryKeyPermissionCheck]::ReadWriteSubTree,[System.Security.AccessControl.RegistryRights]::takeownership)
 $acl = $key.GetAccessControl()
 $acl.SetOwner([System.Security.Principal.NTAccount]"Administrators")
 $key.SetAccessControl($acl)

 $rule = New-Object System.Security.AccessControl.RegistryAccessRule ("BUILTIN\Administrators","FullControl","Allow")
 $acl.SetAccessRule($rule)
 $key.SetAccessControl($acl)

 New-ItemProperty -path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\AlternateShells\AvailableShells" -name 90000 -value "%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\Powershell.exe" -propertyType String

Es ändert zuerst die Berechtigungen für den Schlüssel und legt dann PowerShell als Shell fest.

Beachten Sie, dass dies möglicherweise nur auf einem englischen Betriebssystem funktioniert, da es sich auf die Gruppe "Administratoren" bezieht.

Peter Hahndorf
quelle