Utiliser automatiquement PowerShell sur Server Core

18

Lorsque je me connecte localement à une installation Server 2012 Core, chaque fois que je dois taper powershellpour accéder à une ligne de commande PowerShell au lieu de plain ol 'cmd.

En supposant que je ne supprimerai jamais la fonctionnalité Windows PowerShell, comment puis-je configurer le serveur pour qu'il me mette directement dans une invite PowerShell au lieu de cmd?

vcsjones
la source

Réponses:

8

Ajoutez simplement votre ligne de commande powershell en tant que nouvelle valeur à la clé de Registre "AvailableShells" pour l'avoir comme paramètre à l'échelle de la machine:

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

Référence: http://andrewmorgan.ie/2012/03/30/changing-the-default-shell-of-windows-server-8-core/

Modifier: notez que les autorisations de registre par défaut pour la clé "AvailableShells" ne permettront pas la modification. Vous devrez modifier les autorisations au préalable (par exemple manuellement via "regedit") pour permettre à votre compte (ou au groupe "Administrateurs") d'effectuer cette modification.

le-wabbit
la source
2
Cela semble prometteur, mais il ne semble pas que le groupe Administrateurs ait un accès en écriture à cette AvailableShellsclé, seul TrustedInstaller le fait. Je ne peux pas modifier les autorisations sans prendre possession de la clé. Pensez-vous que l'appropriation d'une clé système posera des problèmes? Voici les ACL de mon registre: gist.github.com/vcsjones/4dca25f94bfb1cfd5857
vcsjones
OK, eh bien j'ai décidé de prendre un instantané de la machine virtuelle et d'essayer quand même, cela semble fonctionner. La seule autre chose est que la valeur doit être 90000, pas 9000. Si la valeur est trop faible, alors cmd entre en premier.
vcsjones
@vcsjones, il ne devrait pas poser de problème tant que vous laissez TrustedInstaller garder FullControl sur la clé. Pour être sûr, vous pouvez simplement réinitialiser la propriété à TrustedInstaller après avoir terminé. Oh et merci pour la correction du nombre - en effet je l'ai mal tapé dans mon reg addexemple.
le-wabbit
2
Ou déployez-le via une stratégie de groupe pour gagner en automatisation et contourner la nécessité de modifier les autorisations;)
Ashley
Je viens de réessayer, ça ne marche pas. Accès refusé. -1
Peter Hahndorf
4

Voici donc ma solution à cette question.

  • Je ne voulais pas jouer avec la modification des autorisations du AvailableShellschemin.
  • Je voulais une stratégie de groupe simple qui pourrait être appliquée en toute sécurité à tous les systèmes du domaine.
  • Détecter si vous avez Server Core via WMI est différent entre 2008R2 et 2012, donc je ne voulais pas l'utiliser.
  • Je veux éviter les scripts autant que possible et utiliser simplement des politiques et des préférences.

Ma solution, comme beaucoup d'autres que vous trouverez dans une recherche, consiste à changer la HKLM:SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shellvaleur en Powershell. J'ai utilisé le ciblage au niveau de l'élément pour modifier cette valeur uniquement sur les systèmes sans explorer.exe. AFAIK, c'est l'un des tests les plus simples pour trier les systèmes Server Core des systèmes avec un bureau standard.

La ligne de commande que j'utilise ( powershell.exe -noexit -Command "Set-Location ${Env:USERPROFILE} ;start sconfig ; start runonce.exe /AlternativeShellStartup") démarrera powershell, déclenchera les tâches runone, définira mon répertoire actuel et démarrera sconfig dans une autre fenêtre.

Définir le PowerShell par défaut sur Server Core

Zoredache
la source
2

La commande dans la réponse de syneticon-dj ne fonctionne pas, car un administrateur élevé normal n'a pas accès en écriture à la clé. Les commentaires mentionnent que vous devez modifier les autorisations. Mais cela implique de cliquer beaucoup dans regedit.exe et ne fonctionne pas pour les installations par script.

J'utilise le script PowerShell suivant:

 $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

il modifie d'abord les autorisations sur la clé, puis définit PowerShell comme shell.

Notez que cela ne peut fonctionner que sur un système d'exploitation anglais, car il fait référence au groupe «Administrateurs».

Peter Hahndorf
la source