2014-11-03 21 views
5

Uygulamam her zaman "yönetici" ayrıcalıklarına ihtiyaç duymaz ve çoğu zaman geçerli kullanıcı olarak çalışır. Herhangi bir yol var mı, programım zaten çalıştıktan sonra çalışma zamanında UAC atarak özelleri arttırabilir miyim? Bu sadece ve ne zaman özel ihtiyacım olduğunda olacak. Yüksek özel kişilerle başlamak zorunda kalmak yerine.Çalışma zamanında Yürütme Ayrıcalığı (Windows API C/C++)

Ben teknik, bildirim dosyası vb "runas" biliyorum ama süreç oluşturulur ve çalışma anında, on-demand

cevap

9

Tebrikler, bu UAC çalışmak üzere tasarlanmıştır tam olarak nasıl olduğunu ve bir şey önce bütün bunlar çoğu uygulama geliştiricileri ya hiç ya da çok korkutmak için çok korkmuş gibi düşünmeye devam ediyorlar

Özetle, ayrı bir COM nesnesinde (DLL'de bulunan) yükseltmeye gereksinim duyan kodu koyarsınız. here tarif edilen metodu kullanarak yükseltilmiş örneği.

HRESULT CoCreateInstanceAsAdmin(HWND hwnd, REFCLSID rclsid, REFIID riid, __out void ** ppv) 
{ 
    BIND_OPTS3 bo; 
    WCHAR wszCLSID[50]; 
    WCHAR wszMonikerName[300]; 

    StringFromGUID2(rclsid, wszCLSID, sizeof(wszCLSID)/sizeof(wszCLSID[0])); 
    HRESULT hr = StringCchPrintf(wszMonikerName, sizeof(wszMonikerName)/sizeof(wszMonikerName[0]),\ 
     L"Elevation:Administrator!new:%s", wszCLSID); 
    if (FAILED(hr)) 
     return hr; 
    memset(&bo, 0, sizeof(bo)); 
    bo.cbStruct = sizeof(bo); 
    bo.hwnd = hwnd; 
    bo.dwClassContext = CLSCTX_LOCAL_SERVER; 
    return CoGetObject(wszMonikerName, &bo, riid, ppv); 
} 

anahtar lakap adına Elevation:Administrator!new: öneki. Bu, yükselme isteminin tetiklenmesine neden olur ve sonuçta ortaya çıkan COM nesnesi yükseltilmiş bir simgeyle oluşturulur.

+0

Awesome! Teşekkürler! Tam da aradığım şey! – MathOldTimer

İlgili konular