Microsoft System Center Yönetim Ailesi

PowerShell ile SCCM için Uygulama ve Paket Hazırlama Genel Bilgiler


Bir kaç yazıdan oluşacak bu dizide; PowerShell komutları ile, “MSI”, “EXE”, “CMD” ve “PS Betik” türünde uygulama ve 1 adet de paketi, örnekler ile  hazırlamaya çalışacağım, tekrardan kaçınmak için, ortak olabilecek bilgileri de bu yazıda toplamak istedim.

Önceden bildiğimiz ismi ile “System Center Configuration Manager (SCCM)” olan, daha sonra “Microsoft Endpoint Configuration Manager (MECM)” olarak isimlendirilen, son olarak da Ekim ayında MS, “Endpoint Manager” ismini bırakarak, bulutta sadece “InTune“, yerelde kullanılanı da  “Microsoft Configuration Manager” olarak isimlendirdi.<https://techcommunity.microsoft.com/t5/microsoft-intune-blog/introducing-the-microsoft-intune-product-family/ba-p/3650769>

Daha çok yaygın olarak kullanıldığını düşündüğüm için, bu yazı serisinde de SCCM olarak kullanacağım.

Komutların çoğu Powershell 7.x ile de çalışacaktır ama çalışmayanlara denk gelebilirsiniz, şimdilik 5.x ile devam edelim.

İlk olarak, PowerShell (PS) konsolunda “ConfigurationManager” isimli modül yüklü olmalı; bunu yapmanın pek çok yolu var. Burada, temel 2 tanesinden bahsedeceğiz:

1. yol olarak, grafik yönetim konsolunu kullanarak yüklemek; konsolun, sol üst köşesindeki, aşağıya açılır menüden, “Windows PowerShell üzerinden bağlan (Connect via Windows PowerShell)” öğesini kullanarak.

"PS ST1:\>"

şeklinde komut satırını görmeniz gerekli. “ST1” yerinde, sizin site kodunuz olacak.

2. bir yol olarak, yine yönetim konsolu yüklü makinada aşağıdaki gibi, internetten bulmuş olduğum, küçük bir PS betik kullanabilirsiniz; bu şekilde, grafik konsolu açmadan, doğrudan betiği çalıştırarak, komutları kullanmaya başlayabilirsiniz.

Sunucu_adiniz‘ ve ‘ST1‘  değerlerini size ait bilgiler ile güncellemeyi unutmayınız:

# Betik Başlangıcı
# powershell 5.x icin SCCM "ConfigurationManager" modülü yükleme
begin {
    $ErrorActionPreference = 'stop'
    $SiteServerName = 'Sunucu_adiniz' #### <-- SCCM Sunucu adınız
    $SiteCode = 'ST1' #### <-- Kullandiginiz 3 harfli Site adınız

    if (!(Test-Path "$(Split-Path $env:SMS_ADMIN_UI_PATH -Parent)\ConfigurationManager.psd1")) {
        Write-Error 'Configuration Manager modulu bulunamadi. Admin Konsol, bu makinada yuklu mu?'
    } elseif (!(Get-Module 'ConfigurationManager')) {
        Import-Module "$(Split-Path $env:SMS_ADMIN_UI_PATH -Parent)\ConfigurationManager.psd1"
      }
    Set-Location "$($SiteCode):"
      }
# Betik sonu

Bu arada, ilk defa betik çalıştıracaksınız;

Get-ExecutionPolicy

komutu sonrası “Restricted” değerini alırsanız, betik çalıştırmak istediğinizde “… running scripts is disabled on this system…” gibi bir hata alabilirsiniz; çalıştırma izni için şu komutu veriniz:

set-ExecutionPolicy -ExecutionPolicy remotesigned

Bu seçenek, sizin hazırladığınız dosyaları çalıştırmanıza izin verecek, internet v.b. ile edindiğiniz dosyalarda imza isteyecektir. Sisteminizde bu değişikliği yapmak istemezseniz, yukarıdaki 1. yolu kullanabilirsiniz.

Bu betiği, örnek olarak “SCCM.ps1” ismiyle kaydediniz; sonrasında, PS 5 yönetici olarak açtığınız komut satırında, kaydettiğiniz klasörden;
c:\betikler\SCCM.ps1
olarak çalıştırınız.

