2009-12-18 14 views
7

माइक्रोसॉफ्ट ऑफिस दस्तावेजों का उपयोग कैसे करें, मेरे मामले में: पावरपॉइंट प्रस्तुतियों, प्रतिबंधित अनुमतियां हो सकती हैं। मैं प्रोग्रामेटिक रूप से कैसे पता लगा सकता हूं, मेरे कोड को किसी दिए गए दस्तावेज़ पर कौन सा अनुमति है?मैं कौन हूं? माइक्रोसॉफ़्ट ऑफिस अनुमति/उपयोगकर्ताप्रमिशन

सभी मैं इस विषय पर MSDN पर पा सकते हैं यह है:

Sub test() 
    Dim perm As Office.Permission 
    Set perm = ActivePresentation.Permission 
    Debug.Print "Enabled=" & perm.Enabled 
    If perm.Enabled Then 
     Debug.Print "PermissionFromPolicy=" & perm.PermissionFromPolicy 
     Debug.Print "PolicyName='" & perm.PolicyName & "'" 
     Debug.Print "PolicyDescription='" & perm.PolicyDescription & "'" 
     Dim uperm As Office.UserPermission 
     For Each uperm In perm 
      Debug.Print uperm.UserId & ", " & uperm.Permission 
     Next uperm 
    End If 
End Sub 

: http://msdn.microsoft.com/en-us/library/aa432118.aspx

अगर मैं निम्नलिखित कोड चलाने के लिए, मैं उन है कि दिए गए दस्तावेज़ की अनुमतियां की एक सूची प्राप्त नमूना उत्पादन:

Enabled=True 
PermissionFromPolicy=False 
PolicyName='Do Not Distribute' 
PolicyDescription='Permission is currently restricted. Only specified users can access this content.' 
[email protected], 64 
[email protected], 33 
[email protected], 33 

"अनुमति" एक बिटमैप परिभाषा है जिसके लिए मैं माइक्रोसॉफ्ट के सार्वजनिक कॉम हेडर फाइल में पाया जाता है:

enum MsoPermission 
{ 
    msoPermissionView = 1, 
    msoPermissionRead = 1, 
    msoPermissionEdit = 2, 
    msoPermissionSave = 4, 
    msoPermissionExtract = 8, 
    msoPermissionChange = 15, 
    msoPermissionPrint = 16, 
    msoPermissionObjModel = 32, 
    msoPermissionFullControl = 64, 
    msoPermissionAllCommon = 127 
}; 

फिर भी, यह मुझे नहीं बताता कि मेरे कोड की कौन सी विशेष अनुमतियां हैं। अगर मैं केवल जानता हूं कि मैं कौन हूं (UserPermission.UserId के संदर्भ में), मैं अनुमति ऑब्जेक्ट में मेरी अनुमतियां देख सकता था। लेकिन मुझे उस जानकारी की जानकारी नहीं मिल रही है। मैं क्या खो रहा हूँ?

विंडोज उपयोगकर्ता नाम (उस विंडोज मशीन पर वर्तमान उपयोगकर्ता के लिए लॉगिन नाम) प्राप्त करने के ज्ञात तरीके हैं। दुर्भाग्यवश, यह उपयोगकर्ता आईडी नहीं है जिस पर जांच की जाती है जब PowerPoint यह तय करता है कि मेरे पास दस्तावेज़ पर कौन सी अनुमतियां हैं। जोर देने के लिए: पावरपॉइंट एक यूआई प्रदान करता है जो मुझे रन टाइम पर "मैं कौन हूं" बदलने देता हूं। जाहिर है, यह लॉगिन उपयोग नाम नहीं बदलता है (यानी, ADVAPI द्वारा लौटाया गया नाम)। उपयोगकर्ता नाम PowerPoint का जिक्र है, माइक्रोसॉफ्ट के पासपोर्ट के माध्यम से पहचाना/अधिकृत है।

अग्रिम धन्यवाद!
वोल्कर

+6

