在服务器核心上自动使用PowerShell


18

当我本地登录到Server 2012 Core安装时,每次必须键入powershell以进入PowerShell命令行而不是纯cmd时。

假设我永远不会删除PowerShell Windows功能,如何配置服务器使其直接进入PowerShell提示符而不是cmd?

Answers:


8

只需将powershell命令行作为新值添加到“ AvailableShells” regkey,即可将其作为计算机范围的设置:

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

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

编辑:请注意,“ AvailableShells”键的默认注册表权限将不允许更改。您必须事先更改权限(例如,通过“ regedit”手动更改),以允许您的帐户(或“管理员”组)执行此更改。


2
看起来很有希望,但似乎Administrators组没有对该AvailableShells密钥的写访问权,只有TrustedInstaller才具有。没有密钥的所有权,我无法更改权限。您是否认为拥有系统密钥会带来任何问题?这是我的注册表的ACL:gist.github.com/vcsjones/4dca25f94bfb1cfd5857
vcsjones 2013年

好的,我决定对VM进行快照并尝试尝试,它似乎可以正常工作。唯一的另一件事是该值应为90000,而不是9000。如果该值太低,则首先执行cmd。
vcsjones 2013年

@vcsjones,只要让TrustedInstaller保持对密钥的完全控制,就不会出现任何问题。为了安全起见,您可以在完成后将所有权重置为TrustedInstaller。哦,谢谢您对数字的更正-实际上,我在reg add示例中输入了错误的数字。
the-wabbit

2
或通过组策略进行部署,以赢得更多自动化,并避免修改任何权限的需求;)
Ashley

我只是再试一次,不起作用。拒绝访问。-1
彼得·汉道夫

4

所以这是我对这个问题的解决方案。

  • 我不想弄乱更改AvailableShells路径的权限。
  • 我想要一个简单的组策略,可以安全地应用于域中的所有系统。
  • 在2008R2和2012年之间,通过WMI检测是否具有服务器核心是不同的,因此我不想使用它。
  • 我想尽可能避免使用脚本,而只使用策略和首选项。

与在搜索中发现的许多解决方案一样,我的解决方案是将HKLM:SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell值更改为Powershell。我仅在没有explorer.exe的系统上使用项目级定位来修改此值。AFAIK,这是从具有标准桌面的系统中对Server Core系统进行排序的最简单的测试之一。

我使用(powershell.exe -noexit -Command "Set-Location ${Env:USERPROFILE} ;start sconfig ; start runonce.exe /AlternativeShellStartup")的命令行将启动powershell,启动runone任务,设置当前目录,并在另一个Window中启动sconfig。

在服务器核心上设置默认Powershell


2

syneticon-dj答案中的命令不起作用,因为普通的高级管理员没有对该密钥的写权限。注释中提到您需要更改权限。但这涉及到regedit.exe的大量单击,不适用于脚本安装。

我使用以下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

它首先更改密钥的权限,然后将PowerShell设置为外壳。

请注意,这可能仅适用于英文操作系统,因为它指的是“管理员”组。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.