"PS ST1:\>"
şeklinde sizin site kodunuz ile komut satırını görmeniz gerekli.

Bu arada, PowerShell ISE ile kullanmak isterseniz, Mustafa Özdemir Bey‘in yazmış olduğu yazılara göz atabilirsiniz:

<https://www.cozumpark.com/powershell-iseyi-sccm-ortamina-baglama-islemleri/> ve https://www.cozumpark.com/temel-sccm-powershell-komutlarini-calistirma/

Bu aşamadan itibaren SCCM ile ilgili komutları kullanabilirsiniz. Küçük bir deneme yapalım ve adı içerisinde “7-zip” kelimesi geçen uygulama var mı bakalım;

PS ST1:\> get-cmapplication -fast | where-object { $_.LocalizedDisplayName -like "*7-zip*" } | Format-table -a LocalizedDisplayName

LocalizedDisplayName
--------------------
7-Zip 22.01 En - MSI - x64

Bu uygulamayı kullanmıyor iseniz, doğal olarak sonuç boş çıkacaktır, başka bir arama yapınız. Artık hazır olduğumuza göre başlayabiliriz.

Uygulama oluşturmak için 4 temel aşama var:

1. aşamada, “New-CMApplication” komutu ile yeni bir uygulama temeli oluşturma,
2. aşamada, türe göre kurulum / kaldırma şeklini oluşturma; MSI için “Add-CMMsiDeploymentType“, diğerleri için Add-CMScriptDeploymentType komutu,
3. aşamada, “Start-CMContentDistribution” ile uygulamayı dağıtım noktasına gönderme,
4. ve son aşamada, “New-CMApplicationDeployment” ile de dağıtım oluşturma.

1. Aşama komutunun temel seçenekleri şu şekilde açıklanabilir, sonraki yazılarda örnek uygulama oluşturulacapını tekrar hatırlatayım.

PS ST1:\> New-CMApplication -Name "Uygulamaya vereceğiniz isim 2.2.2 - ENG - MSI - x64 v.b." -Description "Konsolda yöneticiler için açıklama" -Publisher "uygulama firma ya da geliştiricisi" -SoftwareVersion "8.0.3410.10 gibi sürüm numarası" -IconLocationFile "\\sunucu_adiniz\Deployment\Simgeler\uygulama.ico" -AutoInstall $true -LocalizedDescription "Yazılım Merkezi (Software Center) da kullanıcının gördüğü açıklama"

Uygulama hazırlarken, komutlarda kullanılan çoğu seçenekleri, birer değişken ile kullanmak size kolaylık sağlayabilir, örneklerde kullanılacak değişkenler ve kısa açıklamaları aşağıdaki gibidir; bu arada, “$değişken” olarak kullanılan değişkenlerler, örnek olması için verilmiştir, zorunlu değildir, dilediğiniz şekilde değiştirebilirsiniz.

$uygulama=” Uygulamaya vereceğiniz isim 2.2.2 – ENG – MSI – x64 v.b. “
$onceki_uygulama=” Uygulamaya verdiğiniz isim 1.1.1- ENG – MSI – x64 v.b. “
$MSI_kod=”MSI dosyalar ile kullanılacak ID örnek: {26A24AE4-1234-4321-87B4-2F64180341F0}”
$adm_Aciklama=” Konsolda yöneticiler için açıklama “
$bilgi=” Kurulum tipinde yöneticinin gördüğü açıklama “
$adres=” Sunucunuzda kullandığınız genel paket paylaşımı \\sunucu_adiniz\deployment\Oracle\Java_x64\8u341\ “
$EXE=” Kullanacağınız EXE dosya, örnek: jre-8u341-windows-x64.exe “
$MSI=” MSI dosya adi ve uzantısı, örnek: uygulama.msi “
$simge=” Yazılım Merkezi (Software Center) görünecek simge, dilerseniz bunları ortak bir yerde toplayabilirsiniz, örnek:  \\sunucu_adiniz\Deployment\Simgeler\uygulama.ico gibi “
$firma=” uygulama firması ya da geliştiricisi “
$surum= ” sürüm numarası, aşağıdaki komut ile alabileceğiniz gibi;
(get-item ‘C:\Program Files\Java\jre1.8.0_341\bin\java.exe’).VersionInfo.FileVersionraw | foreach-object {(“{0}.{1}.{2}.{3}” -f $_.Major,$_.Minor,$_.Build,$_.Revision)}
 ya da sadece sürüm numarası doğrudan yazınız: ($surum=”8.0.3410.10″) “
