Batch Script │ Yönetici yetki kontrolü nasıl yapılır?

Batch uygulamalar için olmazsa olmazlardan biri de yönetici yetkisidir. Çünkü bir çok işlem yönetici yetkisi olmadan işlem yapmanıza izin vermemektedir. Örneğin bir regedit kaydı eklemek, Dism komutlarını çalıştırmak istiyorsanız yönetici yetkisi mutlaka olmalıdır. 

Bazı durumlarda uygulamayı sağ-tık yönetici olarak çalıştır demeyi unutabiliyoruz. Bundan kaynaklı komutlarda sorunlar oluşabiliyor. Bunun önüne geçmek için batch script çalışmanızın ilk komutlarına yönetici yetki kontrol komutları eklememiz gerekiyor.

Komut dosyaları sürekli yönetici olarak çalışıyorsa 'UAC' ayarlarınızda sorun vardır. Bunu çözmek için 'UAC' ayarını aktif edip sistemi yeniden başlattıktan sonra 'UAC' ayarını isterseniz yeniden devre dışı bırakabilirsiniz o zaman sorun çözülecektir.

echo off
chcp 65001
setlocal enabledelayedexpansion
:: Aşağıdaki reg sorgusuyla yönetici yetkisi olup olmadığını öğreniyoruz.
:: Bu bölümde sorgulama yapmak için yönetici yetkisi olmak zorundadır.
> NUL 2>&1" başarılı ve başarısız çıktıların görüntülenmesini engellemek için kullanılır.
reg query "HKU\S-1-5-19" > NUL 2>&1
:: Call :Powershell ibaresini kullanma nedeni chcp 65001 komutudur. Bu komut aktif iken Powershell'e komut gönderilirse ekran sıkışık eski arayüze geçecektir. Bu da kötü bir görüntü oluştaracaktır.
:: if ile %errorlevel% değişkenini sorgulayarak hata verip vermediğini kontrol ediyoruz. NEQ 0 ifadesi 0 dışında bir ifade var ise yönetici yetkisi yok anlamına gelir.
:: "Start-Process '%~f0' -Verb Runas" ile Powershell'e komut gönderiyoruz. %~f0 çalışmanızın yolunu ifade etmektedir.
:: exit diyerek ikinci bir işlem yapmasını istiyoruz yani exit komutu vererek yönetici yetkisi olmayan çalışmayı kapatıyoruz. Powershell ile yeniden başladığında çalışma yönetici yetkisiyle açılacağı için yeniden çıkış yapmayacaktır.
    if %errorlevel% NEQ 0 (Call :Powershell "Start-Process '%~f0' -Verb Runas"&exit)
echo İşlem tamamlandı.
pause
exit
:: ---------------
:Powershell
:: chcp 65001 kullanıldığında Powershell komutları ekranı kompakt görünüme sokuyor. Bunu önlemek için bu bölümde chcp 437 geçip kodu uygulayıp tekrar chcp 65001'a geri dönüyorum.
chcp 437 > NUL 2>&1
:: '%*' işaretiyle yukarıda Call :Powershell dediğim bölümden buraya gönderdiğim komut gelir.
Powershell -NoLogo -NoProfile -NonInteractive -ExecutionPolicy Bypass -C %*
chcp 65001 > NUL 2>&1
:: İşlem sonrası çağrıldı yere geri döner.
goto :eof
Blogger tarafından desteklenmektedir.