ใช้ PowerShell โดยอัตโนมัติบนเซิร์ฟเวอร์คอร์


18

เมื่อฉันล็อกอินเข้าสู่การติดตั้งเซิร์ฟเวอร์ 2012 Core ทุกครั้งที่ฉันต้องพิมพ์powershellเพื่อรับบรรทัดคำสั่ง PowerShell แทนที่จะเป็น ol ol 'cmd ธรรมดา

สมมติว่าฉันจะไม่ลบคุณลักษณะ PowerShell Windows ฉันจะกำหนดค่าเซิร์ฟเวอร์ให้พาฉันเข้าสู่พรอมต์ PowerShell แทน cmd ได้อย่างไร

คำตอบ:


8

เพียงเพิ่มบรรทัดคำสั่ง powershell ของคุณเป็นค่าใหม่ใน regkey "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 เท่านั้นที่ทำได้ ฉันไม่สามารถเปลี่ยนการอนุญาตโดยไม่ได้รับสิทธิ์การเป็นเจ้าของคีย์ คุณคิดว่าการเป็นเจ้าของคีย์ระบบจะนำเสนอปัญหาใด ๆ หรือไม่? นี่คือ ACLs ของรีจิสทรีของฉัน: gist.github.com/vcsjones/4dca25f94bfb1cfd5857
vcsjones

ตกลงดีฉันตัดสินใจที่จะ snapshot VM และลองต่อไปดูเหมือนจะทำงาน สิ่งเดียวที่เป็นค่าควรเป็น 90000 ไม่ใช่ 9000 ถ้าค่าต่ำเกินไป cmd จะเตะในครั้งแรก
vcsjones

@vcsjones ไม่ควรมีปัญหาใด ๆ ตราบใดที่คุณให้ TrustedInstaller เก็บ FullControl ไว้เหนือคีย์ เพื่อให้ปลอดภัยคุณเพียงแค่รีเซ็ตความเป็นเจ้าของกลับเป็น TrustedInstaller หลังจากคุณทำเสร็จแล้ว โอ้และขอบคุณสำหรับการแก้ไขหมายเลข - แน่นอนฉันพิมพ์ผิดในreg addตัวอย่างของฉัน
the-wabbit

2
หรือปรับใช้สิ่งนี้ผ่านนโยบายกลุ่มเพื่อเพิ่มการชนะแบบอัตโนมัติและหลีกเลี่ยงความจำเป็นในการแก้ไขการอนุญาตใด ๆ )
Ashley

ฉันเพิ่งลองอีกครั้งไม่ทำงาน ปฏิเสธการเข้าใช้. -1
Peter Hahndorf

4

ดังนั้นนี่คือทางออกของคำถามนี้

  • ฉันไม่ต้องการยุ่งกับการเปลี่ยนการอนุญาตของAvailableShellsเส้นทาง
  • ฉันต้องการนโยบายกลุ่มอย่างง่ายที่สามารถนำไปใช้กับระบบทั้งหมดในโดเมนได้อย่างปลอดภัย
  • การตรวจสอบว่าคุณมี Server Core ผ่าน WMI แตกต่างกันระหว่าง 2008R2 และ 2012 หรือไม่ดังนั้นฉันไม่ต้องการใช้สิ่งนั้น
  • ฉันต้องการหลีกเลี่ยงสคริปต์ให้มากที่สุดและเพียงแค่ใช้นโยบายและค่ากำหนด

โซลูชันของฉันเหมือนหลาย ๆ สิ่งที่คุณจะพบในการค้นหาคือการเปลี่ยนHKLM:SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shellค่าเป็น Powershell ฉันใช้การกำหนดเป้าหมายระดับรายการเพื่อแก้ไขค่านี้เฉพาะในระบบที่ไม่มี explorer.exe AFAIK นี่คือการทดสอบที่ง่ายที่สุดในการจัดเรียงระบบเซิร์ฟเวอร์คอร์จากระบบที่มีเดสก์ท็อปมาตรฐาน

บรรทัดคำสั่งที่ฉันใช้ ( powershell.exe -noexit -Command "Set-Location ${Env:USERPROFILE} ;start sconfig ; start runonce.exe /AlternativeShellStartup") จะเริ่ม PowerShell, ปิดการทำงานของ 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 เป็นเชลล์

สังเกตว่าอาจใช้งานได้กับระบบปฏิบัติการภาษาอังกฤษเท่านั้นเนื่องจากหมายถึงกลุ่ม 'ผู้ดูแลระบบ'

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.