$yukle=’ Yükleme komutu ve seçenekleri, çift tırnak yerine tek tırnak kullanılması, seçenekler içerisinde çift tırnak da kullanılabileceği için ‘
$kaldir=’ Uygulamayı kaldırma komut ve seçenekleri ‘
$TahminiSure_dk= Dakika cinsinden tahmini yükleme süresi
$Maks_Sure_dk= Dakika cinsinden maksimum yükleme süresi
$yerel_aciklama=” Yazılım Merkezi (Software Center) da kullanıcının gördüğü açıklama “
$kural = Uygulamanın kurulu olup olmadığını, başarılı kurulum olduğunu belirleme şekli, “Dağıtım Türleri/Deployment Types” içerisindeki “Algılama Yöntemi/Detection Method” içerisine eklenen kural(lar).
$Kullanici_Etkilesim= ” Kullanıcı etkileşimi ” ### [Normal | Minimized | Maximized | Hidden]$Oturum_tipi=” Kullanıcı oturum açma gereksinimi ” ### [ OnlyWhenUserLoggedOn | WhereOrNotUserLoggedOn | OnlyWhenNoUserLoggedOn ]$Ne_icin_Kurulum=” Kullanıcı için mi, Bilgisayar için mi ya da her ikisi için mi kurulum yapılacağı ” ### [InstallForUser | InstallForSystem | InstallForSystemIfResourceIsDeviceOtherwiseInstallForUser]$Kurulum_Eylem=” Kurulum işlemi ya da uygulama kaldırma işlemi seçme” ### [ Install | Uninstall ]$Kurulum_Sekli=” Yükleme işlemi kullanıcı seçimine mi bırakılsın ya da  otomatik mi kurulsun, “required” seçilirse Yazılım Merkezi (Software Center) “uninstall” düğmesi silik görünür, kullanılamaz ” ### [ Available | Required ]$Kullanici_bilgi=” Kullanıcı bilgilendirme pencereleri görünür ya da gizli ” ### [ DisplayAll | DisplaySoftwareCenterOnly | HideAll ]

Yukarıdaki değişkenleri, kopyala ve yapıştır komutları ile çalıştığınız PS konsola aktarınız.

Bu arada, yapıştırma işleminde tırnak işaretlerine dikkat ediniz. Bazı web sayfalarından kopyalanan metinlerde “süslü tek ve çift tırnak işaretine” dönebiliyor. Bu da hata almanıza neden olabilir. Bu tür bir durum yaşarsanız, dilerseniz önce bir metin düzenleyicisine yapıştırıp kontrol ediniz ve düzeltiniz.

Değişkenler yardımıyla kullandığınız komutlar, çoğunlukla aynı kalırken, sadece değişkenleri güncelleyerek kullanabilirsiniz:

PS ST1:\> New-CMApplication -Name $uygulama -Description $adm_Aciklama -Publisher $firma -SoftwareVersion $surum -IconLocationFile $simge -AutoInstall $true -LocalizedDescription $yerel_aciklama

2. Aşamada türlere göre, uygulama kurulum şekillerini oluşturuyoruz, genelde ilk komut değişiyor, seçenekler çoğunlukla aynı kalıyor.

MSI dosya “Kurulum Tipi / Deployment Type” hazırlamak için:

PS ST1:\> Add-CMMsiDeploymentType -ApplicationName $uygulama -ContentLocation $icerik -DeploymentTypeName $uygulama -InstallCommand $yukle -InstallationBehaviorType $Ne_icin_Kurulum -LogonRequirementType $Oturum_tipi -EstimatedRuntimeMins $TahminiSure_dk -MaximumRuntimeMins $Maks_Sure_dk -UninstallCommand $kaldir -UserInteractionMode $Kullanici_Etkilesim -Comment $adm_aciklama

