2012-02-06 13 views
8

मैं एक मैक्रो रिकॉर्ड करने के लिए एक डेल्फी मॉड्यूल है, जो एक सूत्र में एक हुक सेट तैयारी कर रहा हूँ के तहत विफल रहता है ERROR_ACCESS_DENIED के साथ विफल रहता है। मुझे Google (this) में संदर्भित किया गया है (that)। बोली:SetWindowsHookEx Vista/Windows 7

एक कम विशेषाधिकार प्रक्रिया नहीं कर सकते हैं: ... उपयोग जर्नल हुक एक उच्च विशेषाधिकार प्रक्रिया की निगरानी करने के लिए। व्यवस्थापक के रूप में

  1. भागो आवेदन:

सफलता के बिना की कोशिश की। शायद धागा मुख्य थ्रेड की तुलना में कम विशेषाधिकारों के साथ शुरू हो गया है (हालांकि मैं 100% सुनिश्चित नहीं हूं)

  • व्यवस्थापक सुरक्षा संदर्भ के साथ धागे का प्रतिरूपण या तो मदद नहीं करता है।
  • कोड नमूना:

    if LogonUser(PWideChar(sAdminUser), PWideChar(sDomain), PWideChar(sPwd), 
          LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, hToken) then 
    begin 
        if not ImpersonateLoggedOnUser(hToken) then 
        raise Exception.Create('Error impersonating the user'); 
    end; 
    FHandleRec := SetWindowsHookEx(WH_JOURNALRECORD, FRecordProc, HInstance, 0); 
    

    LogonUser और ImpersonateLoggedOnUser त्रुटियों के बिना निष्पादित।

    अन्य संभावनाओं की कोशिश करना:

    1. बारी यूएसी बंद स्थायी रूप से। यह मदद करता है, लेकिन मैं मॉड्यूल उपयोगकर्ताओं को ऐसा करने के लिए मजबूर नहीं कर सकता।
    2. एक मॉड्यूल ग्राहक एक एप्लिकेशन पर हस्ताक्षर करता है और इसे विश्वसनीय स्थान पर रखता है। कोशिश नहीं की, लेकिन यह उपयोगकर्ताओं के लिए मॉड्यूल उपयोग को मूल रूप से जटिल करता है।
    3. मॉड्यूल को कुछ हस्ताक्षरित एप्लिकेशन में रखें और EXE वितरित करें। वह कुछ मूल कार्यक्षमता तोड़ देगा।

    क्या आप कृपया वीजा/विंडोज 7 के तहत हुक सेट कर रहे कोड को दिखा सकते हैं या कामकाजी समाधान का सुझाव दे सकते हैं?

    +2

    आपको उपयोगकर्ता को ऊंचाई अनुमति के लिए पूछने के लिए एक मैनिफेस्ट एम्बेड करना होगा। मुझे संदेह है कि "मूल रूप से जटिल" श्रेणी में पड़ता है। –

    उत्तर

    8

    that article के "उपयोगकर्ता इंटरफ़ेस विशेषाधिकार अलगाव" खंड को और अधिक सावधानी से पढ़ें। यह अखंडता स्तर का संदर्भ दे रहा है, उपयोगकर्ता अनुमति नहीं। यही कारण है कि किसी अन्य उपयोगकर्ता का प्रतिरूपण समस्या को हल नहीं करता है। अखंडता स्तर स्थापित किया गया है जब प्रक्रिया पहले शुरू होती है और कोड में गतिशील रूप से परिवर्तित नहीं किया जा सकता है।

    उपयोगकर्ता इंटरफ़ेस विशेषाधिकार अलगाव (UIPI) तंत्र एक खाता ही इंटरैक्टिव डेस्कटॉप पर एक प्रशासक की तुलना में कम के रूप में चल प्रक्रियाओं से एक पूर्ण व्यवस्थापक के रूप में प्रक्रिया चल को अलग करने में मदद करता है कि से एक है। यूआईपीआई विंडोिंग और ग्राफिक्स उपप्रणाली के लिए विशिष्ट है, जिसे USER के नाम से जाना जाता है, जो विंडोज़ और उपयोगकर्ता इंटरफ़ेस नियंत्रणों का समर्थन करता है।यूआईपीआई एक संदेश से इनपुट को उच्च विशेषाधिकार प्रक्रिया में भेजने के लिए विंडोज संदेशों का उपयोग करके से कम विशेषाधिकार एप्लिकेशन को रोकता है। एक प्रक्रिया से दूसरी प्रक्रिया में इनपुट भेजना उपयोगकर्ता को कीबोर्ड या माउस क्रिया प्रदान करने के बिना किसी अन्य प्रक्रिया में इनपुट इंजेक्ट करने की अनुमति देता है।

    विंडोज विस्टा यूजर इंटरफेस एक पदानुक्रमित फैशन में विशेषाधिकार स्तर के एक सेट को परिभाषित करके यूआईपीआई लागू करता है। स्तर की प्रकृति ऐसी है कि उच्च विशेषाधिकार स्तर निचले स्तर पर चल रहे अनुप्रयोगों को विंडो संदेश भेज सकते हैं। हालांकि, निम्न स्तर उच्च स्तर पर चल रहे एप्लिकेशन विंडो पर विंडो संदेश नहीं भेज सकते हैं।

    उपयोगकर्ता इंटरफ़ेस विशेषाधिकार स्तर प्रक्रिया स्तर पर है। जब प्रक्रिया शुरू की जाती है, तो उपयोगकर्ता उपप्रणाली सबसिस्टम में प्रक्रिया की सुरक्षा पहुंच टोकन में असाइन किए गए डेस्कटॉप अखंडता स्तर को निर्धारित करने के लिए सुरक्षा में कॉल करती है। जब प्रक्रिया बनाई जाती है और परिवर्तन नहीं होता है तो डेस्कटॉप अखंडता स्तर को सुरक्षा उपप्रणाली द्वारा सेट किया जाता है। इसलिए, उपयोगकर्ता इंटरफ़ेस विशेषाधिकार स्तर को द्वारा उपयोगकर्ता उपप्रणाली द्वारा भी सेट किया जाता है जब प्रक्रिया बनाई जाती है और परिवर्तित नहीं होती है।

    मानक उपयोगकर्ता द्वारा संचालित सभी एप्लिकेशन एक ही उपयोगकर्ता इंटरफ़ेस विशेषाधिकार स्तर हैं। यूआईपीआई उसी विशेषाधिकार स्तर पर अनुप्रयोगों के बीच विंडो मैसेजिंग के व्यवहार में हस्तक्षेप या परिवर्तन नहीं करता है। UIPI यदि कोई उपयोगकर्ता व्यवस्थापक समूह का एक सदस्य है और एक मानक उपयोगकर्ता (कभी कभी एक फ़िल्टर किए गए पहुँच टोकन के साथ एक प्रक्रिया के रूप में) के रूप में आवेदन पत्र चल रहा हो सकता है और यह भी के लिए प्रभाव में आता है एक पूर्ण व्यवस्थापक के साथ चल रहे प्रक्रियाओं पर उसी डेस्कटॉप पर टोकन तक पहुंचें। यूआईपीआई नीचे सूचीबद्ध व्यवहार को अवरुद्ध करके उच्च विशेषाधिकार प्रक्रियाओं तक पहुंचने से से कम विशेषाधिकार प्रक्रियाओं को रोकता है।

    • उच्च विशेषाधिकार प्रक्रिया की निगरानी के लिए जर्नल हुक का उपयोग करें।

    this article के अनुसार, अपने अनुप्रयोग एक यूएसी प्रकट कि requestedExecutionLevel=requireAdministrator और uiAccess=True दोनों को निर्दिष्ट की जरूरत है। UIAccess सही महत्वपूर्ण है:

    UIAccess = "true" में requestedPrivileges विशेषता निर्दिष्ट करके, आवेदन UIPI प्रतिबंध बायपास करने के लिए ... कि UIAccess अधिकारों के साथ शुरू की है एक प्रक्रिया एक आवश्यकता बताते हुए है:

    • जर्नल हुक सेट कर सकते हैं।
    +0

    रेमी, उत्तर के लिए बहुत बहुत धन्यवाद। मान लीजिए कि मेरे पास आउट-ऑफ-प्रोसेस COM सर्वर है - uiAccess = True के साथ हस्ताक्षरित और प्रकट exe। सर्वर हुक प्रक्रियाओं को सेट करता है और COM कॉलबैक के माध्यम से उपयोगकर्ता एप्लिकेशन के साथ डेटा का आदान-प्रदान करता है। इसलिए, सभी प्रसंस्करण अभी भी उपयोगकर्ता एप्लिकेशन द्वारा किया जाता है।प्रश्न: जब एक मानक यूआई आवेदन (हस्ताक्षरित नहीं है और अधिकार ऊंचाई के बिना चल रहा है) ऐसे COM सर्वर का उपयोग करता है, तो क्या सर्वर अभी भी जर्नल हुक सेट करने में सक्षम होगा? – AlexeyDaryin

    +0

    @AlexeyDaryin: जैसा कि इसके नाम से तात्पर्य है, एक आउट-ऑफ-प्रोसेस COM सर्वर अपनी प्रक्रिया में चलता है। मानक ऐप की प्रक्रिया के अधिकारों का COM सर्वर की प्रक्रिया के अधिकारों पर कोई प्रभाव नहीं पड़ेगा। आपको निम्न-अधिकार प्रक्रियाओं को कनेक्ट करने और अपने COM सर्वर का उपयोग करने की अनुमति देने के लिए 'CoInitializeSecurity()' का उपयोग करने की आवश्यकता हो सकती है। –

    +0

    ठीक है। लेकिन क्या यह समाधान मॉड्यूल उपयोग सरलीकरण बिंदु से उचित दिखता है? या कोई अन्य विकल्प? – AlexeyDaryin