13

द्वारा आदेश सक्रिय निर्देशिका स्नैप-इन में में एक नया संपत्ति पेज स्थापित करने के लिए में, मैं W2K8 R2 (as documented by Microsoft)कैसे कुंजी स्वयं एक रजिस्ट्री में लिखने के लिए TrustedInstaller

HKEY_LOCAL_MACHINE \ SOFTWARE \ की निम्न रजिस्ट्री कुंजी में लिखने की ज़रूरत Microsoft \ एमएमसी \ SnapIns {E355E538-1C2E-11D0-8C37-00C04FD8FE93} \ NodeTypes

यह कुंजी TrustedInstaller नामक एक विशेष उपयोगकर्ता द्वारा ही किया जाता है। मुझे एनईटी के आसपास बहुत सारी चीजें मिलीं।

  1. मैं उपयोगकर्ता विशेषाधिकार स्वामित्व लेने के लिए दे:

    पल यहाँ पर जिस तरह से यह (उपयोगकर्ता व्यवस्थापक समूह के सदस्य है) निम्न कर काम करता है।

  2. उपयोगकर्ता स्वामित्व
  3. ले उपयोगकर्ता रजिस्ट्री लिखने
  4. उपयोगकर्ता व्यवस्थापक समूह के स्वामित्व दे।

मेरी परियोजना सी # में पूरी तरह से लिखी गई है और दो चीजें हैं जिन्हें मैं पसंद नहीं कर रहा हूं।

  • मैं Win32 AdjustTokenPrivileges API को कॉल करने के लिए इंटरऑप सर्विसेज का उपयोग करता हूं। क्या किसी को शुद्ध सी # में ऐसा करने का तरीका पता है?
  • अंत में ट्रस्टेड इंस्टालर अब कुंजी का मालिक नहीं है, और मैं उसे स्वामित्व नहीं दे पा रहा हूं, वह पूर्ण नियंत्रण रखता है, लेकिन मैं नहीं चाहता कि मेरा सर्वर मेरे स्नैप की स्थापना के बाद दूषित हो -इन।

तो मेरा सवाल है: क्या मुझे कुछ याद आती है, क्या ऐसी कुंजी को संशोधित करने के लिए एक दस्तावेज तरीका है जिसे संशोधित के रूप में दस्तावेज किया गया है?

इसके बारे में Stack overflow question मौजूद है, इसका उत्तर है कि ट्रस्टेड इंस्टालर स्वामित्व का अर्थ है कि कुंजी सिस्टम स्थापना का हिस्सा है और एप्लिकेशन स्थापना नहीं है। मेरे लिए यदि माइक्रोसॉफ्ट दस्तावेज करता है कि कुंजी को कैसे संशोधित किया जाए तो यह एप्लिकेशन इंस्टॉलेशन है।

अग्रिम धन्यवाद।

उत्तर

5

तो मुझे मेरी समस्या में से एक मिला।

जब आप संसाधन पर स्वामित्व लेना चाहते हैं तो आप SeTakeOwnershipPrivilege को सक्षम करने के लिए जोड़ते हैं, यह आपको मालिक एसआईडी को बदलने की अनुमति देता है। लेकिन नया मालिक सिड कॉलर के टोकन में होना चाहिए, साथ ही, सिड में SE_GROUP_OWNER विशेषता होनी चाहिए। तो मेरे मामले में मैं एस 1-5-80-956008885-3418522649-1831038044-1853292631-2271478464 (TrustedInstaller) को सिड मालिक वापस बदलने के लिए सक्षम नहीं था। मैं स्वामित्व लेने या समूह "प्रशासक" को स्वामित्व देने में सक्षम था। मुझे पता चलता है कि काम का एक राजा है जिसके आसपास आप मालिक के रूप में किसी भी मनमानी उपयोगकर्ता को असाइन कर सकते हैं, भले ही इसके एसआईडी टोकन में नहीं है। SeRestorePrivilege विशेषाधिकार है कि है प्रशासकों और बैकअप ऑपरेटरों को दी गई है, लेकिन नहीं डिफ़ॉल्ट रूप से सक्षम होना चाहिए। इसे परेशान करने से मुझे ट्रस्टेड इंस्टालर को स्वामित्व वापस देने की अनुमति मिलती है।

तो यह काम करता है निम्न कार्य (उपयोगकर्ता व्यवस्थापक समूह के सदस्य है):

  1. मैं उपयोगकर्ता विशेषाधिकार स्वामित्व लेने के लिए और के विशेषाधिकार सक्षम बहाल
  2. उपयोगकर्ता स्वामित्व
  3. लेने देना
  4. उपयोगकर्ता रजिस्ट्री
  5. उपयोगकर्ता लिखने पिछले मालिक TrustedInstaller के स्वामित्व दे।

