2010-01-15 6 views
12

के साथ विफल क्यों होता है मैं व्यवस्थापक समूह में उपयोगकर्ता के रूप में एक प्रक्रिया चला रहा हूं, किसी अन्य प्रक्रिया के लिए प्रक्रिया टोकन प्राप्त करने का प्रयास कर रहा हूं। दूसरी प्रक्रिया प्रशासक समूह में नहीं उपयोगकर्ता द्वारा चलायी जाती है। मैं जिस कोड का उपयोग कर रहा हूं उसका सारांश यहां दिया गया है। इस कोड में पिड गैर-व्यवस्थापक प्रक्रिया की प्रक्रिया आईडी का प्रतिनिधित्व करता है। यह सब विंडोज एक्सपी एसपी 2 और सभी एक ही मशीन पर है। यहां कोई रिमोट एक्सेस नहीं है। OpenProcess के लिएOpenProcessToken ERROR_ACCESS_DENIED

HANDLE handle; 
HANDLE token; 

handle = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,pid); 
token = NULL; 
OpenProcessToken(handle,TOKEN_DUPLICATE,&token); 

संदर्भ यहाँ: http://msdn.microsoft.com/en-us/library/ms684320%28VS.85%29.aspx

OpenProcessToken यहाँ संदर्भ: http://msdn.microsoft.com/en-us/library/aa379295%28VS.85%29.aspx

OpenProcess सफल होता है, लेकिन कोई बात नहीं क्या मैं OpenProcessToken को DesiredAccess तर्क के लिए गुजरती हैं, यह विफल रहता है और GetLastError() वापसी त्रुटि: पहूंच अस्वीकृत। मैंने इस कोड को चलाने की प्रक्रिया के विशेषाधिकारों को समझने के लिए कुछ कोड जोड़े और जितना संभव हो सके सक्षम करने के लिए, साथ ही प्रक्रिया के बारे में जानकारी इकट्ठा करने के लिए जो मैं टोकन प्राप्त करने की कोशिश कर रहा हूं। इसमें OpenProcess से अधिक पहुंच (READ_CONTROL | ACCESS_SYSTEM_SECURITY PROCESS_QUERY_INFORMATION के अतिरिक्त) और GetKernelObjectSecurity (हैंडल) को कॉल करने का अनुरोध शामिल है। यहाँ मैं क्या कर लिया है:

current user: PLEASE_T\dbyron (S-1-5-21-3405506234-1792454352-3826119157-1005) 
current process: group 0: flags: 0x00000007 sid: S-1-5-21-3405506234-1792454352-3826119157-513 (PLEASE_T\None) 
current process: group 1: flags: 0x00000007 sid: S-1-1-0 (\Everyone) 
current process: group 2: flags: 0x0000000F sid: S-1-5-32-544 (BUILTIN\Administrators) 
current process: group 3: flags: 0x00000007 sid: S-1-5-32-545 (BUILTIN\Users) 
current process: group 4: flags: 0x00000007 sid: S-1-5-4 (NT AUTHORITY\INTERACTIVE) 
current process: group 5: flags: 0x00000007 sid: S-1-5-11 (NT AUTHORITY\Authenticated Users) 
current process: group 6: flags: 0xC0000007 sid: S-1-5-5-0-91553 (no account mapping) 
current process: group 7: flags: 0x00000007 sid: S-1-2-0 (\LOCAL) 
SeDebugPrivilege privilege enabled 
SeTakeOwnershipPrivilege privilege enabled 
SeSecurityPrivilege privilege enabled 
SeChangeNotifyPrivilege privilege enabled 
SeBackupPrivilege privilege enabled 
SeRestorePrivilege privilege enabled 
SeSystemtimePrivilege privilege enabled 
SeShutdownPrivilege privilege enabled 
SeRemoteShutdownPrivilege privilege enabled 
SeDebugPrivilege privilege enabled 
SeSystemEnvironmentPrivilege privilege enabled 
SeSystemProfilePrivilege privilege enabled 
SeProfileSingleProcessPrivilege privilege enabled 
SeIncreaseBasePriorityPrivilege privilege enabled 
SeLoadDriverPrivilege privilege enabled 
SeCreatePagefilePrivilege privilege enabled 
SeIncreaseQuotaPrivilege privilege enabled 
SeUndockPrivilege privilege enabled 
SeManageVolumePrivilege privilege enabled 
SeImpersonatePrivilege privilege enabled 
SeCreateGlobalPrivilege privilege enabled

मैं हर विशेषाधिकार संभव प्राप्त करने की कोशिश की है, और मुझे लगता है कि समूह की जानकारी ऊपर से पता चलता है कि इस प्रक्रिया OpenTokenProcess बुला प्रशासक समूह का एक सदस्य है।

यहाँ GetKernelObjectSecurity से जानकारी दी गई:

control(SE_DACL_PRESENT | SE_SELF_RELATIVE, 0x00008004) 
owner sid: S-1-5-21-3405506234-1792454352-3826119157-2807 (PLEASE_T\dummyusr) 
group sid: S-1-5-21-3405506234-1792454352-3826119157-513 (PLEASE_T\None) 
grant: mask(PROCESS_ALL_ACCESS, 0x001F0FFF), flags(0x00000000): S-1-5-21-3405506234-1792454352-3826119157-2807 (PLEASE_T\dummyusr) 
grant: mask(PROCESS_ALL_ACCESS, 0x001F0FFF), flags(0x00000000): S-1-5-32-544 (BUILTIN\Administrators) 
grant: mask(PROCESS_ALL_ACCESS, 0x001F0FFF), flags(0x00000000): S-1-5-18 (NT AUTHORITY\SYSTEM)

