Programın UAC denetimi yapması

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
amatorkaan
Üye
Mesajlar: 12
Kayıt: 26 Mar 2014 09:53

Programın UAC denetimi yapması

Mesaj gönderen amatorkaan »

Hazırladığım bir uygulama Registry'e kayıt ekliyor. Ancak bunu yapabilmesi için yönetici olarak çalıştırılması lazım. Yönetici olarak çalıştırıldığında direkt çalışmasını, normal çalıştırıldığında kullanıcıyı örneğin; "Lütfen programı yönetici olarak çalıştırın" şeklinde uyarmasını istiyorum. Program, bu kontrolü ne şekilde yapabilir?
Senat0r
Üye
Mesajlar: 80
Kayıt: 13 Tem 2014 09:30
Konum: Antalya

Re: Programın UAC denetimi yapması

Mesaj gönderen Senat0r »

http://www.ahmetaltay.com.tr/2014/07/yo ... irmak-uac/ Başka siteden link vermek yasak mı değil mi bilmiyorum ama bir inceleyin isterseniz.
gideceği limanı bilmeyen gemiye hiçbir rüzgar yardım edemez...

Kod: Tümünü seç

Delete from hayat where cins="çıkarcılar"
Kullanıcı avatarı
warder
Üye
Mesajlar: 255
Kayıt: 10 Mar 2004 04:59

Re: Programın UAC denetimi yapması

Mesaj gönderen warder »

Kod: Tümünü seç

	if (!Seri->bAdmin) {
		SHELLEXECUTEINFO shCalistir;
		shCalistir.cbSize       = sizeof(SHELLEXECUTEINFO);
		shCalistir.fMask        = NULL;
		shCalistir.hwnd         = Application->Handle;
		shCalistir.lpVerb       = L"runas";
		shCalistir.lpFile       = Application->ExeName.w_str();
		shCalistir.lpParameters = L"lisans"; // NULL;
		shCalistir.lpDirectory  = NULL;
		shCalistir.nShow        = SW_SHOWNORMAL;
		shCalistir.hInstApp     = NULL;
		this->Hide();
		ShellExecuteEx(&shCalistir);
		Application->Terminate();
		return;
	}
Yukardaki kodda Admin yetkili çalışmak için gereken "runas" parametresi.
Sizin asıl sorduğunuz, öncesinde kontrol gerçekleştirme kısmı ise if içerisinde.. ancak o kısmı ayrı bir class olarak değerlendirmişim. Beraberinde bir çok özel işlemle grift bir yapı oluşturduğundan sizinle paylaşacağım duruma gelmesi güç.
Ancak aşağıda vereceğim tanımlamalar işinize araştırma yönünden de olsa epey yarayacaktır.

Kod: Tümünü seç

#define SE_CREATE_TOKEN_NAME              TEXT("SeCreateTokenPrivilege")
#define SE_ASSIGNPRIMARYTOKEN_NAME        TEXT("SeAssignPrimaryTokenPrivilege")
#define SE_LOCK_MEMORY_NAME               TEXT("SeLockMemoryPrivilege")
#define SE_INCREASE_QUOTA_NAME            TEXT("SeIncreaseQuotaPrivilege")
#define SE_UNSOLICITED_INPUT_NAME         TEXT("SeUnsolicitedInputPrivilege")
#define SE_MACHINE_ACCOUNT_NAME           TEXT("SeMachineAccountPrivilege")
#define SE_TCB_NAME                       TEXT("SeTcbPrivilege")
#define SE_SECURITY_NAME                  TEXT("SeSecurityPrivilege")
#define SE_TAKE_OWNERSHIP_NAME            TEXT("SeTakeOwnershipPrivilege")
#define SE_LOAD_DRIVER_NAME               TEXT("SeLoadDriverPrivilege")
#define SE_SYSTEM_PROFILE_NAME            TEXT("SeSystemProfilePrivilege")
#define SE_SYSTEMTIME_NAME                TEXT("SeSystemtimePrivilege")
#define SE_PROF_SINGLE_PROCESS_NAME       TEXT("SeProfileSingleProcessPrivilege")
#define SE_INC_BASE_PRIORITY_NAME         TEXT("SeIncreaseBasePriorityPrivilege")
#define SE_CREATE_PAGEFILE_NAME           TEXT("SeCreatePagefilePrivilege")
#define SE_CREATE_PERMANENT_NAME          TEXT("SeCreatePermanentPrivilege")
#define SE_BACKUP_NAME                    TEXT("SeBackupPrivilege")
#define SE_RESTORE_NAME                   TEXT("SeRestorePrivilege")
#define SE_SHUTDOWN_NAME                  TEXT("SeShutdownPrivilege")
#define SE_DEBUG_NAME                     TEXT("SeDebugPrivilege")
#define SE_AUDIT_NAME                     TEXT("SeAuditPrivilege")
#define SE_SYSTEM_ENVIRONMENT_NAME        TEXT("SeSystemEnvironmentPrivilege")
#define SE_CHANGE_NOTIFY_NAME             TEXT("SeChangeNotifyPrivilege")
#define SE_REMOTE_SHUTDOWN_NAME           TEXT("SeRemoteShutdownPrivilege")
#define SE_UNDOCK_NAME                    TEXT("SeUndockPrivilege")
#define SE_SYNC_AGENT_NAME                TEXT("SeSyncAgentPrivilege")
#define SE_ENABLE_DELEGATION_NAME         TEXT("SeEnableDelegationPrivilege")
#define SE_MANAGE_VOLUME_NAME             TEXT("SeManageVolumePrivilege")
#define SE_IMPERSONATE_NAME               TEXT("SeImpersonatePrivilege")
#define SE_CREATE_GLOBAL_NAME             TEXT("SeCreateGlobalPrivilege")
#define SE_TRUSTED_CREDMAN_ACCESS_NAME    TEXT("SeTrustedCredManAccessPrivilege")
#define SE_RELABEL_NAME                   TEXT("SeRelabelPrivilege")
#define SE_INC_WORKING_SET_NAME           TEXT("SeIncreaseWorkingSetPrivilege")
#define SE_TIME_ZONE_NAME                 TEXT("SeTimeZonePrivilege")
#define SE_CREATE_SYMBOLIC_LINK_NAME      TEXT("SeCreateSymbolicLinkPrivilege")