आह, सदियों पुरानी सवाल "मैं कौन हूँ?"। हमेशा के बाद "मैं यहाँ क्या कर रहा हूँ?" और अन्य महत्वपूर्ण दार्शनिक प्रश्न, सभी "जीवन, ब्रह्मांड और सबकुछ" पर आ रहे हैं। आप जानते हैं कि यह सबसे अच्छा अंतिम आर्किटेक्चर के लिए अंतहीन खोज में केवल गिरावट है जो इसका उत्तर देगा। हां, यह सब कुछ शून्य हो जाएगा, क्योंकि हम सभी को जवाब पता है, फिर भी इसके महत्व को समझ नहीं सकते हैं। (यह 42 है, क्योंकि आपको पूछना था ...) –

उत्तर

0

आज मैं माइक्रोसॉफ्ट (अब भी के बारे में SRQ091221600157) वास्तव में समस्या को हल करने, कम से कम मेरे विशेष उदाहरण में लगता है जहाँ से एक अतिरिक्त जवाब प्राप्त किया। यह दृष्टिकोण अभी भी काम की तरह गंध करता है और वहां कोई दस्तावेज नहीं है जो पुष्टि करेगा कि यह वास्तव में काम करता है, लेकिन ऐसा लगता है कि यह काफी व्यावहारिक है और कुछ विज्ञापन-परीक्षणों को रोकता है। और, यह किसी भी अन्य काम की तुलना में बहुत कम पैची लगता है - चारों ओर मैं आया था। यह इस प्रकार है:

msoPermissionFullControl साथ केवल उपयोगकर्ताओं को अन्य उपयोगकर्ताओं (गैर-दस्तावेजी धारणा) की अनुमतियाँ देख सकते हैं। इस प्रकार, यदि किसी उपयोगकर्ता के पास msoPermissionFullControl नहीं है, तो अनुमति संग्रह में बिल्कुल एक आइटम होता है और यह आइटम वर्तमान उपयोगकर्ता की अनुमतियों को प्रतिबिंबित करता है। यदि अनुमति संग्रह में कई आइटम हैं, तो इसका मतलब है कि वर्तमान उपयोगकर्ता के पास msoPermissionFullControl होना चाहिए। साथ ही, वर्तमान उपयोगकर्ता को अनुमति संग्रह में दिखाई देना चाहिए, लेकिन अभी भी यह पता लगाने का कोई तरीका नहीं है कि अनुमति संग्रह में कौन सी पहचान वर्तमान उपयोगकर्ता का प्रतिनिधित्व करती है।

1

कार्यों GetUserName में से एक (प्रयास करें), GetUserNameW() या GetUserNameA() है और यह thusly घोषित:

Private Declare Function GetUserName Lib "advapi32.dll" Alias _ 
    "GetUserName" (ByVal lpBuffer As String, nSize As Long) As Long 

इसके अलावा MSDN about GetUserName देखते हैं।

आपको dim लंबाई 255 के साथ एक स्ट्रिंग और पैरामीटर nSize के रूप में 254 पास करने की आवश्यकता है। यह स्ट्रिंग ByVal को कॉलर पर वापस भेज दी गई है। uperm.UserId के साथ इसकी तुलना करने के लिए शायद आप इसे left() स्ट्रिंग की आवश्यकता से पहले उपयोग कर सकते हैं।

+0

यदि समय परमिट है, तो मैं एक पूर्ण समाधान के साथ अनुवर्ती होगा। लेकिन शायद यह आपको शुरू करने के लिए पहले से ही पर्याप्त है। – nalply

+0

धन्यवाद, धन्यवाद, मुझे लगता है कि मुझे पता है कि क्या करना है। एक पूर्ण समाधान के लिए अधिक समय लेने की आवश्यकता नहीं है ... यदि मैं सफल होता हूं तो मैं आपको बता दूंगा। – vschoech

+0

