Автоматически использовать PowerShell на Server Core
Когда я вхожу в систему для установки Server 2012 Core, каждый раз, когда мне нужно набрать powershell
чтобы получить командную строку PowerShell вместо простого старого cmd.
Предполагая, что я никогда не удаляю функцию Windows PowerShell, как я могу настроить сервер так, чтобы он сразу выводил меня в приглашение PowerShell вместо cmd?
3 ответа
Просто добавьте вашу командную строку 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"), чтобы ваша учетная запись (или группа "Администраторы") могла внести это изменение.
Вот мое решение этого вопроса.
- Я не хотел возиться с изменением разрешений
AvailableShells
дорожка. - Я хотел простую групповую политику, которая могла бы безопасно применяться ко всем системам в домене.
- Определение наличия Server Core через WMI отличается в 2008R2 и 2012, поэтому я не хотел его использовать.
- Я хочу максимально избегать сценариев и просто использовать политики и предпочтения.
Мое решение, как и многие, которые вы найдете в поиске, состоит в том, чтобы изменить 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, установит мой текущий каталог и запустит sconfig в другом окне.
Команда в ответе 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 в качестве оболочки.
Обратите внимание, что это может работать только на английской ОС, так как относится к группе "Администраторы".