//
// Token Specific Access Rights.
//

#define TOKEN_ASSIGN_PRIMARY    (0x0001)
#define TOKEN_DUPLICATE         (0x0002)
#define TOKEN_IMPERSONATE       (0x0004)
#define TOKEN_QUERY             (0x0008)
#define TOKEN_QUERY_SOURCE      (0x0010)
#define TOKEN_ADJUST_PRIVILEGES (0x0020)
#define TOKEN_ADJUST_GROUPS     (0x0040)
#define TOKEN_ADJUST_DEFAULT    (0x0080)
#define TOKEN_ADJUST_SESSIONID  (0x0100)

#define TOKEN_ALL_ACCESS_P (STANDARD_RIGHTS_REQUIRED  |\
                          TOKEN_ASSIGN_PRIMARY      |\
                          TOKEN_DUPLICATE           |\
                          TOKEN_IMPERSONATE         |\
                          TOKEN_QUERY               |\
                          TOKEN_QUERY_SOURCE        |\
                          TOKEN_ADJUST_PRIVILEGES   |\
                          TOKEN_ADJUST_GROUPS       |\
                          TOKEN_ADJUST_DEFAULT )

#if ((defined(_WIN32_WINNT) && (_WIN32_WINNT > 0x0400)) || (!defined(_WIN32_WINNT)))
#define TOKEN_ALL_ACCESS  (TOKEN_ALL_ACCESS_P |\
                          TOKEN_ADJUST_SESSIONID )
#else
#define TOKEN_ALL_ACCESS  (TOKEN_ALL_ACCESS_P)
#endif

#define TOKEN_READ       (STANDARD_RIGHTS_READ      |\
                          TOKEN_QUERY)


#define TOKEN_WRITE      (STANDARD_RIGHTS_WRITE     |\
                          TOKEN_ADJUST_PRIVILEGES   |\
                          TOKEN_ADJUST_GROUPS       |\
                          TOKEN_ADJUST_DEFAULT)

#define TOKEN_EXECUTE    (STANDARD_RIGHTS_EXECUTE)

AllocateAndInitializeSid(...) fonksiyonu ise aradığınız fonksiyon.

http://msdn.microsoft.com/en-us/library ... 85%29.aspx
http://msdn.microsoft.com/en-us/library ... 85%29.aspx

sayfaları işinizi görecektir.
... Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!
Mustafa Kemal Atatürk...
Kullanıcı avatarı
amatorkaan
Üye
Mesajlar: 12
Kayıt: 26 Mar 2014 09:53

Re: Programın UAC denetimi yapması

Mesaj gönderen amatorkaan »

Maalesef verdiğiniz çözümler bana çok karışık geldi ve sorunu çözemedim. Bunun daha kolay bir yolu olması gerektiğini düşünüyorum. Delphi 7 kullanıyorum. Daha basit çözümleri olan arkadaşlar yardımcı olabilirse sevinirim. Teşekkürler.
Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Re: Programın UAC denetimi yapması