मैं InteropServices का उपयोग Win32 AdjustTokenPrivileges एपीआई कॉल करने के लिए, और यह सी # में यह करने के लिए एक ही रास्ता होने लगता है

मैं जल्द ही अपने ब्लॉग पर कि वापस TrustedInstaller के स्वामित्व देने की अनुमति एक छोटा सा उपकरण पोस्ट करेंगे ।


संपादित: देरी मैं सिर्फ यह भूल जाते हैं, आप Gist पर कोड प्राप्त कर सकते हैं के लिए खेद है।

+0

+1, SeRestorePrivilege एक मणि है। – ongle

+0

कोई भी मौका आपके पास ब्लॉग पोस्ट या नमूना कोड है? मैं इसे घंटों तक काम करने की कोशिश कर रहा हूं। – Laoujin

+1

@Laoujin I finaly ने गीस्ट पर कोड डाला, मुझे उम्मीद है कि यह मदद करता है। – JPBlanc

3

यदि आप किसी MSI इंस्टॉलर में Registry table का उपयोग करते हैं तो आप समस्याओं के बिना प्रविष्टि लिखने में सक्षम होना चाहिए। ऐसा इसलिए है क्योंकि स्थापना प्रक्रिया TrustedInstaller खाते के अंतर्गत की जाती है (आपको स्वामित्व बदलने की आवश्यकता नहीं है)।

संपादित करें: ऐसा लगता है कि आप Windows सुरक्षा प्रणाली के अंतर्गत एक रजिस्ट्री कुंजी में लिखने की कोशिश कर रहे हैं। TrustedInstaller खाता इस मामले में कोई फर्क नहीं पड़ता।

असल में, एक नियमित एमएसआई उस कुंजी में नहीं लिख सकता क्योंकि यह विंडोज द्वारा संरक्षित है। संपत्ति पृष्ठ को स्थापित करने के लिए आपको एक और तरीका ढूंढना होगा।

+0

मैं एक MSI की रजिस्ट्री प्रविष्टि दृश्य स्टूडियो में एक "deployement स्थापना परियोजना" 10 I'am पुन: प्रयास पर जाकर, लेकिन मेरी पहली परीक्षा में यह काम नहीं कर रहा था उत्पन्न का उपयोग कर यह करने के लिए प्रयास करें। क्या मुझे ओर्का के साथ टेबल में कुछ विशेष निर्दिष्ट करना है? – JPBlanc

+0

तो मैंने इसे फिर से परीक्षण किया। यहाँ मेरी एमएसआई 'की रजिस्ट्री तालिका _2D2C089689924663A0BDAAE6CFE4E160 2 सॉफ्टवेयर \ Microsoft \ एमएमसी \ SnapIns \ {E355E538-1C2E-11D0-8C37-00C04FD8FE93} \ NodeTypes \ {3bcd9db8-f84b-451c-952f-6c52b81f9ec6} * C__2D2C089689924663A0BDAAE6CFE4E160' आप कर रहे हैं है आपके दावे का यकीन है? – JPBlanc

+0

इंस्टॉल के दौरान क्या होता है? क्या आपने यह देखने के लिए लॉग बनाया था कि रजिस्ट्री प्रविष्टि को कैसे प्रबंधित किया जाता है? –

3

यदि आप एक व्यवस्थापक के रूप में कार्यक्रम चलाते हैं या SE_RESTORE_NAME विशेषाधिकार आप enable the privilage कर सकते हैं और फिर REG_OPTION_BACKUP_RESTORE ध्वज के साथ RegCreateKeyEx का उपयोग कर रहा किसी अन्य उपयोगकर्ता ('requireAdministrator' प्रकट में यूएसी निष्पादन स्तर के रूप में सक्षम करने के लिए मत भूलना)। आप RegOpenKeyEx (ulOptions पैरामीटर देखें) में उसी ध्वज का उपयोग कर सकते हैं, लेकिन यह अनियंत्रित है और मैं आपको RegCreateKeyEx का उपयोग करने के लिए बेहतर अनुशंसा करता हूं।उदाहरण के लिए RegSetValueEx के संबंध में मूल्य को सेट करने के लिए वापस किए गए कुंजी हैंडल का उपयोग किया जा सकता है। जिस तरह से आप कोई रजिस्ट्री कुंजी सेट करने में सक्षम होंगे। यदि आप अतिरिक्त रूप से SE_BACKUP_NAME विशेषाधिकार सक्षम करते हैं तो आप किसी भी रजिस्ट्री कुंजी को पढ़ने में सक्षम होंगे (उदाहरण के लिए HKEY_LOCAL_MACHINE\SECURITY या HKEY_LOCAL_MACHINE\SAM\SAM से)।