Ek olarak “Ürün Kodu / Product Kodu” alanını da doldurmak isterseniz; “-SourceUpdateProductCode $MSI_kod” ekleyebilirsiniz.

Bazı MSI dosyalarında, imzası geçerli değil hatası alırsanız, paketin doğruluğundan eminseniz, üreticinin sitesinden indirdiyseniz, tırnaksız olarak “-Force” seçeneğini ekleyebilirsiniz.

EXE, CMD ve PS Betik dosya “Kurulum Tipi / Deployment Type” hazırlamak için:

PS ST1:\> Add-CMScriptDeploymentType -ApplicationName $uygulama -ContentLocation $adres -DeploymentTypeName $uygulama -InstallCommand $yukle  -InstallationBehaviorType $Ne_icin_Kurulum -LogonRequirementType $Oturum_tipi -EstimatedRuntimeMins $TahminiSure_dk -MaximumRuntimeMins $Maks_Sure_dk -UninstallCommand $kaldir -UserInteractionMode $Kullanici_Etkilesim -Comment $adm_aciklama -AddDetectionClause $kural -SourceUpdateProductCode $MSI_kod

3. aşamada uygulamayı dağıtım noktasına (ya da noktalarına) gönderiyoruz; bunun için:

PS ST1:\> Start-CMContentDistribution -ApplicationName $uygulama -DistributionPointName "sunucunuz.etkialani.com.tr"
ya da birden fazla dağıtım noktanız varsa,
PS ST1:\> Start-CMContentDistribution -ApplicationName $uygulama -DistributionPointGroupName "DN sunucuları"

4. ve son aşamada uygulamayı dağıtmak için, test kurulum yapmak için, içerisinde test makinalarınızın olduğu “Cihaz Koleksiyonları / Device Collections” kullanalım. Örneğin, bir kaç test makinanızın olduğu “Test_Kurulum“:

PS ST1:\> New-CMApplicationDeployment -ApplicationName $uygulama -CollectionName "Test_Kurulum" -DeployAction $Kurulum_Eylem -DeployPurpose $Kurulum_Sekli -UserNotification $Kullanici_bilgi

Temel aşamalar bunlar, bir kaç tane ek komuttan bahsedelim:

İstemci tarafında dağıtılan uygulamanın, “Yazılım Merkezi (Software Center)” içerisinde görünmesini ve kurulumu biraz hızlandırmak için kullanabileceğiz komutlar:

PS ST1:\> Invoke-CMClientNotification -DeviceName Test_Bilgisayar_Adi -ActionType ClientNotificationAppDeplEvalNow

