Usar o PowerShell automaticamente no núcleo do servidor

18

Quando logon localmente em uma instalação do Server 2012 Core, toda vez que preciso digitar powershellpara acessar uma linha de comando do PowerShell, em vez de simplesmente ol 'cmd.

Supondo que nunca removerei o Recurso do Windows do PowerShell, como posso configurar o servidor para me colocar diretamente em um prompt do PowerShell em vez de cmd?

vcsjones
fonte

Respostas:

8

Simplesmente adicione sua linha de comando do PowerShell como um novo valor à regkey "AvailableShells" para tê-la como uma configuração em toda a máquina:

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

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

Editar: observe que as permissões de registro padrão para a chave "AvailableShells" não permitirão a alteração. Você precisará alterar as permissões antecipadamente (por exemplo, manualmente através de "regedit") para permitir que sua conta (ou o grupo "Administradores") realize essa alteração.

o wabbit
fonte
2
Isso parece promissor, mas não parece que o grupo Administradores tenha acesso de gravação a essa AvailableShellschave, apenas o TrustedInstaller. Não posso alterar as permissões sem me apropriar da chave. Você acha que a posse de uma chave do sistema apresentará algum problema? Aqui estão as ACLs de meu registro: gist.github.com/vcsjones/4dca25f94bfb1cfd5857
vcsjones
OK, decidi capturar a VM e tentar assim mesmo, parece funcionar. A única outra coisa é que o valor deve ser 90000, e não 9000. Se o valor for muito baixo, o cmd entra primeiro.
Vcsjones 23/05
@vcsjones, não deve apresentar problemas, desde que você deixe o TrustedInstaller manter o FullControl sobre a chave. Para garantir a segurança, você pode redefinir a propriedade novamente para TrustedInstaller após concluir. Ah, e obrigado pela correção do número - na verdade, eu o digitei errado no meu reg addexemplo.
the-wabbit 23/05
2
Ou implantar isso através de uma política de grupo para maior vitória de automação e contornar a necessidade de modificar as permissões;)
Ashley
Eu apenas tentei isso de novo, não funciona. Acesso negado. -1
Peter Hahndorf
4

Então, aqui está a minha solução para esta pergunta.

  • Eu não queria mexer com a alteração das permissões do AvailableShellscaminho.
  • Eu queria uma Diretiva de Grupo simples que pudesse ser aplicada com segurança a todos os sistemas no domínio.
  • Detectar se você possui o Server Core via WMI é diferente entre 2008R2 e 2012, então eu não queria usá-lo.
  • Quero evitar scripts, tanto quanto possível, e apenas usar políticas e preferências.

Minha solução, como muitas que você encontrará em uma pesquisa, é alterar o HKLM:SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shellvalor para Powershell. Eu usei a segmentação em nível de item para modificar esse valor apenas em sistemas sem o explorer.exe. AFAIK, este é um dos testes mais simples para classificar os sistemas Server Core dos Sistemas com uma área de trabalho padrão.

A linha de comando que eu uso ( powershell.exe -noexit -Command "Set-Location ${Env:USERPROFILE} ;start sconfig ; start runonce.exe /AlternativeShellStartup") inicia o PowerShell, dispara as tarefas runone, define meu diretório atual e inicia o sconfig em outra janela.

Definir PowerShell padrão no núcleo do servidor

Zoredache
fonte
2

O comando na resposta do syneticon-dj não funciona, porque um administrador elevado normal não tem acesso de gravação à chave. Os comentários mencionam que você precisa alterar as permissões. Mas isso envolve muito clique em regedit.exe e não funciona para instalações com script.

Eu uso o seguinte script do 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

primeiro altera as permissões na chave e define o PowerShell como o shell.

Observe que isso pode funcionar apenas em sistemas operacionais em inglês, pois se refere ao grupo 'Administradores'.

Peter Hahndorf
fonte