तो ऐसा लगता है कि dummyusr (गैर व्यवस्थापक) प्रक्रिया प्रशासक समूह के लिए उपयोग की अनुमति देता है। यह संभव है कि मैं गलत व्याख्या कर रहा हूं तो क्यों OpenProcessToken ERROR_ACCESS_DENIED के साथ विफल रहता है? मैंने TOKEN_DUPLICATE को TOKEN_QUERY में बदलने का प्रयास किया है लेकिन यह परिणाम नहीं बदलता है।

क्या मुझे विशेषाधिकार मिला है? इस प्रक्रिया के लिए मुझे एक्सेस टोकन तक पहुंचने से इनकार कर दिया जाएगा? मैंने इसे किसी मशीन पर एंटी वायरस सॉफ़्टवेयर के साथ करने की कोशिश की है और फिर भी मुझे एक ही परिणाम मिल रहा है।

मैंने सिस्टम संदर्भ में यह चलने का भी प्रयास किया। उस मामले में वर्तमान प्रक्रिया के बारे में जानकारी है:

current user: NT AUTHORITY\SYSTEM (S-1-5-18) 
current process: group 0: flags: 0x0000000E sid: S-1-5-32-544 (BUILTIN\Administrators) 
current process: group 1: flags: 0x00000007 sid: S-1-1-0 (\Everyone) 
current process: group 2: flags: 0x00000007 sid: S-1-5-11 (NT AUTHORITY\Authenticated Users)

ध्यान दें कि झंडे BUILTIN \ Administrators समूह के लिए थोड़े अलग हैं। व्यवस्थापक प्रक्रिया में 0xF था और सिस्टम प्रक्रिया में 0xE था। http://msdn.microsoft.com/en-us/library/aa379624%28VS.85%29.aspx से, 0x1 बिट का मतलब SE_GROUP_MANDATORY है जो यहां प्रासंगिक प्रतीत नहीं होता है।

डिफ़ॉल्ट रूप से प्रणाली संदर्भ प्रक्रिया भी कुछ अतिरिक्त विशेषाधिकार था:

SeAuditPrivilege 
SeCreatePermanentPrivilege 
SeLockMemoryPrivilege 
SeTcbPrivilege

लेकिन मैं उन सब को अक्षम और OpenProcessToken अभी भी प्रणाली संदर्भ प्रक्रिया में सफल रहा।

आपकी मदद के लिए धन्यवाद।

+0

(+1) अच्छा सवाल। जब मैं एक नई विंडोज़ सेवा लिखता हूं तो मुझे हर कुछ महीनों में समस्याओं का सामना करना पड़ता है - और जाहिर है जब भी मैं नृत्य भूल जाता हूं। –

+0

क्या आपको कोई संकल्प मिला? (स्थानीय सेवा के रूप में चलाने के अलावा) – vdk

उत्तर

1

पहले विवरण में जाने के बजाय, क्या आप उन्मूलन के मार्ग पर गए हैं? - प्रक्रिया को LOCAL_SYSTEM के रूप में चलाएं और देखें कि यह चाल है या नहीं। आखिरकार अगर भगवान ऐसा नहीं कर सकते तो कोई भी नहीं कर सकता: पी।

+0

अच्छा विचार। मैंने कोशिश की और निश्चित रूप से यह सिस्टम खाते के रूप में काम किया। दुर्भाग्यवश कोई प्रकाश बल्ब नहीं चला कि व्यवस्थापक खाता क्यों काम नहीं करता है। – dbyron

+0

इन मामलों में एक और चिपकने वाला बिंदु यह है कि आप लक्षित कंप्यूटर से कैसे जुड़े हुए हैं। रिमोट डेस्कटॉप कनेक्शन में डिफ़ॉल्ट रूप से "कंसोल एक्सेस" नहीं है। यदि आप वास्तव में दूरस्थ रूप से विकास कर रहे हैं: मैं/कंसोल या/व्यवस्थापक स्विच (विंडोज़ के संस्करण के आधार पर) को पुनः प्राप्त करूंगा - जिसे आप आरडीपी क्लाइंट को कनेक्शन स्ट्रिंग के माध्यम से प्रदान कर सकते हैं। –

+0

यह सब एक मशीन पर है। यहां कोई रिमोट एक्सेस नहीं है। – dbyron

0

मुझे लगता है कि लक्षित प्रक्रिया का SECURITY_DESCRIPTOR केवल सिस्टम उपयोगकर्ता को अपनी प्रक्रिया टोकन खोलने की अनुमति देता है। इसका मतलब दुख की बात है कि ऐसा कुछ भी नहीं है जो आप कर सकते हैं।

-1

हां एक समाधान है जिसे आप सेवा के रूप में सेवा या आपके ऐप का एक उदाहरण चला सकते हैं। इस तरह से आप प्रणाली के रूप में चल रहा अपना कोड प्राप्त होगा ....

एक अन्य विकल्प (लेकिन अधिक घुसपैठ) के बाद से आप पहले से ही व्यवस्थापक हैं, तो लक्ष्य प्रक्रिया एसीएल बदलने के लिए है ....