当我本地登录到 Server 2012 Core 安装时,每次我必须输入内容powershell
才能进入 PowerShell 命令行,而不是普通的 cmd。
假设我永远不会删除 PowerShell Windows 功能,那么如何配置服务器以直接进入 PowerShell 提示符而不是 cmd?
答案1
只需将您的 powershell 命令行作为新值添加到“AvailableShells”注册表项中,即可将其作为计算机范围的设置:
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
以下是我对这个问题的解决方案。
- 我不想费心去改变
AvailableShells
路径的权限。 - 我想要一个可以安全地应用于域上的所有系统的简单组策略。
- 通过 WMI 检测您是否拥有服务器核心在 2008R2 和 2012 之间是不同的,所以我不想使用它。
- 我希望尽可能避免使用脚本,只使用策略和偏好。
我的解决方案和您在搜索中找到的很多解决方案一样,是将值更改HKLM:SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell
为 Powershell。我使用项目级别定位仅在没有 explorer.exe 的系统上修改此值。据我所知,这是将服务器核心系统与具有标准桌面的系统进行分类的最简单的测试之一。
我使用的命令行(powershell.exe -noexit -Command "Set-Location ${Env:USERPROFILE} ;start sconfig ; start runonce.exe /AlternativeShellStartup"
)将启动 powershell,触发 runone 任务,设置我当前目录,并在另一个窗口中启动 sconfig。
答案3
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 设置为 shell。
请注意,这可能只适用于英语操作系统,因为它指的是“管理员”组。