2012-07-20 27 views
20

Bunu yapabilmem için birkaç saatliğine takıldım. Orada bana doğru yönde işaret bağlantıları zaten şunlardır:Yönetici haklarına sahip olmayan bir uygulama nasıl çalıştırılır

Ama sorunun basit bakış :) biri yardımcı olabilir düşündüm.

+0

['LogonUser'] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa378184 (v = vs.85) .aspx) iyi çalışmalı, düşünürdüm. Açıklamada doğrudan süreç oluşturulmasından bahseder. – chris

+0

.... sorunuz nedir? –

+2

Hayır, bu aynı sorunla karşılaşan insanlar için bir çözüm. – Samuel

cevap

27

Gerçek sorun: (Wikipedia'dan: http://en.wikipedia.org/wiki/User_Account_Control)

Manifest'inde "requireAdministrator" olarak işaretlenmiş bir yürütülebilir CreateProcess kullanarak olmayan bir yükseltilmiş sürecinden başlatılamaz(). Bunun yerine ERROR_ELEVATION_REQUIRED döndürüldü. Bunun yerine ShellExecute() veya ShellExecuteEx() kullanılmalıdır.

(btw, ERROR_ELEVATION_REQUIRED hata == 740)

Çözüm: (aynı site)

aynı "Runas" fiil bir ShellExecute eklenebilir doğal bir Win32 uygulamasında() veya ShellExecuteEx() çağrısı.

ShellExecute(hwnd, "runas", "C:\\Windows\\Notepad.exe", 0, 0, SW_SHOWNORMAL);

Bu da faydalı olabilir: (kaynak: http://mark.koli.ch/2009/12/uac-prompt-from-java-createprocess-error740-the-requested-operation-requires-elevation.html)

2 - Temel

Tamam UAC Akış, bunu içine kazmak önce bunu, Tahmin etmiştim UAC'nin farkında olduğu bir uygulamanın temel akışını ve her şeyin birbirine nasıl uyduğunu açıklamaya yardımcı olun. Normalde, uygulamanız ayrıcalıklı olmayan bir kullanıcı olarak çalışır. Ancak, bazen bir yönetici (ne olursa olsun) olması gerekir. Yani, burada temel fikir sahte kodda verilmiştir:

if(0 == CreateProcess(argv[2], params, NULL, NULL, false, 0, NULL, NULL, &si, &pi)) { 
     //runas word is a hack to require UAC elevation 
     ShellExecute(NULL, "runas", argv[2], params, NULL, SW_SHOWNORMAL); 
} 

Ve tıpkı tamlanışını aşkına - ShellExecute ve CreateProcess MSDN bağlantıları:

int main (int argc, char **argv) { 

    HRESULT operation = tryToDoSomethingPrivileged(); 

    if (operation == ACCESS_DENIED && !alreadyElevated) { 

    // Spawn a copy of ourselves, via ShellExecuteEx(). 
    // The "runas" verb is important because that's what 
    // internally triggers Windows to open up a UAC prompt. 
    HANDLE child = ShellExecuteEx(argc, argv, "runas"); 

    if (child) { 
     // User accepted UAC prompt (gave permission). 
     // The unprivileged parent should wait for 
     // the privileged child to finish. 
     WaitForSingleObject(child, INFINITE); 
     CloseHandle(pid); 
    } 
    else { 
     // User rejected UAC prompt. 
     return FAILURE; 
    } 

    return SUCCESS; 

    } 

    return SUCCESS; 

} 
Nihayet

, bunu bu şekilde yaptık nasıl :

http://msdn.microsoft.com/en-us/library/bb762153%28v=vs.85%29.aspx

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

+0

Bu aynı yaklaşımı benim uygulamalardan birinde kullandım (tek bir ayrıcalıklı görev gerçekleştirmek için "runas" aracılığıyla kendisinin yükseltilmiş bir kopyasının üretilmesi, burada doğmuş çocuk işleminin komut satırının ne yapacağını söylemesi) ve Microsoft, insanların UAC yükseltmesini kullanmayı tercih etmiyor, ana .exe'deki bir UAC bildiriminin aşırı yüklendiği durumlarda işe yaramıyor. Microsoft, ayrıcalıklı görevi kendi .exe'sinde, üzerinde UAC manifestosuyla veya COM Elevation monikeri aracılığıyla başlatılan kendi COM nesnesinde olmasını tercih eder. –

+3

ShellExecuteEx bir argüman alır, SHELLEXECUTEINFO'ya bir işaretçi. http://msdn.microsoft.com/tr-tr/library/windows/desktop/bb762154(v=vs.85).aspx –

+1

"runas" işleminin, diğerlerinde, belgelerde belirtilmediğini belirttim (ShellExecute'dan): Bu sayfadaki bazı kullanıcılar bile güvenli olduğu takdirde tartışmalıdır. İşe yaradığı gerçeği, o kadar güvenilir değildir (elden kontrol etmeniz gerektiğinden ve bazı durumlarda işe yaramayabilir). Runas'ın güvenilirliği hakkında bazı referansları olan biri var mı? – reallynice