Команда у відповіді 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 як оболонку.
Зауважте, це може працювати лише в англійській ОС, оскільки це стосується групи "Адміністратори".
AvailableShells
ключа, це робить лише TrustedInstaller. Я не можу змінити дозволи, не отримавши право власності на ключ. Як ви думаєте, чи матиме власник на системний ключ будь-які проблеми? Ось ACL мого реєстру: gist.github.com/vcsjones/4dca25f94bfb1cfd5857