Usa automaticamente PowerShell su Server Core


18

Quando accedo localmente a un'installazione Server 2012 Core, ogni volta che devo digitare powershellper accedere a una riga di comando di PowerShell invece di semplice vecchio cmd.

Supponendo che non rimuoverò mai la funzionalità di Windows di PowerShell, come posso configurare il server per farmi passare direttamente in un prompt di PowerShell invece di cmd?

Risposte:


8

Aggiungi semplicemente la tua riga di comando PowerShell come nuovo valore alla regkey "AvailableShells" per averlo come impostazione a livello di macchina:

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

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

Modifica: notare che le autorizzazioni di registro predefinite per la chiave "AvailableShells" non consentiranno la modifica. Dovrai prima modificare le autorizzazioni (ad es. Manualmente tramite "regedit") per consentire al tuo account (o al gruppo "Amministratori") di eseguire questa modifica.


2
Sembra promettente, ma non sembra che il gruppo Administrators abbia accesso in scrittura a quella AvailableShellschiave, solo TrustedInstaller. Non posso modificare le autorizzazioni senza assumere la proprietà della chiave. Pensi che assumere la proprietà di una chiave di sistema presenterà dei problemi? Ecco gli ACL del mio registro: gist.github.com/vcsjones/4dca25f94bfb1cfd5857
vcsjones

OK, ho deciso di eseguire l'istantanea della VM e provare comunque, sembra funzionare. L'unica altra cosa è che il valore dovrebbe essere 90000, non 9000. Se il valore è troppo basso, cmd prende il via per primo.
vcsjones,

@vcsjones non dovrebbe presentare alcun problema finché si lascia che TrustedInstaller mantenga FullControl sulla chiave. Per essere al sicuro, puoi semplicemente reimpostare la proprietà su TrustedInstaller al termine. Oh e grazie per la correzione del numero - in effetti l'ho scritto male nel mio reg addesempio.
the-wabbit

2
Oppure distribuiscilo tramite una politica di gruppo per ottenere una maggiore automazione e aggirare la necessità di modificare eventuali autorizzazioni;)
Ashley,

Ho appena provato di nuovo, non funziona. Accesso negato. -1
Peter Hahndorf,

4

Quindi, ecco la mia soluzione a questa domanda.

  • Non volevo scherzare con la modifica delle autorizzazioni del AvailableShellspercorso.
  • Volevo un semplice criterio di gruppo che potesse essere applicato in modo sicuro a tutti i sistemi nel dominio.
  • Rilevare se si dispone di Server Core tramite WMI è diverso tra 2008R2 e 2012, quindi non volevo usarlo.
  • Voglio evitare gli script il più possibile e usare solo politiche e preferenze.

La mia soluzione come molte di quelle che troverai in una ricerca è quella di cambiare il HKLM:SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shellvalore in Powershell. Ho usato il targeting a livello di articolo per modificare questo valore solo su sistemi senza explorer.exe. AFAIK, questo è uno dei test più semplici per ordinare i sistemi Server Core dai sistemi con un desktop standard.

La riga di comando che uso ( powershell.exe -noexit -Command "Set-Location ${Env:USERPROFILE} ;start sconfig ; start runonce.exe /AlternativeShellStartup") avvierà powershell, eseguirà le attività di runone, imposta la mia directory corrente e avvia la sconfig in un'altra finestra.

Imposta Powershell predefinito su Server Core


2

Il comando nella risposta di syneticon-dj non funziona, perché un normale amministratore elevato non ha accesso in scrittura alla chiave. I commenti indicano che è necessario modificare le autorizzazioni. Ma questo comporta un sacco di clic in regedit.exe e non funziona per le installazioni con script.

Uso il seguente script 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

prima cambia le autorizzazioni sulla chiave e quindi imposta PowerShell come shell.

Si noti che questo può funzionare solo su un sistema operativo inglese, poiché fa riferimento al gruppo "Amministratori".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.