Tự động sử dụng PowerShell trên Server Core


18

Khi tôi đăng nhập cục bộ vào bản cài đặt Server 2012 Core, mỗi lần tôi phải gõ powershellđể vào dòng lệnh PowerShell thay vì đơn giản là ol 'cmd.

Giả sử rằng tôi sẽ không bao giờ xóa Tính năng Windows của PowerShell, làm cách nào tôi có thể định cấu hình máy chủ để đưa tôi thẳng vào dấu nhắc PowerShell thay vì cmd?

Câu trả lời:


8

Chỉ cần thêm dòng lệnh powershell của bạn làm giá trị mới vào regkey "AvailableShells" để có nó dưới dạng cài đặt trên toàn máy:

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

Tham khảo: http://andrewmorgan.ie/2012/03/30/changing-the-default-shell-of-windows-server-8-core/

Chỉnh sửa: lưu ý rằng các quyền đăng ký mặc định cho khóa "AvailableShells" sẽ không cho phép thay đổi. Bạn sẽ phải thay đổi các quyền trước đó (ví dụ: thủ công thông qua "regedit") để cho phép tài khoản của bạn (hoặc nhóm "Quản trị viên") thực hiện thay đổi này.


2
Điều đó có vẻ đầy hứa hẹn, nhưng có vẻ như nhóm Quản trị viên có quyền truy cập ghi vào AvailableShellskhóa đó , chỉ có TrustedInstaller thực hiện. Tôi không thể thay đổi quyền mà không có quyền sở hữu khóa. Bạn có nghĩ rằng việc sở hữu một khóa hệ thống sẽ gây ra bất kỳ vấn đề nào không? Dưới đây là các ACL trong sổ đăng ký của tôi: gist.github.com/vcsjones/4dca25f94bfb1cfd5857
vcsjones

OK, tôi đã quyết định chụp nhanh VM và dù sao thì nó cũng hoạt động. Điều khác duy nhất là giá trị phải là 90000, không phải 9000. Nếu giá trị quá thấp thì cmd sẽ khởi động trước.
vcsjones

@vcsjones không nên có bất kỳ vấn đề nào miễn là bạn để TrustedInstaller giữ FullControl trên khóa. Để đảm bảo an toàn, bạn có thể đặt lại quyền sở hữu trở lại TrustedInstaller sau khi hoàn tất. Ồ và cảm ơn bạn đã sửa số - thực sự tôi đã nhầm nó trong reg addví dụ của tôi .
the-wợi

2
Hoặc triển khai điều này thông qua Chính sách nhóm để thêm chiến thắng tự động hóa và tránh sự cần thiết phải sửa đổi bất kỳ quyền nào;)
Ashley

Tôi chỉ thử lại lần nữa, không hoạt động. Truy cập bị từ chối. -1
Peter Hahndorf

4

Vì vậy, đây là giải pháp của tôi cho câu hỏi này.

  • Tôi không muốn gây rối với việc thay đổi quyền của AvailableShellsđường dẫn.
  • Tôi muốn một Chính sách nhóm đơn giản có thể được áp dụng an toàn cho tất cả các hệ thống trên miền.
  • Việc phát hiện xem bạn có Server Core qua WMI có khác nhau giữa 2008R2 và 2012 hay không, vì vậy tôi không muốn sử dụng nó.
  • Tôi muốn tránh các kịch bản càng nhiều càng tốt và chỉ sử dụng các chính sách và ưu tiên.

Giải pháp của tôi giống như nhiều bạn sẽ tìm thấy trong một tìm kiếm là thay đổi HKLM:SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shellgiá trị thành Powershell. Tôi đã sử dụng nhắm mục tiêu cấp độ mục để sửa đổi giá trị này chỉ trên các hệ thống không có explorer.exe. AFAIK, đây là một trong những thử nghiệm đơn giản nhất để sắp xếp các hệ thống Server Core khỏi Hệ thống với máy tính để bàn tiêu chuẩn.

Dòng lệnh tôi sử dụng ( powershell.exe -noexit -Command "Set-Location ${Env:USERPROFILE} ;start sconfig ; start runonce.exe /AlternativeShellStartup") sẽ bắt đầu powershell, tắt các tác vụ runone, đặt thư mục hiện tại của tôi và bắt đầu sconfig trong một Window khác.

Đặt Powershell mặc định trên Core Server


2

Lệnh trong câu trả lời của syirecton-dj không hoạt động, bởi vì một quản trị viên nâng cao bình thường không có quyền ghi vào khóa. Các ý kiến ​​đề cập rằng bạn cần thay đổi các quyền. Nhưng điều này liên quan đến rất nhiều nhấp chuột trong regedit.exe và không hoạt động đối với các cài đặt theo kịch bản.

Tôi sử dụng tập lệnh PowerShell sau:

 $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

đầu tiên nó thay đổi các quyền trên khóa và sau đó đặt PowerShell làm vỏ.

Lưu ý rằng điều này chỉ có thể hoạt động trên hệ điều hành tiếng Anh, vì nó đề cập đến nhóm 'Quản trị viên'.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.