C# Kendi kendimize yönetici izni nasıl alabiliriz?

Yanlızca bir kere yönetici izni aldıktan sonra bir daha yönetici izni sormadan yönetici izni almayı göstereceğim.

Görev zamanlayıcısında yönetici izni olmadan görev çalıştırıp, bu görevi yönetici yapabiliyorduk. (bkz.) Bu işlemden faydalanarak biz de kendi kendimize yönetici verebilmek adına, yönetici izni yoksa kendi görevimizi tekrardan başlatacak görevi yapacağız. Yeni sayfa açmak istemediğimden bu sayfa üzerinde paylaşım yaptım. Yoksa neden böyle bir şey öğretilsin ki?

C# Projemizi oluşturuyoruz. Ben size göstermek amaçlı .NET 4.8.1 Console App açtım.
Nugetlardan TaskSchuduler'ı indiriyoruz.
1746275870977.png

C#:
using System.Runtime.InteropServices;
using Microsoft.Win32.TaskScheduler;
using System.Security.Principal;
using System.Linq;
using System.IO;
using System;
namespace KendiKendineUAC
{
    internal class Program
    {
        private static string appPath = AppDomain.CurrentDomain.BaseDirectory,
                              taskPath = @"Microsoft\Windows\Windoc";
        static void Main(string[] _)
        {
            using (TaskService ts = new TaskService())
            {
                Task task = ts.GetTask($@"{taskPath}\Opens\KendiKendineUAC");
                if (IsRunningAsAdministrator())
                {
                    Console.Write("Yönetici izni alındı");
                    try
                    {
                        if (task == null)
                        {
                            if (ts.GetFolder(taskPath) == null)
                                ts.RootFolder.CreateFolder(taskPath);
                            taskPath += @"\Opens";
                            if (ts.GetFolder(taskPath) == null)
                            {
                                TaskFolder taskFolder = ts.RootFolder.CreateFolder(taskPath);
                                TaskDefinition taskDefinition = ts.NewTask();
                                taskDefinition.RegistrationInfo.Description = "KendiKendineUAC";
                                taskDefinition.RegistrationInfo.Author = "Reis Production";
                                taskDefinition.Actions.Add(new ExecAction(Path.Combine(appPath, "KendiKendineUAC.exe"), null /*Args*/, appPath));
                                // Eğer başlangıçta otomatik açılmasını istiyorsanız bu bölümü açıklama satırından kaldırın
                                // Tetikleyici eklemek için:
                                //LogonTrigger logonTrigger = new LogonTrigger();
                                //taskDefinition.Triggers.Add(logonTrigger);
                                taskDefinition.Principal.UserId = Environment.UserName;
                                taskDefinition.Principal.RunLevel = TaskRunLevel.Highest;
                                taskFolder.RegisterTaskDefinition("KendiKendineUAC", taskDefinition);
                            }
                        }
                        else // Görev var ama ayarları kurcalanmış ise düzeltmek için
                        {
                            ExecAction execAction = task.Definition.Actions.OfType<ExecAction>().FirstOrDefault();
                            if (execAction != null
                                && !string.IsNullOrWhiteSpace(appPath)
                                && !string.IsNullOrWhiteSpace(Path.GetDirectoryName(execAction.Path))
                                && !Path.GetDirectoryName(execAction.Path).Equals(appPath, StringComparison.OrdinalIgnoreCase))
                            {
                                execAction.Path = Path.Combine(appPath, "KendiKendineUAC.exe");
                                ts.RootFolder.RegisterTaskDefinition("KendiKendineUAC", task.Definition);
                            }
                        }
                    }
                    catch (COMException exception) when (exception.HResult == unchecked((int)0x800700B7))
                    { /* Görev zaten var işleme devam et */ }
                    catch (Exception exception)
                    {
                        // Hata kontrolü
                        // Örneğin:
                        Console.Write(exception.Message);
                    }
                }
                else
                {
                    Console.Write("Yönetici izni yok");
                    task?.Run();
                    System.Threading.Thread.Sleep(9999);
                    return;
                }
                Console.ReadLine();
            }
            bool IsRunningAsAdministrator()
            {
                using (WindowsIdentity identity = WindowsIdentity.GetCurrent())
                {
                    WindowsPrincipal principal = new WindowsPrincipal(identity);
                    return principal.IsInRole(WindowsBuiltInRole.Administrator);
                }
            }
        }
    }
}
Bu kodda da tam olarak bu mantık işliyor. Siz kendinize göre özelleştirip, optimize edersiniz.
Artık uygulamamızı çalıştırdığımızda kendine yönetici izni veriyor.
İsterseniz masaüstüne sağ tık -> Kısayol oluştur -> C:\Windows\System32\schtasks.exe /run /tn "Microsoft\Windows\Windoc\Opens\KendiKendineUAC"
Bu kısayolu çalıştırırsanız, direkt yönetici izinsiz çalışmadan yönetici olarak çalışır.

İyi günler ve iyi çalışmalar dilerim! :)

Yorumlar

Elbet bir gün işime yarayacak diyerek öğrendiğim milyarıncı bilgi 😀
Şahsen, C# ile yapılan uygulamalarının çoğuna işe yarıyacaktır. Genelde hep yönetici izni isterler. Bu arada illa C# ile de olmasına gerek yok. CPP, Python ile de yapılır. Onu da dilinde uzman birisi girdilesin artık. Şiftah benden olsun, bereketi sosyalden :D
 

Blog girdisi detayları

Ekleyen
Bayram Reis
Okuma süresi
2 dakika okuma
Görüntüleme
176
Yorumlar
4
Son güncelleme

Teknoloji kategorisindeki diğer girdiler

Bayram Reis adlı kullanıcının diğer girdileri

Bu girdiyi paylaş

Geri
Yukarı