बनाने का विशेषाधिकार है, मैं प्रोग्रामेटिक रूप से यह निर्धारित करना चाहता हूं कि वर्तमान उपयोगकर्ता (या प्रक्रिया) के पास प्रतीकात्मक लिंक बनाने के लिए पहुंच है या नहीं। विंडोज़ (विस्टा और अधिक) में, कोई SeCreateSymbolicLinkPrivilege के बिना एक प्रतीकात्मक लिंक नहीं बना सकता है और डिफ़ॉल्ट रूप से, यह केवल प्रशासकों को असाइन किया जाता है। यदि कोई इस विशेषाधिकार के बिना एक प्रतीकात्मक लिंक बनाने का प्रयास करता है, तो Windows त्रुटि 1314 (क्लाइंट द्वारा आवश्यक आवश्यक विशेषाधिकार) होता है।निर्धारित करें कि क्या विंडोज प्रक्रिया को प्रतीकात्मक लिंक
इस प्रतिबंध को प्रदर्शित करने के लिए, मैंने प्रारंभिक व्यवस्थापक खाते (यूएसी के माध्यम से प्रतिबंधित) के रूप में लॉग इन किया, विंडोज़ का एक साफ इंस्टॉल बनाया, और घर निर्देशिका में एक सिम्लिंक बनाने में असमर्थ था।
प्रशासक के रूप में कमांड प्रॉम्प्ट चल रहे हैं या यूएसी अक्षम करने के बाद, कि आदेश त्रुटि के बिना निष्पादित करता है।
this article के अनुसार, "उपयोगकर्ता की तरफ से निष्पादित हर प्रक्रिया में [एक्सेस] टोकन की एक प्रति है"।
इसलिए मैंने a Python script to query for the permissions बनाया है। सुविधा और वंशावली के लिए, मैं नीचे एक अंश शामिल करता हूं।
स्क्रिप्ट के पीछे विचार सभी विशेषाधिकारों का आकलन करना है और यह निर्धारित करना है कि प्रक्रिया के लिए आवश्यक विशेषाधिकार है या नहीं। दुर्भाग्यवश, मुझे लगता है कि वर्तमान प्रक्रिया में वांछित विशेषाधिकार नहीं है, भले ही यह सिम्लिंक बना सके।
मुझे संदेह है कि समस्या यह है कि वर्तमान उपयोगकर्ता के विशेषाधिकारों में विशेषाधिकार शामिल नहीं है, फिर भी उनकी समूह सदस्यता उस विशेषाधिकार को बर्दाश्त करती है।
संक्षेप में, मैं कैसे निर्धारित कर सकता हूं कि किसी दिए गए प्रक्रिया को प्रतीकात्मक लिंक बनाने के लिए विशेषाधिकार मिलेगा (बिना किसी बनाने के प्रयास किए)? सी या सी ++ या पायथन में एक उदाहरण पसंद किया जाता है, हालांकि विंडोज एपीआई का उपयोग करने वाला कुछ भी उपयुक्त होगा।
def get_process_token():
token = wintypes.HANDLE()
TOKEN_ALL_ACCESS = 0xf01ff
res = OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, token)
if not res > 0: raise RuntimeError("Couldn't get process token")
return token
def get_privilege_information():
# first call with zero length to determine what size buffer we need
return_length = wintypes.DWORD()
params = [
get_process_token(),
TOKEN_INFORMATION_CLASS.TokenPrivileges,
None,
0,
return_length,
]
res = GetTokenInformation(*params)
# assume we now have the necessary length in return_length
buffer = ctypes.create_string_buffer(return_length.value)
params[2] = buffer
params[3] = return_length.value
res = GetTokenInformation(*params)
assert res > 0, "Error in second GetTokenInformation (%d)" % res
privileges = ctypes.cast(buffer, ctypes.POINTER(TOKEN_PRIVILEGES)).contents
return privileges
privileges = get_privilege_information()
print("found {0} privileges".format(privileges.count))
map(print, privileges)
विंडोज के प्रतीकात्मक लिंक हैं? –
आप किस प्रकार का प्रतीकात्मक लिंक बनाने की कोशिश कर रहे हैं? विभिन्न चीजों का एक गुच्छा है जिसे विंडोज़ में प्रतीकात्मक लिंक माना जा सकता है - फाइल सिस्टम जंक्शन अंक, फाइल सिस्टम हार्ड लिंक, ऑब्जेक्ट मैनेजर प्रतीकात्मक लिंक इत्यादि। मुझे विश्वास है कि आपको ऑब्जेक्ट मैनेजर प्रतीकात्मक लिंक बनाने के लिए केवल SeCreateSymbolicLink विशेषाधिकार की आवश्यकता है। –
मैं फाइल सिस्टम जंक्शन-पॉइंट-आधारित प्रतीकात्मक लिंक बनाने की कोशिश कर रहा हूं, जैसे CreateSymbolicLink द्वारा बनाए गए। –