Автоматически использовать PowerShell на Server Core

18

Когда я локально захожу в установку Server 2012 Core, каждый раз , когда мне приходится набирать текст, powershellчтобы перейти в командную строку PowerShell, а не просто в cmd.

Предполагая, что я никогда не удаляю функцию Windows PowerShell, как я могу настроить сервер так, чтобы он сразу выводил меня в приглашение PowerShell вместо cmd?

vcsjones
источник

Ответы:

8

Просто добавьте вашу командную строку 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»), чтобы ваша учетная запись (или группа «Администраторы») могла внести это изменение.

заместитель Wabbit
источник
2
Это выглядит многообещающе, но не похоже, что группа «Администраторы» имеет доступ на запись к этому AvailableShellsключу, только TrustedInstaller. Я не могу изменить разрешения, не получив права собственности на ключ. Считаете ли вы, что владение системным ключом создаст какие-либо проблемы? Вот ACL моего реестра: gist.github.com/vcsjones/4dca25f94bfb1cfd5857
vcsjones
Хорошо, я решил сделать снимок виртуальной машины и все равно попробовать, похоже, он работает. Единственное, что должно быть, это значение должно быть 90000, а не 9000. Если значение слишком низкое, сначала запускается cmd.
vcsjones
@vcsjones - это не должно вызывать проблем, если вы позволите TrustedInstaller сохранять FullControl над ключом. Чтобы быть в безопасности, вы можете просто вернуть владение обратно в TrustedInstaller после того, как закончите. О, и спасибо за исправление числа - действительно, я опечатал это в своем reg addпримере.
the-wabbit
2
Или разверните это с помощью групповой политики для дополнительной победы автоматизации и обойти необходимость изменения любых разрешений;)
Эшли
Я просто попробовал это снова, не работает. Доступ запрещен. -1
Питер Хандорф
4

Вот мое решение этого вопроса.

  • Я не хотел возиться с изменением разрешений 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 в другом окне.

Установить PowerShell по умолчанию на ядре сервера

Zoredache
источник
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 в качестве оболочки.

Обратите внимание, что это может работать только на английской ОС, так как относится к группе «Администраторы».

Питер Хандорф
источник