nalply, मुझे आपकी सलाह के बाद क्या मिलता है वह विंडोज उपयोगकर्ता नाम है (उस विंडोज मशीन पर वर्तमान उपयोगकर्ता के लिए लॉगिन नाम)। दुर्भाग्यवश, यह उपयोगकर्ता आईडी नहीं है जिस पर जांच की जाती है जब PowerPoint यह तय करता है कि मेरे पास दस्तावेज़ पर कौन सी अनुमतियां हैं। जोर देने के लिए: पावरपॉइंट एक यूआई प्रदान करता है जो मुझे रन टाइम पर "मैं कौन हूं" बदलने देता हूं। जाहिर है, यह लॉगिन उपयोग नाम नहीं बदलता है (यानी, ADVAPI द्वारा लौटाया गया नाम)। उपयोगकर्ता नाम PowerPoint का जिक्र है, माइक्रोसॉफ्ट के पासपोर्ट के माध्यम से पहचाना/अधिकृत है। संक्षेप में: यह प्रश्न अभी भी कुछ अंक अर्जित करने के लिए खुला है ...! ;-) – vschoech

1

मैंने इस पर माइक्रोसॉफ्ट के साथ टिकट खोला है (SRQ091221600157)। माइक्रोसॉफ्ट सपोर्ट के साथ लंबी चर्चा के बाद, टिकट अभी भी लंबित है, लेकिन मुझे लगता है कि यह पहले से ही सुरक्षित है कि मुझे आवश्यक जानकारी प्राप्त करने का कोई स्पष्ट तरीका नहीं है।

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

आप अपने खुद के अधिकार प्रबंधन सर्वर के साथ एक बंद वातावरण में हैं, तो निम्न दृष्टिकोण शायद काम करेगा (माइक्रोसॉफ्ट समर्थन के हवाले से, मैं इस अपने आप को परीक्षण नहीं किया है):

1) COM वस्तु ADSystemInfo वस्तु का उपयोग करना।

Dim objADSystemInfo As Object 
Dim objUser As Object 
objADSystemInfo = CreateObject("ADSystemInfo") 
objUser = GetObject("LDAP://" + objADSystemInfo.UserName) 
objUser.Get("mail") 'This will return the AD email id 

'We can use this to include in the permission related code that you had sent 
If (uperm.UserId = objUser.Get("mail")) Then 
    'You can get the permission uperm.Permission for this userid (current logged in) 
    MsgBox(uperm.UserId & "logged in user") 
Else 
    MsgBox(uperm.UserId & "other user") 
End If 

2) का उपयोग करना।
http://www.microsoft.com/technet/scriptcenter/resources/pstips/dec07/pstip1207.mspx

हालांकि, इन तरीकों पहचान है कि ऑनलाइन आईआरएम सेवाओं (माइक्रोसॉफ्ट पासपोर्ट) का उपयोग करने के लिए काम नहीं करते - नेट दृष्टिकोण

Dim oDS = New System.DirectoryServices.DirectorySearcher 
Dim strUserName As String = Environment.UserName 
Dim strFilter As String = "(&(objectCategory=User)(samAccountName=" & strUserName & "))" 
oDS.Filter = strFilter 
Dim oSr As System.DirectoryServices.SearchResult = oDS.FindOne() 
Dim oUser As System.DirectoryServices.DirectoryEntry 
oUser = oSr.GetDirectoryEntry() 
MessageBox.Show(oUser.InvokeGet("mail")) 

यहाँ लेख है कि इन तरीकों के बारे में बताते हैं है। साथ ही, अपने अधिकार प्रबंधन सर्वर के साथ भी, रनटाइम पर पावरपॉइंट में अपनी पहचान बदलना संभव हो सकता है, जिस स्थिति में उपर्युक्त दृष्टिकोण संभवतः वांछित परिणाम नहीं देंगे (मैंने इसकी जांच नहीं की है)।

मैं अंत में, मैं एक समाधान है कि अगर कॉल विफल जाँच कुछ प्रतिनिधि API कॉल भागने की कोशिश कर और फिर से अनुमतियों की आवश्यकता का परीक्षण करती है साथ आने के लिए किया था।

अपने योगदान के लिए धन्यवाद,
वोल्कर

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

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