2009-05-22 17 views
9

का उपयोग कर फ़ोल्डर/फ़ाइल एनटीएफएस अनुमतियों की जांच कर रहा है क्योंकि प्रश्न शीर्षक का सुझाव हो सकता है, मैं दिए गए फ़ाइल या फ़ोल्डर की ntfs अनुमतियों को जांचने के तरीके के बारे में जानना चाहूंगा (संकेत: वे हैं जिन्हें आप देखते हैं "सुरक्षा" टैब)। असल में, मुझे एक फ़ाइल या निर्देशिका (स्थानीय मशीन पर, या, रिमोट मशीन पर शेयर पर, प्राथमिकता से) के लिए पथ लेने की आवश्यकता है और उपयोगकर्ताओं/समूहों की सूची प्राप्त करें और इस फ़ाइल/फ़ोल्डर के लिए संबंधित अनुमतियां प्राप्त करें । आखिरकार, एप्लिकेशन एक निर्देशिका पेड़ को पार करने जा रहा है, प्रत्येक ऑब्जेक्ट के लिए अनुमतियां पढ़ रहा है और तदनुसार उन्हें संसाधित कर रहा है।पायथन

अब, मैं तरीके कि ऐसा करने के लिए की एक संख्या के बारे में सोच सकते हैं:

  • पार्स Cacls.exe उत्पादन - आसानी से किया, लेकिन, जब तक कि im कुछ कमी, Cacls.exe केवल इन अनुमतियां देता है आर | डब्लू | सी | एफ (पढ़ें/लिखना/परिवर्तन/पूर्ण) का रूप, जो अपर्याप्त है (मुझे "सूची फ़ोल्डर सामग्री" जैसे अनुमतियां प्राप्त करने की आवश्यकता है, विस्तारित अनुमतियां भी)
  • xcacls.exe या xcacls.vbs आउटपुट - हाँ, वे मुझे आवश्यक सभी अनुमतियां देते हैं, लेकिन वे डरावनी धीमी गति से काम करते हैं, स्थानीय सिस्टम फ़ाइल पर अनुमति प्राप्त करने के लिए xcacls.vbs को लगभग SECO सेकंड लगता है। इस तरह की गति अस्वीकार्य है
  • win32security (यह, सही WinAPI इर्द-गिर्द घूमती?) - मुझे यकीन है कि इसे इस तरह से संभाला जा सकता है, लेकिन मैं नहीं बल्कि पहिया

एक नए अंदाज़ में नहीं होता हूँ कुछ और मैं कर रहा हूँ कुछ भी है यहाँ याद आ रही है?

+2

मुझे लगता है कि win32security वह है जो आप चाहते हैं। यह वास्तव में विंडोज एपीआई के आसपास एक रैपर है। क्या आप चिंतित हैं कि यह बहुत कम स्तर है? –

+0

ठीक है, अगर यह एकमात्र तरीका है, तो मैं Win32security का उपयोग करके भी ऐसा कर सकता हूं, लेकिन यह मेरे स्वयं के cacls रोलिंग की तरह होगा, इसलिए मैंने इसे पहिया reinventing के रूप में संदर्भित किया है। – shylent

+0

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

उत्तर

16

जब तक कि आप अपनी खुद की रोलिंग पसंद नहीं करते हैं, Win32security जाने का तरीका है। वहाँ एक उदाहरण यहां की शुरुआत है: (!)

http://timgolden.me.uk/python/win32_how_do_i/get-the-owner-of-a-file.html

आप थोड़ा खतरनाक तरीके से जीना चाहते हैं तो मेरी प्रगति winsys पैकेज वास्तव में क्या आप के बाद कर रहे हैं करने के लिए बनाया गया है। आप यहाँ देव संस्करण की एक MSI प्राप्त कर सकते हैं:

http://timgolden.me.uk/python/downloads/WinSys-0.4.win32-py2.6.msi

या तुम सिर्फ SVN ट्रंक चेकआउट कर सकते हैं:

SVN सह http://winsys.googlecode.com/svn/trunk winsys

आप क्या वर्णन करने के लिए (थोड़ा पर अनुमान लगा सटीक आवश्यकताओं) आप ऐसा कर सकता है:

import codecs 
from winsys import fs 

base = "c:/temp" 
with codecs.open ("permissions.log", "wb", encoding="utf8") as log: 
    for f in fs.flat (base): 
    log.write ("\n" + f.filepath.relative_to (base) + "\n") 
    for ace in f.security().dacl: 
    access_flags = fs.FILE_ACCESS.names_from_value (ace.access) 
    log.write (u" %s => %s\n" % (ace.trustee, ", ".join (access_flags))) 

TJG

+4

ओह, टिम, बहुत बहुत धन्यवाद! मैं कहने जा रहा था, कि मैंने पहले से ही यह पता लगाया है कि यह कैसे करें (Win32security का उपयोग करके, हाँ), लेकिन मुझे अभी एहसास हुआ है कि मैंने _your_ साइट पर उदाहरणों का उपयोग करके यह किया है! वह किस प्रकार का संयोग है! :) – shylent