Usar automáticamente PowerShell en Server Core

18

Cuando inicio sesión localmente en una instalación Server 2012 Core, cada vez que tengo que escribir powershellpara acceder a una línea de comando de PowerShell en lugar de un simple cmd.

Suponiendo que nunca eliminaré la característica de Windows de PowerShell, ¿cómo puedo configurar el servidor para que me lleve directamente a un indicador de PowerShell en lugar de cmd?

vcsjones
fuente

Respuestas:

8

Simplemente agregue su línea de comando powershell como un nuevo valor a la clave de acceso "AvailableShells" para tenerla como una configuración de toda la 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"

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

Editar: tenga en cuenta que los permisos de registro predeterminados para la clave "AvailableShells" no permitirán el cambio. Tendrá que cambiar los permisos de antemano (por ejemplo, manualmente a través de "regedit") para permitir que su cuenta (o el grupo "Administradores") realice este cambio.

el wabbit
fuente
2
Parece prometedor, pero no parece que el grupo de Administradores tenga acceso de escritura a esa AvailableShellsclave, solo TrustedInstaller sí. No puedo cambiar los permisos sin tomar posesión de la clave. ¿Crees que tomar posesión de una clave del sistema presentará algún problema? Aquí están las ACL de mi registro: gist.github.com/vcsjones/4dca25f94bfb1cfd5857
vcsjones
OK, bueno, decidí tomar una instantánea de la VM e intentarlo de todos modos, parece funcionar. La única otra cosa es que el valor debe ser 90000, no 9000. Si el valor es demasiado bajo, cmd se activa primero.
vcsjones
@vcsjones no debería presentar ningún problema siempre y cuando permita que TrustedInstaller mantenga FullControl sobre la clave. Para estar seguro, puede restablecer la propiedad a TrustedInstaller una vez que haya terminado. Ah, y gracias por la corrección del número; de hecho, lo he escrito mal en mi reg addejemplo.
the-wabbit
2
O implemente esto a través de una Política de grupo para ganar más automatización y evitar la necesidad de modificar cualquier permiso;)
Ashley
Acabo de intentar esto de nuevo, no funciona. Acceso denegado. -1
Peter Hahndorf
4

Así que aquí está mi solución a esta pregunta.

  • No quería perder el tiempo cambiando los permisos de la AvailableShellsruta.
  • Quería una Política de grupo simple que pudiera aplicarse de manera segura a todos los sistemas del dominio.
  • Detectar si tiene Server Core a través de WMI es diferente entre 2008R2 y 2012, por lo que no quería usar eso.
  • Quiero evitar los scripts tanto como sea posible y solo usar políticas y preferencias.

Mi solución, como muchas que encontrarás en una búsqueda, es cambiar el HKLM:SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shellvalor a Powershell. He utilizado la orientación por nivel de elemento para modificar este valor solo en sistemas sin explorer.exe. AFAIK, esta es una de las pruebas más simples para ordenar los sistemas Server Core de los sistemas con un escritorio estándar.

La línea de comando que uso ( powershell.exe -noexit -Command "Set-Location ${Env:USERPROFILE} ;start sconfig ; start runonce.exe /AlternativeShellStartup") iniciará powershell, disparará las tareas de runone, establecerá mi directorio actual e iniciará sconfig en otra ventana.

Establecer Powershell predeterminado en Server Core

Zoredache
fuente
2

El comando en la respuesta de syneticon-dj no funciona, porque un administrador elevado normal no tiene acceso de escritura a la clave. Los comentarios mencionan que necesita cambiar los permisos. Pero esto implica mucho hacer clic en regedit.exe y no funciona para instalaciones con script.

Yo uso el siguiente script de 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

primero cambia los permisos en la clave y luego establece PowerShell como el shell.

Tenga en cuenta que esto solo puede funcionar en un sistema operativo en inglés, ya que se refiere al grupo 'Administradores'.

Peter Hahndorf
fuente