O comando na resposta do syneticon-dj não funciona, porque um administrador elevado normal não tem acesso de gravação à chave. Os comentários mencionam que você precisa alterar as permissões. Mas isso envolve muito clique em regedit.exe e não funciona para instalações com script.
Eu uso o seguinte script do 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
primeiro altera as permissões na chave e define o PowerShell como o shell.
Observe que isso pode funcionar apenas em sistemas operacionais em inglês, pois se refere ao grupo 'Administradores'.
AvailableShells
chave, apenas o TrustedInstaller. Não posso alterar as permissões sem me apropriar da chave. Você acha que a posse de uma chave do sistema apresentará algum problema? Aqui estão as ACLs de meu registro: gist.github.com/vcsjones/4dca25f94bfb1cfd5857