2012-01-04 7 views
11

मैं एनएसआईएस के साथ काफी नया हूं। मैं इंस्टॉलर को चलाने के लिए व्यवस्थापक अनुमतियों का अनुरोध करने का प्रयास कर रहा हूं, क्योंकि यह रजिस्ट्री के साथ थोड़ा सा गड़बड़ करता है। "RequestExecutionLevel" और "MULTIUSER_EXECUTIONLEVEL" के साथ मेरी समस्या यह है कि वे संदर्भ मेनू में "व्यवस्थापक के रूप में चलाएं" चुनते समय भी इंस्टॉलर खोलने से किसी भी गैर-व्यवस्थापक उपयोगकर्ता को बिल्कुल अवरुद्ध करते हैं। मैंने रनएएस डीएलएल का उपयोग करने का प्रयास किया है, लेकिन मुझे "रनएएसडब्लू" फ़ंक्शन में पास किए गए $ कमांड वैरिएबल में क्या रखना है, इसके बारे में एक धागा नहीं मिला है।आप NSIS का उपयोग कर व्यवस्थापक अनुमतियों का अनुरोध कैसे करते हैं?

यहाँ मेरी (सुंदर काट दिया-अप) कोड है:

 StrCpy $0 0 
    StrCpy $1 "" 
    System::Call 'RunAs::GetAdministrators(w r1, *i .r0) i .r2 ? u' 
    System::Alloc 64 
    Pop $4 
    StrCpy $4 $2 
    StrCpy $5 "" 
    loop: 
      IntCmp $0 0 endloop 
      System::Call '*$4(w .r3)' 
      StrCpy $5 "$5|$3" 
    endloop: 
    System::Free $4 ; we free the memory used by the array 
    StrCpy $5 "$5" "" 1 
    !insertmacro MUI_INSTALLOPTIONS_WRITE "Settings.ini" "Field 1" "ListItems" $5 
    !insertmacro MUI_INSTALLOPTIONS_DISPLAY "Settings.ini" 
    !insertmacro MUI_INSTALLOPTIONS_READ $1 "UserPass" "Field 1" "State" 
    !insertmacro MUI_INSTALLOPTIONS_READ $2 "Settings.ini" "Field 2" "State" 
    StrCpy $3 "%%LOGONSERVER%%" 
    StrCpy $3 0 
    StrCpy $4 0 
    System::Call 'RunAs::RunAsW(w r1, w r2, w r3, *w .r4) i .r0 ? u' 
    MessageBox MB_OK $0 
    IntCmp $0 1 success 
    Quit 
    success: 
    !insertmacro MUI_LANGDLL_DISPLAY 

यह का एक बहुत है बस काम और परीक्षण और त्रुटि लगता है। (बीटीडब्ल्यू - मैंने सभी प्रशासकों को प्राप्त करने के लिए एक लूप के माध्यम से भी चलाने की कोशिश की, लेकिन ऐसा लगता है कि डीएलएल केवल 32-बिट मशीनों के लिए था, इसलिए ...)।

वैसे भी, मेरे सवाल यह है:

किसी को भी ("RunAs" का उपयोग या अन्यथा), एक संवाद उपयोगकर्ता नाम और पासवर्ड का अनुरोध खोलने साख की जाँच करें और स्थापना के साथ जारी रखने के लिए केवल अगर वे बाहर की जाँच के लिए एक रास्ता पता है ?

इसके अलावा, मुझे पता है कि एक इंस्टॉलर स्थापित करने का एक तरीका है ताकि यह उस अच्छे ढाल आइकन के साथ आता है जो उपयोगकर्ताओं को यह बताता है कि व्यवस्थापक अनुमति का अनुरोध किया जाएगा। क्या कोई जानता है कि ऐसा कैसे करें?

किसी भी मदद की बहुत सराहना की जाएगी, क्योंकि यह एकमात्र चीज है जो वर्तमान में मेरे ऐप की तैनाती को रोकती है।

+0

"सिस्टम :: ऑलोक 64 " का बिंदु क्या है जब आप पॉप के बाद पॉइंटर को फेंक देते हैं और स्मृति को रिसाव करते हैं। एनएसआईएस हमेशा 32-बिट है, इसलिए लूप के बारे में आपकी टिप्पणी कम समझ में आता है ... – Anders

