Windows Sandbox ile Daha Fazlasını Yapmak
Windows 10 2004'e güncellemeyi sabırsızlıkla beklememin nedenlerinden biri Windows Sandbox özelliğine erişim sahibi olmaktı. Sanırım yayın öncesi bir versiyon üzerinde çalıştım ve ilgimi çekti. Normalde test edebileceğim bir dizi Hyper-V sanal makinem var ama her zaman oynayacak yeni bir şeyler arıyorum. Ve kum havuzuyla oynamaktan daha iyi ne olabilir ki!
Bu özelliği Program Ekle/Kaldır aracılığıyla etkinleştirebilirsiniz. Ben de öyle yaptım. Ancak PowerShell'i kullanabilmelisiniz. Öncelikle doğru parçalara sahip olduğunuzu doğrulamak isteyebilirsiniz.
Get-WindowsOptionalFeature -online -FeatureName Containers-DisposableClientVMEğer öyleyse, onu etkinleştirebilmelisiniz.
Enable-WindowsOptionalFeature -Online -FeatureName Containers-DisposableClientVMKurulduktan sonra Başlat Menüsü kısayolunu bulun ve başlatın. Sadece bir dakika sürer.
Konteyner internet erişimine sahip olacak ve adından da anlaşılacağı üzere tek kullanımlık olacak. Aynı zamanda izole edilmesi ve korunması da amaçlanmaktadır. Ancak Windows Sandbox'ı ihtiyaçlarınıza daha iyi uyacak şekilde özelleştirebilirsiniz. Büyük olasılıkla, uyguladığınız herhangi bir yapılandırmanın güvenliği azaltabileceğini unutmayın. Veya en azından korumalı alanın asıl amacı. Güvenlik ve kullanılabilirlik arasında denge kurmanız gerekecek.
Özelleştirme Dosyaları
Windows Sandbox'ın yönetim arayüzü açısından pek bir özelliği yoktur. Belki gelecek versiyonlarda bu durum değişir. Korumalı alan deneyiminizi özelleştirmek istiyorsanız .wsb uzantısını kullanan bir XML dosyası oluşturmanız gerekir. https://docs.microsoft.com/en-us/windows/security/threat-protection/windows-sandbox/windows-sandbox-configure-using-wsb-file adresinde belgeler var, ancak sizinle bildiklerimi paylaşacağım 'yapıyorum.
<Configuration>
<MappedFolders>
<MappedFolder>
<!-- Create a drive mapping that mirrors my Scripts folder -->
<HostFolder>C:\scripts</HostFolder>
<SandboxFolder>C:\scripts</SandboxFolder>
<ReadOnly>false</ReadOnly>
</MappedFolder>
<MappedFolder>
<HostFolder>C:\Pluralsight</HostFolder>
<SandboxFolder>C:\Pluralsight</SandboxFolder>
<ReadOnly>true</ReadOnly>
</MappedFolder>
</MappedFolders>
<ClipboardRedirection>true</ClipboardRedirection>
<MemoryInMB>8192</MemoryInMB>
<LogonCommand>
<Command>C:\scripts\sandbox-setup.cmd</Command>
</LogonCommand>
</Configuration>Amacım doğrultusunda, kodu ve modülleri test etmek için nispeten temiz bir PowerShell ortamı istiyorum. Ayrıca Çoğul Görüş kursunda kullanabileceğim bir şey istedim.
Korumalı alanda hiçbir şeyin kalıcı olmadığını ancak en azından başlangıç durumunu ayarlamak için bir yapılandırma dosyası kullanabileceğinizi unutmayın. Ben de bunu yapıyorum. Dosyanın ilk kısmı, klasörleri masaüstümden sanal alana eşlemek. Komut Dosyaları klasörüme tam erişime sahip olmak istiyorum. İşleri basit tutmak için aynı klasör yolunu kullanıyorum. Ayrıca bir klasörü yerel Pluralsight klasörüme eşliyorum. Bunda kurulumum için ihtiyacım olan dosyalar var ve bunlara birazdan ulaşacağım. Aptalca bir şey yapmamak için önlem olarak bunu salt okunur bir klasör haline getiriyorum.
Kolayca kopyalayıp yapıştırabilmek istiyorum, böylece panoyu etkinleştiriyorum. Ayrıca korumalı alanın kullanmasını istediğim bellek miktarını da ayarlıyorum. Masaüstümde 32GB RAM olduğu için 8GB'ı rahatlıkla ayırabiliyorum. Şimdi işin eğlenceli kısmına geçelim.
Oturum Açma Komutu
Korumalı alan başlatıldığında çalıştırılacak bir komut tanımlayabilirsiniz. Biraz test ve denemeden sonra en kolay çözümün toplu cmd dosyası oluşturmak olduğu sonucuna vardım. Bu dosya daha sonra konfigürasyonum için ihtiyaç duyduğum diğer tüm kodları çağırabilir.
REM sandbox-setup.cmd
REM This code runs in the context of the Windows Sandbox
REM Create my standard Work folder
mkdir c:\work
REM set execution policy first so that a setup script can be run
powershell.exe -command "&{Set-ExecutionPolicy RemoteSigned -force}"
REM Now run the true configuration script
powershell.exe -file c:\scripts\sandbox-config.ps1
Bahsettiğim gibi, korumalı alan varsayılan olarak kilitli olduğundan ihtiyaçlarımı karşılamak için kısıtlamaları hafifletiyorum. Yürütme politikasını ayarlamak gibi. Ana yapılandırma Sandox-config.ps1 dosyasında yapılır.
Enable-PSRemoting -force -SkipNetworkProfileCheck
Install-PackageProvider -name nuget -force -forcebootstrap -scope allusers
Update-Module PackageManagement,PowerShellGet -force
#run updates and installs in the background
Start-Job {Install-Module PSScriptTools,PSTeachingTools -force}
Start-Job {Install-Module PSReleaseTools -force; Install-PowerShell -mode quiet -enableremoting -EnableContextMenu}
Start-Job {Install-Module WTToolbox -force ; Install-WTRelease}
Start-Job -FilePath c:\scripts\install-vscodesandbox.ps1
Start-Job -FilePath c:\scripts\Set-SandboxDesktop.ps1
#wait for everything to finish
Get-Job | Wait-Job
Senaryonun ilk kısmı apaçık olmalıdır. Komut dosyasının son kısmı, arka plan işleri olarak bir dizi başka komut dosyasını ve komutu başlatır. Senaryonun sonu tüm işlerin bitmesini bekliyor, ancak tüm bunlar "perde arkasında" yürütüldüğü için bu pek bir şey ifade etmiyor.
PowerShell 7'yi kurabilmek için PSReleaseTools dahil standart modüllerimden bazılarını yüklüyorum. Windows Terminalini kolayca kurabilmek için WTToolbox modülümü de yüklüyorum. Elbette VS Code'a sahip olmak isterim, böylece bu bir komut dosyası aracılığıyla yüklenir.
#Install-VSCodeSandbox.ps1
$file = Join-Path -path $env:temp -child 'VSCodeSetup-x64.exe'
Invoke-WebRequest -Uri "https://update.code.visualstudio.com/latest/win32-x64-user/stable" -OutFile $file -DisableKeepAlive -usebasicparsing
$loadInf = '@
[Setup]
Lang=english
Dir=C:\Program Files\Microsoft VS Code
Group=Visual Studio Code
NoIcons=0
Tasks=desktopicon,addcontextmenufiles,addcontextmenufolders,addtopath
@'
$infPath = Join-Path -path $env:TEMP -child load.inf
$loadInf | Out-File $infPath
Start-Process -FilePath $file -ArgumentList "/VERYSILENT /LOADINF=${infPath}" -Wait
#add extensions
Start-Process -filepath "C:\Program Files\Microsoft VS Code\bin\code.cmd" -ArgumentList "--install-extension ms-vscode.powerShell"
Son adım, masaüstünü Pluralsight ihtiyaçlarımı karşılayacak şekilde yapılandırmaktır. Bu öncelikle saat gibi bazı simgeleri gizlemek ve bir duvar kağıdı ayarlamaktır.
# Set-SandboxDesktop.ps1
# my Pluralsight related configuration
function Update-Wallpaper {
[cmdletbinding(SupportsShouldProcess)]
Param(
[Parameter(Position = 0,HelpMessage="The path to the wallpaper file.")]
[alias("wallpaper")]
[ValidateScript({Test-Path $_})]
[string]$Path = $(Get-ItemPropertyValue -path 'hkcu:\Control Panel\Desktop\' -name Wallpaper)
)
Add-Type @"
using System;
using System.Runtime.InteropServices;
using Microsoft.Win32;
namespace Wallpaper
{
public class UpdateImage
{
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern int SystemParametersInfo (int uAction, int uParam, string lpvParam, int fuWinIni);
public static void Refresh(string path)
{
SystemParametersInfo( 20, 0, path, 0x01 | 0x02 );
}
}
}
"@
if ($PSCmdlet.shouldProcess($path)) {
[Wallpaper.UpdateImage]::Refresh($Path)
}
}
#configure the taskbar and hide icons
if (-not (Test-Path hkcu:\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer)) {
[void](New-Item hkcu:\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer)
}
Set-ItemProperty hkcu:\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\ -Name Hideclock -Value 1
Set-ItemProperty hkcu:\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\ -Name HideSCAVolume -Value 1
Set-ItemProperty hkcu:\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\ -Name HideSCANetwork -Value 1
if (-not (Test-Path hkcu:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced)) {
[void](New-Item hkcu:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced)
}
Set-ItemProperty hkcu:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced -Name HideIcons -Value 1
#configure wallpaper
Set-ItemProperty 'hkcu:\Control Panel\Desktop\' -name Wallpaper -Value C:\Pluralsight\Wallpaper\Pluralsight_Wallpaper_Fall_2015_Black.jpg
Set-ItemProperty 'hkcu:\Control Panel\Desktop\' -name WallpaperOriginX -value 0
Set-ItemProperty 'hkcu:\Control Panel\Desktop\' -name WallpaperOriginY -value 0
Set-ItemProperty 'hkcu:\Control Panel\Desktop\' -name WallpaperStyle -value 10
Update-WallPaper
<# This doesn't work completely in newer versions of Windows 10 Invoke-Command {c:\windows\System32\RUNDLL32.EXE user32.dll,UpdatePerUserSystemParameters 1,True} #>
#this is a bit harsh but it works
Get-Process explorer | Stop-Process -force Bütün bunlar nasıl bir araya geliyor?
PowerShell profilime Windows Sandbox'ı başlatmayı kolaylaştıran bir işlev yüklü.
Function Start-WindowsSandbox {
[cmdletbinding(DefaultParameterSetName = "config")]
[alias("wsb")]
Param(
[Parameter(ParameterSetName = "config")]
[ValidateScript({Test-Path $_})]
[string]$Configuration = "C:\scripts\WinSandBx.wsb",
[Parameter(ParameterSetName = "normal")]
[switch]$NoSetup
)
Write-Verbose "Starting $($myinvocation.mycommand)"
if ($NoSetup) {
Write-Verbose "Launching default WindowsSandbox.exe"
c:\windows\system32\WindowsSandbox.exe
}
else {
Write-Verbose "Launching WindowsSandbox using configuration file $Configuration"
Invoke-Item $Configuration
}
Write-Verbose "Ending $($myinvocation.mycommand)"
} Varsayılan davranış, özelleştirme dosyamı kullanmaktır. Yine de kendime hiçbir özelleştirme olmadan sanal alanı başlatma seçeneği verdim. İşlev, çalıştırılmasını çok kolaylaştıran wsb takma adına sahiptir.
Çalıştırdığımda, varsayılan masaüstüyle Windows Sandbox'ı alıyorum. arka planda kurulum ve yapılandırma dosyalarım çalışıyor. Yaklaşık bir dakika içinde masaüstüm Pluralsight arka planıma dönüşüyor ve işimin neredeyse bittiğini biliyorum. BurntToast bildirimi eklemeyi deneyebilirim.
Ancak artık gereksinimlerimi karşılayan, kullanıma hazır bir sanal alan yapılandırmam var. Evet, genel güvenliği azalttım ama bu, dayanamayacağım bir şey değil.
Kodu alıp kendi başınıza bir şeyler deneyebilirsiniz. Her zamanki gibi ne düşündüğünüzü duymak isterim.


