PowerShell'i Sunucu Çekirdeğinde Otomatik Olarak Kullanma


18

Bir Server 2012 Core kurulumunda yerel olarak oturum açtığımda, her zamanpowershell düz ol 'cmd yerine bir PowerShell komut satırına ulaşmak için yazmak zorunda kalıyorum .

PowerShell Windows Özelliğini asla kaldırmayacağımı varsayarsak, sunucuyu doğrudan cmd yerine bir PowerShell istemine almak için nasıl yapılandırabilirim?

Yanıtlar:


8

Makine genelinde bir ayar olarak kullanmak için powershell komut satırınızı "AvailableShells" regkey'e yeni bir değer olarak eklemeniz yeterlidir:

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

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

Düzenleme: "AvailableShells" anahtarı için varsayılan kayıt defteri izinlerinin değişikliğe izin vermeyeceğini unutmayın. Hesabınızın (veya "Yöneticiler" grubunun) bu değişikliği yapmasına izin vermek için önceden izinleri değiştirmeniz gerekir (ör. "Regedit" aracılığıyla manuel olarak).


2
Bu umut verici görünüyor, ancak Administrators grubunun bu AvailableShellsanahtara yazma erişimi olduğu görülmüyor, yalnızca TrustedInstaller kullanıyor. Anahtarın sahipliğini almadan izinleri değiştiremiyorum. Bir sistem anahtarına sahip olmanın herhangi bir sorun yaratacağını düşünüyor musunuz? İşte kayıt defterimin
vcsjones

Tamam, VM'yi anlık olarak görüntülemeye ve yine de denemeye karar verdim, işe yarıyor gibi görünüyor. Diğer tek şey, değerin 9000 değil 90000 olması gerektiğidir. Değer çok düşükse önce cmd başlar.
vcsjones

@vcsjones, TrustedInstaller'ın FullControl'ü anahtar üzerinde tutmasına izin verdiğiniz sürece herhangi bir sorun göstermemelidir. Güvenli tarafta olmak için, işiniz bittikten sonra sahipliği tekrar TrustedInstaller'a sıfırlayabilirsiniz. Oh ve sayının düzeltilmesi için teşekkür ederim - gerçekten örneğimde yanlış yazdım reg add.
wabbit

2
Ya da ek otomasyon kazanımı için Grup İlkesi aracılığıyla dağıtın ve izinleri değiştirme ihtiyacını ortadan kaldırın;)
Ashley

Ben sadece tekrar denedim, çalışmıyor. Erişim reddedildi. -1
Peter Hahndorf

4

İşte bu soruya benim çözümüm.

  • AvailableShellsYolun izinlerini değiştirmekle uğraşmak istemedim .
  • Etki alanındaki tüm sistemlere güvenle uygulanabilecek basit bir Grup İlkesi istedim.
  • WMI üzerinden Sunucu Çekirdeğiniz olup olmadığını tespit etmek 2008R2 ve 2012 arasında farklı olduğundan, bunu kullanmak istemedim.
  • Komut dosyalarından olabildiğince kaçınmak ve sadece politikaları ve tercihleri ​​kullanmak istiyorum.

Bir aramada bulacağınız birçok kişi gibi benim çözümüm, HKLM:SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shelldeğeri Powershell olarak değiştirmektir . Bu değeri yalnızca explorer.exe olmayan sistemlerde değiştirmek için öğe düzeyinde hedeflemeyi kullandım. AFAIK, bu standart bir masaüstüne sahip Sistemlerden Sunucu Çekirdeği sistemlerini sıralamak için en basit testlerden biridir.

Kullandığım ( powershell.exe -noexit -Command "Set-Location ${Env:USERPROFILE} ;start sconfig ; start runonce.exe /AlternativeShellStartup") komut satırı powershell'i başlatır, runone görevlerini başlatır, geçerli dizinimi ayarlar ve sconfig'i başka bir pencerede başlatır.

Sunucu Çekirdeğinde Varsayılan Powershell'i ayarlama


2

Normal bir yükseltilmiş yöneticinin anahtara yazma erişimi olmadığı için syneticon-dj'nin yanıtındaki komut çalışmaz. Yorumlar, izinleri değiştirmeniz gerektiğini belirtir. Ancak bu regedit.exe'yi tıklatmayı içerir ve komut dosyası yüklemeleri için çalışmaz.

Aşağıdaki PowerShell betiğini kullanıyorum:

 $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

önce anahtardaki izinleri değiştirir ve ardından PowerShell'i kabuk olarak ayarlar.

'Yöneticiler' grubuna atıfta bulunduğundan, bunun yalnızca İngilizce bir işletim sisteminde çalışabileceğine dikkat edin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.