2010-02-08 20 views
18

मेरे पास प्रोसेस आईडी है, मैं इसकी प्रक्रिया संभाल लेना चाहता हूं।प्रक्रिया आईडी से प्रक्रिया संभाल कैसे प्राप्त करें?

क्या इसके लिए कोई एपीआई उपलब्ध है।

मैंने ओपनप्रोसेस का उपयोग करने की कोशिश की लेकिन यह न्यूल, और GetLastError = 0 लौटाता है।

यह मैं Vista पर कोशिश कर रहा हूं।

मुझे लगता है कि मुझे OpenProcess का उपयोग करने से पहले SeDebugPrivilege को सक्षम करने की आवश्यकता है। लेकिन SeDebugPrivilege को सक्षम करने के लिए मुझे इसकी प्रक्रिया संभाल प्राप्त करने की आवश्यकता है।

+0

आप वर्णन कर सकते कि आपको यह की ज़रूरत है? – dirkgently

+0

मैंने ya – bdd

उत्तर

22
OpenProcess(PROCESS_ALL_ACCESS, TRUE, procId); 

आपको लगता है कि आप एक वैध प्रक्रिया आईडी का उपयोग कर रहे हैं, और आप आप इस प्रक्रिया से अनुरोध अधिकारों का उपयोग की अनुमति दी रहे हैं कि सत्यापित करना होगा।

+0

procId के लिए डीबग विशेषाधिकार कोड जोड़ा है। – anand

+11

PROCESS_ALL_ACCESS के लिए न पूछें, आपको सुरक्षित इंस्टॉल पर इसे प्राप्त करने की संभावना नहीं है। केवल वही मांगें जो आपको चाहिए। –

+5

ठीक है, SYNCHRONIZE के लिए पूछने का प्रयास करें, जो लगभग कभी असफल नहीं होगा। फिर वहां से अनुरोधित अनुमति को बढ़ाएं। –

9

क्या आप यह देख रहे हैं?

HANDLE processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processId); 
CloseHandle(processHandle); 

इसके अलावा, यहां कुछ कोड है जो मैं डीएलएल इंजेक्शन से पहले डीबग निजीकरण सेट करने के लिए उपयोग करता हूं।

void Loader::EnableDebugPriv(void) 
{ 
    HANDLE    hToken; 
    LUID    SeDebugNameValue; 
    TOKEN_PRIVILEGES TokenPrivileges; 

    if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 
    { 
     if(LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &SeDebugNameValue)) 
     { 
      TokenPrivileges.PrivilegeCount    = 1; 
      TokenPrivileges.Privileges[0].Luid   = SeDebugNameValue; 
      TokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 

      if(AdjustTokenPrivileges(hToken, FALSE, &TokenPrivileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL)) 
      { 
       CloseHandle(hToken); 
      } 
      else 
      { 
       CloseHandle(hToken); 
       throw std::exception("Couldn't adjust token privileges!");    
      } 
     } 
     else 
     { 
      CloseHandle(hToken); 
      throw std::exception("Couldn't look up privilege value!"); 
     } 
    } 
    else 
    { 
     throw std::exception("Couldn't open process token!"); 
    } 
} 

मैंने सफलता के साथ विंडोज विस्टा पर उपरोक्त कोड का उपयोग किया है।

+0

यह विंडो हैंडल वापस करेगा, प्रक्रिया संभाल नहीं मैं प्रोसेस आईडी – anand

+1

से प्रोसेस हैंडल की तलाश में हूं क्योंकि मैट जॉइनर पहले ही कह चुका है ... ऊपर देखें। – bdd

1

आपको ऊंचे विशेषाधिकारों की आवश्यकता होगी। इसी तरह के प्रश्न here पर भी देखें।

1

मेरे पास वर्णित सटीक एक ही समस्या थी: ओपनप्रोसेस() == न्यूल और गेटलास्टरर() == 0. सामान्य भाषा रनटाइम समर्थन सेटिंग होने के लिए बाहर निकला, "शुद्ध" पर सेट किया जाना चाहिए था "सामान्य"। मुझे खोजने के लिए उम्र ले ली।

लिए VS2010 C++ गोटो -> प्रोजेक्ट गुण -> विन्यास गुण -> C/C++ -> सामान्य

0

आप एक प्रक्रिया पहचानकर्ता है, तो आप OpenProcess कार्यप्रणाली को कॉल करके प्रक्रिया संभाल प्राप्त कर सकते हैं । ओपनप्रोसेस आपको हैंडल के एक्सेस अधिकार निर्दिष्ट करने और इसे विरासत में प्राप्त करने में सक्षम बनाता है।

FYI करें:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms684868(v=vs.85).aspx

संबंधित मुद्दे