(bazı diğer seçenekler: ### ClientNotificationRequestMachinePolicyNow | ClientNotificationRequestUsersPolicyNow | ClientNotificationRebootMachine )

Bir uygulamanın kullanıldığı, “Cihaz Koleksiyonları / Device Collections” listelemek için kullanılacak komut:
PS ST1:\> get-CMApplicationDeployment -Name $onceki_uygulama | format-table CollectionName

CollectionName
--------------
Test_Kurulum

Bir uygulamayı, dağıtım için kullanıldığı “Cihaz Koleksiyonları / Device Collections”dan çıkartmak için:
PS ST1:\> get-CMApplication -Name $onceki_uygulama -fast | remove-CMApplicationDeployment -CollectionName "Test_Kurulum" -Force -Confirm:$false

Uygulamayı dağıtım noktasından kaldırmak için:

PS ST1:\> Remove-CMContentDistribution -ApplicationName $onceki_uygulama -DistributionPointName "sunucunuz.etkialani.com.tr" -force

Önceki sürüm uygulamayı, kullanımdan kaldırmak, grafik yönetim konsolunda “Retired” olarak görünecektir.

PS ST1:\> Suspend-CMApplication -name $onceki_uygulama

Geri kullanıma almak isterseniz, grafik yönetim konsolunda “Active” olarak görünecektir.

PS ST1:\> Resume-CMApplication -name $onceki_uygulama

Hazırladığınız uygulamayı, konsolda sizin oluşturduğunuz başka bir klasöre taşımak isterseniz, bu komutu kullanabilirsiniz.

“ST1:\Application\” bölümü grafik konsolda gördüğünüz sabit klasör, “Uygulamalar“ı sizin taşımak istediğiniz klasör olarak düşününüz:
PS ST1:\> Move-CMObject -FolderPath "ST1:\Application\Uygulamalar" -InputObject (Get-CMApplication -Name "Uygulama_Paketi - ENG - MSI - x64" -fast)

Yukarıdaki komutları kullanırken ihtiyacınız olabilecek bazı bilgileri toplayabileceğiniz komut ve araçlardan da bahsedelim.

Aşağıdaki komutlar için her hangi bir sürüm PS komut satırını kullanabilirsiniz, modül yüklü olmasına da gerek yok.

Uygulama ve Paket hazırlarken ihtiyaç duyabileceğiniz bilgilerden bir tanesi, uygulama sürümü. Bu bilgiyi şu şekilde alabilirsiniz.
(get-item 'c:\Program Files\7-Zip\7zFM.exe').VersionInfo.FileVersionraw | foreach-object {("{0}.{1}.{2}.{3}" -f $_.Major,$_.Minor,$_.Build,$_.Revision)}

22.1.0.0

MSI kod bilgisi, ihtiyaç duyacağınız bir başka bilgi. Normal MSI uygulamaları kurarken (Add-CMMsiDeploymentType komutu ile) bu bilgiye ihtiyacınız olmayacaktır, bazı durumlarda kullanmak isterseniz, grafik yönetim konsolunda MSI seçerek bu bilgiyi alabilirsiniz, komut satırından yapmak isterseniz, uygulamanın kurulu olduğu bir bilgisayarda, şu komut ile bunu Kayıt defterinden (Registry) alabilirsiniz:

Tüm uygulamaların listesi için:
get-itemproperty 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*' | format-table DisplayName,PSChildName

ya da aynı yerde, isim içerisinde sadece “7-zip” geçen kayıt için:
Get-ChildItem -Path REGISTRY::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall | Get-ItemProperty | Where-Object { $_.DisplayName -like ('*' + "7-zip" + '*')}

buraya da bakınız.
Get-ChildItem -Path REGISTRY::HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall | Get-ItemProperty | Where-Object { $_.DisplayName -like ('*' + "7-zip" + '*')}

Uygulamaların “Yazılım Merkezi (Software Center)” içerisinde görünen simgelerini bir yerde toplamak için, aşağıdaki sayfada ingilizce açıklamaların bulunduğu uygulamayı kullanabilirsiniz, çok kısa bilgi vermek gerekirse, Windows 11 ile de çalışıyor, kurduktan sonra yapmanız gereken, simgesini almak istediğiniz kurulu uygulama EXE’sine, sağ fare tuşu ile “özellikler / Properties” penceresini açmak ve orada bulunan, “icons” tabından simgeyi seçerek, dosyaya kaydetmek.
<https://www.howtogeek.com/687096/how-to-extract-an-icon-from-a-windows-exe-file/>

Grafik yönetim konsolunu, Türkçe kullanmak isterseniz, yapmanız gereken kullandığınız işletim sistemi görünüm dilinizin Türkçe olması ve sunucunuz üzerinde, paylaşımda bulunan Türkçe yamayı yüklemek.
\\sunucu_adiniz\SMS_ST1\cd.latest\SMSSETUP\BIN\I386\LanguagePack\” içerisinde “ALP1055.msp” yamayı kurmanız gerekli. Bu yama yükleme işlemini, konsolu her güncellediğinizde, tekrarlamanız gerekir.

Son olarak, “Çalıştır / Run” penceresi aracılığıyla, “Yazılım Merkezi (Software Center)” uygulamasını “softwarecenter:” komutu ile, “Configuration Manager” denetim masası öğesini de, “control smscfgrc” komutu ile çalıştırabileceğinizi ekleyelim.

İyi çalışmalar.
Sevgi ve saygılar.

Kaynak
create-sccm-package-deployment-using-powershellpowershell-sccm-2012-create-packagescreating-sccm2012-packages-with-powershellcreate-sccm-application-powershellsccm-ps

Hüseyin Çağlar

Emekli sistem yöeticisi :-)

İlgili Makaleler

5 Yorum

  1. Merhaba çok güzel bir paylaşım olmuş emeğinize sağlık teşekkürler

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu