2009-12-18 22 views
7

Microsoft Office文檔,即時通訊我的情況:PowerPoint演示文稿,可以有限制的權限。如何以編程方式查明我的代碼對給定文檔有哪些權限?我是誰?如何使用Microsoft Office許可/ UserPermission

所有我能找到在MSDN上有關此主題是: http://msdn.microsoft.com/en-us/library/aa432118.aspx

如果我運行下面的代碼,我得到的是對給定的文檔權限的用戶的列表:

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 

輸出示例:

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 

的「許可」是位圖的定義,我在微軟的公共COM頭文件中:

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

不過,這並不告訴我我的代碼具有哪些特定的權限。如果我只知道我是誰(根據UserPermission.UserId),我可以在Permission對象中查找我的權限。但我無法找到那一點信息。我錯過了什麼?

有已知的方式獲得Windows用戶名(即Windows機器上的當前用戶的登錄名)。不幸的是,這不是在PowerPoint決定我在文檔上擁有哪些權限時檢查的用戶標識。要強調:PowerPoint提供了一個UI,可以讓我在運行時更改「我是誰」。顯然,這不會改變登錄使用名稱(即,由ADVAPI返回的名稱)。用戶名稱PowerPoint指的是,通過微軟的Passport識別/授權。

在此先感謝!
沃爾克

+6

啊,這個古老的問題「我是誰?」。總是跟着「我在這裏做什麼?」和其他重要的哲學問題,都歸結爲「生命,宇宙和一切」。你知道它只是從那裏陷入無盡的尋找最好的終極架構來回答它。唉,這一切都是徒勞的,因爲我們都知道答案,但無法理解它的重要性。 (這是42,因爲你不得不問...) – 2009-12-18 15:39:15

回答

0

今天收到一個額外的答案來自微軟(仍關於SRQ091221600157),這實際上似乎解決問題,至少在我的特殊情況。這種方法仍然有點像變通辦法,並且沒有文件證明它確實可行,但它看起來似乎合理並且能夠承受一些臨時測試。而且,我覺得它比其他任何工作都要少得多。它是這樣的:

只有具有msoPermissionFullControl的用戶才能看到其他用戶的權限(無證據假設)。因此,如果用戶沒有msoPermissionFullControl,則Permission集合只包含一個項目,並且此項目反映當前用戶的權限。如果權限集合包含多個項目,則表示當前用戶必須具有msoPermissionFullControl。此外,當前用戶必須在Permission集合中可見,但仍無法找出Permission集合中哪些身份代表當前用戶。

1

嘗試功能GetUserName之一(),GetUserNameW()或GetUserNameA()和正是如此聲明它:

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

另見MSDN about GetUserName

您需要dim一個字符串長度255和254傳遞作爲參數nSize。該字符串通過ByVal傳回給調用者。也許你需要left()字符串之前,你可以用它來與它比較uperm.UserId

+0

如果時間允許,我會採取一個完整的解決方案進行跟進。但也許這已經足以讓你開始。 – nalply 2009-12-18 15:47:25

+0

謝謝你,我想我知道該怎麼做。無需花費更多時間完成一個完整的解決方案......如果我成功了,我會讓你知道。 – vschoech 2009-12-18 16:05:44

+0

nalply,根據你的建議得到的是Windows用戶名(該Windows機器上當前用戶的登錄名)。不幸的是,這不是在PowerPoint決定我在文檔上擁有哪些權限時檢查的用戶標識。 要強調:PowerPoint提供了一個UI,可以讓我在運行時更改「我是誰」。顯然,這不會改變登錄使用名稱(即,由ADVAPI返回的名稱)。用戶名稱PowerPoint指的是,通過微軟的Passport識別/授權。 總結:這個問題仍然可以獲得一些積分...! ;-) – vschoech 2009-12-18 17:10:07

1

我對這個(SRQ091221600157)開罰單與微軟合作。經過與Microsoft支持部門的長時間討論後,該故障單仍在等待處理,但我認爲現在已經可以安全地說,沒有明確的方式來獲取我需要的信息。

微軟明確指出,有在PowerPoint中沒有API獲得,要麼是用來打開演示文稿,或當前活動權限的身份。已提交添加該API的功能請求。

如果你是在用自己的權限管理服務器封閉的環境中,下列方法可能會工作(引用微軟的支持,我沒有這個測試自己):

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)使用。NET方法

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")) 

這裏是解釋關於這些方法的文章 -
http://www.microsoft.com/technet/scriptcenter/resources/pstips/dec07/pstip1207.mspx

然而,這些方法並不適用於使用在線服務的IRM(微軟的Passport)的身份工作。此外,即使使用您自己的Rights Management Server,也可以在運行時在PowerPoint中更改您的身份,在這種情況下,上述方法可能不會產生所需的結果(我沒有進一步調查這一點)。

最後,我不得不想出一個解決方法,通過嘗試運行一些有代表性的API調用來測試我需要的權限,然後檢查調用是否失敗。

謝謝您的貢獻,
沃爾克

相關問題