Secara otomatis Menggunakan PowerShell pada Server Core

18

Ketika saya secara lokal masuk ke instalasi Server 2012 Core, setiap kali saya harus mengetik powershelluntuk mendapatkan ke baris perintah PowerShell alih-alih cmd cm biasa.

Dengan asumsi bahwa saya tidak akan pernah menghapus Fitur PowerShell Windows, bagaimana saya bisa mengkonfigurasi server agar saya langsung masuk ke prompt PowerShell, bukannya cmd?

vcsjones
sumber

Jawaban:

8

Cukup tambahkan baris perintah powershell Anda sebagai nilai baru ke regkey "AvailableShells" untuk menjadikannya sebagai pengaturan di seluruh mesin:

reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\AlternateShells\AvailableShells" /v "90000" /t REG_SZ /d "%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\Powershell.exe"

Referensi: http://andrewmorgan.ie/2012/03/30/changing-the-default-shell-of-windows-server-8-core/

Sunting: perhatikan bahwa izin registri default untuk kunci "AvailableShells" tidak akan mengizinkan perubahan. Anda harus mengubah izin sebelumnya (misalnya secara manual melalui "regedit") untuk memungkinkan akun Anda (atau grup "Administrator") untuk melakukan perubahan ini.

the-wabbit
sumber
2
Itu terlihat menjanjikan, tetapi tampaknya grup Administrators tidak memiliki akses tulis ke AvailableShellskunci itu, hanya TrustedInstaller yang melakukannya. Saya tidak dapat mengubah izin tanpa mengambil kepemilikan kunci. Apakah menurut Anda kepemilikan kunci sistem akan menimbulkan masalah? Berikut ini adalah ACL registri saya: gist.github.com/vcsjones/4dca25f94bfb1cfd5857
vcsjones
OK, well saya memutuskan untuk memotret VM dan coba, sepertinya berhasil. Satu-satunya hal lainnya adalah nilainya harus 90000, bukan 9000. Jika nilainya terlalu rendah, maka cmd melakukan tendangan terlebih dahulu.
vcsjones
@vcsjones seharusnya tidak menimbulkan masalah selama Anda membiarkan TrustedInstaller mempertahankan kendali penuh atas kunci. Agar aman, Anda bisa mengatur ulang kepemilikan kembali ke TrustedInstaller setelah selesai. Oh dan terima kasih atas koreksi nomor - memang saya salah ketik dalam reg addcontoh saya .
the-wabbit
2
Atau gunakan ini melalui Kebijakan Grup untuk otomatisasi tambahan yang menang dan hindari kebutuhan untuk memodifikasi izin apa pun;)
Ashley
Saya hanya mencoba ini lagi, tidak berhasil. Akses ditolak. -1
Peter Hahndorf
4

Jadi, inilah solusi saya untuk pertanyaan ini.

  • Saya tidak ingin dipusingkan dengan mengubah izin AvailableShellsjalan.
  • Saya ingin Kebijakan Grup sederhana yang dapat diterapkan dengan aman ke semua sistem di domain.
  • Mendeteksi jika Anda memiliki Server Core via WMI berbeda antara 2008R2 dan 2012, jadi saya tidak ingin menggunakannya.
  • Saya ingin menghindari skrip sebanyak mungkin dan hanya menggunakan kebijakan dan preferensi.

Solusi saya seperti yang akan Anda temukan dalam pencarian adalah mengubah HKLM:SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shellnilainya menjadi Powershell. Saya telah menggunakan penargetan tingkat item untuk mengubah nilai ini hanya pada sistem tanpa explorer.exe. AFAIK, ini adalah salah satu tes paling sederhana untuk mengurutkan sistem Server Core dari Sistem dengan desktop standar.

Baris perintah yang saya gunakan ( powershell.exe -noexit -Command "Set-Location ${Env:USERPROFILE} ;start sconfig ; start runonce.exe /AlternativeShellStartup") akan memulai PowerShell, menjalankan tugas runone, menetapkan direktori saya saat ini, dan mulai sconfig di Window lain.

Setel Powershell Default pada Server Core

Sakit kepala
sumber
2

Perintah dalam jawaban syneticon-dj tidak bekerja, karena administrator yang ditinggikan normal tidak memiliki akses tulis ke kunci. Komentar menyebutkan bahwa Anda perlu mengubah izin. Tapi ini melibatkan banyak mengklik di regedit.exe dan tidak berfungsi untuk instalasi scripted.

Saya menggunakan skrip PowerShell berikut:

 $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

pertama-tama mengubah izin pada kunci dan kemudian menetapkan PowerShell sebagai shell.

Perhatikan ini hanya dapat bekerja pada OS Inggris, karena merujuk pada grup 'Administrator'.

Peter Hahndorf
sumber