Mesaj gönderen G.Arkas »

Aşağıda ki dosyaları projenle aynı klasöre koy. Daha sonra Project -> View Source bölümüne gel ve aşağıda ki kodu ekle.

Kod: Tümünü seç

{$R 'ExecutionLevelRequireAdministratorManifest.RES' 'ExecutionLevelRequireAdministratorManifest.rc'}
Bu şekilde uygulaman her zaman admin modunda çalışır.
Dosya ekleri
UAC Manifest.rar
(1.08 KiB) 149 kere indirildi
Resim
Kullanıcı avatarı
warder
Üye
Mesajlar: 255
Kayıt: 10 Mar 2004 04:59

Re: Programın UAC denetimi yapması

Mesaj gönderen warder »

Ya diğer arkadaşların sunduğu gibi doğrudan admin olarak çalıştıracaksınız, ya da önceki yazımda en altta verdiğim microsoft linklerindeki gibi.
Bunun malesef başka çözümü yok. Sistem Microsoft un o da böyle yapabilirsiniz diyor.
Linklerin bir üstünde verdiğim tanımlamalar farklı ihtiyaçlar için farklı yetkiler almak için gerekli tanımlamalar.
O yetkilerin ne olduğu isimlendirme şeklinden anlaşılabilir durumda.
En üstte de nacizane kendi kullanımımdan bir örnek. Admin olup olmadığını if içinde kontrol edip değilse yetki istiyor.
Belki bir bileşen falan vardır bu işleri kolaylaştıran. Onu bilmiyorum.
Kod olarak yazımının size karışık gelmesiyle ilgili bir şey diyemiyorum. Belki de bu konudan henüz uzak durmanız gerektiğinizin işaretidir.
... Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!
Mustafa Kemal Atatürk...
Kullanıcı avatarı
amatorkaan
Üye
Mesajlar: 12
Kayıt: 26 Mar 2014 09:53

Re: Programın UAC denetimi yapması

Mesaj gönderen amatorkaan »

warder nikli arkadaşımız; "Belki de bu konudan henüz uzak durmanız gerektiğinizin işaretidir" diye tavsiyede bulunduğu için tavsiyesine uydum ve belirttiği yol üzerinde çalışmadım. Farklı bir yol denedim ve isteğime ulaştım. Belki ilginen arkadaşlar olur diye çözümü aşağıya aldım. Formun Create olayında "CONTROL_UAC" isimli bir anahtar Registry'e eklenmek isteniyor. Bu kısmı try .. except blogu arasına aldım ki hata vermesin. Sonrasında eğer bu değer yazılmışsa zaten admin olarak çalıştırılmıştır, sorun yok. Yazılmamışsa admin olarak çalıştırılması için kullanıcıyı uyarıyor. Umarım bunu yapmakla warder arkadaşın uyarısını ihlal etmemişimdir :)

Kod: Tümünü seç

procedure TForm1.FormCreate(Sender: TObject);
var
  reg: TRegistry;
begin
  try
    reg := TRegistry.Create;
    reg.RootKey := HKEY_LOCAL_MACHINE;
    reg.LazyWrite := false;
    reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run',false);
    reg.WriteString('CONTROL_UAC','Uac Kontrolü');
  except
    if reg.ValueExists('CONTROL_UAC') = false then ShowMessage('Lütfen Programı Yönetici Olarak Çalıştırınız.')
      else
        begin
          reg.CloseKey;
          reg.free;
        end;
  end;
end;
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Programın UAC denetimi yapması

Mesaj gönderen mrmarman »

Basit ama etkili bir çözüm. Tebrik ediyorum. :bravo:

Samimi söylüyorum; adım adım ilerlemek, ilerlerken de hazıra konmak değil de fikir yürüterek çözüm üreteni gördüğümde çok memnun oluyorum. :)
Resim
Resim ....Resim
Kullanıcı avatarı
warder
Üye
Mesajlar: 255
Kayıt: 10 Mar 2004 04:59

Re: Programın UAC denetimi yapması

Mesaj gönderen warder »

Bende tebrik ederim.
Bu forum gerçekten enteresan.
Online durumunu anlamak için herhangi bir siteye talep gönderme çözümünün yanına, programın admin olarak çalıştırılıp çalıştırılmadığını anlamak için registry kullanmaya çalışma çabası...
Sanıyorum hata bende sadece izleyici olarak kalmalıyım.
Ben sizi meşgul etmeyim. Işığınıza engel olmayım.
Kolay gelsin.
... Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!
Mustafa Kemal Atatürk...
Cevapla