+0

"वे दोनों कॉन्फ़िगरेशन खोलने से किसी भी गैर-व्यवस्थापक उपयोगकर्ता को पूरी तरह अवरुद्ध करते हैं, भले ही संदर्भ मेनू में" व्यवस्थापक के रूप में चलाएं "का चयन करते समय" यह नहीं है ठीक है! आपका विंडोज संस्करण और यूएसी सेटिंग्स क्या है? – Anders

+0

$ कमांड वेरिएबल वह चीज है जिसे आप निष्पादित करना चाहते हैं, "calc.exe" आदि – Anders

उत्तर

22
Outfile RequireAdmin.exe 
RequestExecutionLevel admin ;Require admin rights on NT6+ (When UAC is turned on) 

!include LogicLib.nsh 

Function .onInit 
UserInfo::GetAccountType 
pop $0 
${If} $0 != "admin" ;Require admin rights on NT4+ 
    MessageBox mb_iconstop "Administrator rights required!" 
    SetErrorLevel 740 ;ERROR_ELEVATION_REQUIRED 
    Quit 
${EndIf} 
FunctionEnd 

Page InstFile 

Section 
SectionEnd 

मूल कोड है जो मैं आमतौर पर यह सुनिश्चित करने के लिए अनुशंसा करता हूं कि इंस्टॉलर एक प्रशासक के रूप में चल रहा है।

आईएमएचओ कस्टम पेज पर क्रेडेंशियल के लिए संकेत देने के लिए समझ में नहीं आता है जब तक कि इंस्टॉल प्रक्रिया के केवल कुछ हिस्सों में व्यवस्थापक पहुंच की आवश्यकता नहीं होती है और दूसरे भाग को उपयोगकर्ता प्रोफ़ाइल तक पहुंच की आवश्यकता होती है। यह आप पर लागू हैं तो आप UAC plug-in पर एक नज़र रखना चाहिए (यह एक बिट का उपयोग करने के जटिल है और यह असंभव अपने exe फ़ाइल ढाल ओवरले आइकन पाने के लिए बनाता है) मैं सही ढंग से नहीं लगता कि RunAs plug-in काम करता है

पर विस्टा + जब यूएसी RequestExecutionLevel admin करता है तो यह काम करने के लिए एक मृत अंत हो सकता है की कोशिश कर रही है ...

recommended way ढाल पाने के लिए exe प्रकट में ऊंचाई अनुरोध करने के लिए है। यदि आप अपनी स्क्रिप्ट में RequestExecutionLevel का उपयोग नहीं करते हैं तो आपके इंस्टॉलर को विरासत इंस्टॉलर के रूप में पहचाना जा सकता है और इसे शील्ड ओवरले भी मिल जाएगा।

Windows Vista में, अगर एक निष्पादन योग्य फ़ाइल लांच करने की आवश्यकता होती, तो निष्पादन के आइकन को एक शील्ड के साथ "स्टाम्प" होना चाहिए इस बात को इंगित करते हैं। एक्जिक्यूटिव के एप्लिकेशन मैनिफेस्ट को "आवश्यकता प्रशासक" को निष्पादन योग्य नामित करने के लिए चिह्नित करना होगा, जिसमें पूर्ण व्यवस्थापकीय पहुंच टोकन की आवश्यकता है। ढाल आइकन ओवरले स्वचालित रूप से निष्पादन योग्य पर भी रखा जाएगा जिन्हें इंस्टॉलर पहचान हेरिस्टिक्स के अनुसार ऊंचाई की आवश्यकता माना जाता है। उदाहरण के लिए, setup.exe नाम की फ़ाइल स्वचालित रूप से एक शील्ड आइकन ओवरले प्राप्त करेगी, भले ही निष्पादन योग्य में एम्बेडेड एप्लिकेशन मैनिफेस्ट न हो।

+1

थेंक्स एंडर्स। वापस अनुरोध करें निष्पादन लेवल w/o RunAs और पृष्ठ के शीर्ष पर "RequestExecutionLevel व्यवस्थापक" को स्थानांतरित करके हल किया गया। अब विंडोज स्वचालित रूप से व्यवस्थापक लॉगिन को संकेत देता है ... –

+0

यह पोस्ट मेरे लिए सहायक था। धन्यवाद, एंडर्स। –

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