Автоматично використовувати PowerShell на серверній ядрі


18

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

Якщо припустити, що я ніколи не видаляю функцію Windows PowerShell, як я можу налаштувати сервер так, щоб він просто перейшов мене в запит PowerShell замість cmd?

Відповіді:


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"), щоб дозволити вашому акаунту (або групі "Адміністратори") виконати цю зміну.


2
Це виглядає багатообіцяюче, але не здається, що група адміністраторів має доступ до запису до цього AvailableShellsключа, це робить лише TrustedInstaller. Я не можу змінити дозволи, не отримавши право власності на ключ. Як ви думаєте, чи матиме власник на системний ключ будь-які проблеми? Ось ACL мого реєстру: gist.github.com/vcsjones/4dca25f94bfb1cfd5857
vcsjones

Гаразд, я вирішив зробити знімок VM і все одно спробувати. Єдине інше - це значення повинно бути 90000, а не 9000. Якщо значення занадто низьке, то спочатку починається cmd.
vcsjones

@vcsjones він не повинен створювати жодних проблем, якщо ви дозволите TrustedInstaller утримувати FullControl над ключем. Щоб бути в безпеці, ви можете просто відновити право власності на TrustedInstaller, коли закінчите. О, і дякую за виправлення числа - я дійсно неправильно ввів його в своєму reg addприкладі.
the wabbit

2
Або розгорніть це за допомогою групової політики для додаткової виграшної автоматизації та обходу необхідності змінювати будь-які дозволи;)
Ешлі,

Я просто спробував це ще раз, не виходить. У доступі відмовлено. -1
Пітер Гандорф

4

Тож ось моє рішення цього питання.

  • Я не хотів возитися зі зміною дозволів AvailableShellsшляху.
  • Я хотів просту групову політику, яку можна було б безпечно застосувати до всіх систем домену.
  • Визначення наявності у вас сердечного ядра через WMI відрізняється між 2008R2 та 2012 роком, тому я не хотів цим користуватися.
  • Я хочу максимально уникати сценаріїв і просто використовувати політику та налаштування.

Моє рішення, як і багато, що ви знайдете в пошуку, - змінити HKLM:SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shellзначення на Powershell. Я використовував націлювання на рівень елементів, щоб змінити це значення лише в системах без Explor.exe. AFAIK, це один з найпростіших тестів для сортування систем Server Core із систем із звичайним робочим столом.

Командний рядок, який я використовую ( powershell.exe -noexit -Command "Set-Location ${Env:USERPROFILE} ;start sconfig ; start runonce.exe /AlternativeShellStartup"), запустить shellhell, зніме завдання runone, встановить мій поточний каталог та запустить 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 як оболонку.

Зауважте, це може працювати лише в англійській ОС, оскільки це стосується групи "Адміністратори".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.