Automatycznie używaj PowerShell na Server Core

18

Kiedy lokalnie loguję się do instalacji Server 2012 Core, za każdym razem muszę pisać, powershellaby przejść do wiersza polecenia programu PowerShell zamiast zwykłego old cmd.

Zakładając, że nigdy nie usunę funkcji Windows PowerShell, jak mogę skonfigurować serwer tak, aby wyświetlał mnie bezpośrednio w wierszu polecenia programu PowerShell zamiast cmd?

vcsjones
źródło

Odpowiedzi:

8

Po prostu dodaj wiersz poleceń programu PowerShell jako nową wartość do regku „AvailableShells”, aby ustawić go jako ustawienie dla całego komputera:

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

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

Edycja: pamiętaj, że domyślne uprawnienia rejestru dla klucza „AvailableShells” nie zezwalają na zmianę. Będziesz musiał wcześniej zmienić uprawnienia (np. Ręcznie poprzez „regedit”), aby umożliwić swoje konto (lub grupę „Administratorzy”) na dokonanie tej zmiany.

the-wabbit
źródło
2
To wygląda obiecująco, ale nie wygląda na to, że grupa Administratorzy ma dostęp do zapisu do tego AvailableShellsklucza, tylko TrustedInstaller. Nie mogę zmienić uprawnień bez przejęcia własności klucza. Czy uważasz, że przejęcie na własność klucza systemowego spowoduje jakieś problemy? Oto listy ACL mojego rejestru: gist.github.com/vcsjones/4dca25f94bfb1cfd5857
vcsjones
OK, więc postanowiłem zrobić migawkę maszyny wirtualnej i spróbować mimo wszystko, wydaje się, że działa. Jedyną inną rzeczą jest wartość 90000, a nie 9000. Jeśli wartość jest zbyt niska, najpierw uruchamia się cmd.
vcsjones
@vcsjones nie powinno powodować żadnych problemów, o ile pozwolisz TrustedInstaller zachować FullControl nad kluczem. Aby być bezpiecznym, możesz po prostu zresetować własność z powrotem do TrustedInstaller po zakończeniu. Aha i dziękuję za korektę numeru - w rzeczy samej popełniłem błąd w moim reg addprzykładzie.
the-wabbit
2
Lub zastosuj to za pomocą Zasad Grupy, aby zwiększyć wygraną automatyzacji i ominąć potrzebę modyfikacji jakichkolwiek uprawnień;)
Ashley
Właśnie spróbowałem tego ponownie, nie działa. Brak dostępu. -1
Peter Hahndorf
4

Oto moje rozwiązanie tego pytania.

  • Nie chciałem zadzierać ze zmianą uprawnień AvailableShellsścieżki.
  • Chciałem prostych zasad grupy, które można bezpiecznie zastosować do wszystkich systemów w domenie.
  • Wykrywanie, czy masz Server Core przez WMI, różni się między 2008R2 a 2012, więc nie chciałem tego używać.
  • Chcę w jak największym stopniu unikać skryptów i po prostu korzystać z zasad i preferencji.

Moim rozwiązaniem, jak wielu, które znajdziesz podczas wyszukiwania, jest zmiana HKLM:SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shellwartości na PowerShell. Używałem kierowania na poziomie przedmiotu, aby modyfikować tę wartość tylko w systemach bez explorer.exe. AFAIK, jest to jeden z najprostszych testów do sortowania systemów Server Core od Systemów ze standardowym pulpitem.

Wiersz poleceń, którego używam ( powershell.exe -noexit -Command "Set-Location ${Env:USERPROFILE} ;start sconfig ; start runonce.exe /AlternativeShellStartup"), uruchamia PowerShell, odpala zadania runone, ustawia mój bieżący katalog i uruchamia sconfig w innym oknie.

Ustaw domyślną wersję PowerShell na Server Core

Zoredache
źródło
2

Polecenie w odpowiedzi syneticon-dj nie działa, ponieważ normalny administrator z podwyższonym poziomem uprawnień nie ma dostępu do zapisu do klucza. Komentarze wspominają, że musisz zmienić uprawnienia. Ale wymaga to wiele kliknięć w regedit.exe i nie działa w przypadku instalacji skryptowych.

Używam następującego skryptu PowerShell:

 $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

najpierw zmienia uprawnienia do klucza, a następnie ustawia PowerShell jako powłokę.

Zauważ, że może to działać tylko w angielskim systemie operacyjnym, ponieważ odnosi się do grupy „Administratorzy”.

Peter Hahndorf
źródło