Кто я? Как использовать Microsoft Office Permission / UserPermission - PullRequest
7 голосов
/ 18 декабря 2009

Документы Microsoft Office, в моем случае: презентации PowerPoint, могут иметь ограниченные разрешения. Как программно узнать, какие разрешения имеет мой код для данного документа?

Все, что я могу найти на 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.'
john@doe.com, 64
user@system.de, 33
myname@example.com, 33

«Разрешение» - это растровое изображение, определение которого я нашел в общедоступных заголовочных файлах COM для Microsoft:

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 предоставляет пользовательский интерфейс, который позволяет мне изменять «кто я» во время выполнения. Очевидно, что это не меняет имя для входа в систему (то есть имя, возвращаемое ADVAPI). Имена пользователей, на которые ссылается PowerPoint, идентифицируются / авторизируются через паспорт Microsoft.

Заранее спасибо!
Volker

Ответы [ 3 ]

1 голос
/ 06 января 2010

Я открыл для этого заявку в Microsoft (SRQ091221600157). После продолжительной дискуссии со службой поддержки Майкрософт заявка еще не завершена, но я думаю, что уже можно с уверенностью сказать, что не существует явного способа получения необходимой мне информации.

Microsoft прямо заявляет, что в PowerPoint нет API для получения идентификатора, который использовался для открытия презентации, или текущих активных разрешений. Запрос на добавление этого API был подан.

Если вы находитесь в закрытой среде с собственным сервером управления правами, возможно, подойдут следующие подходы (цитируя службу поддержки Microsoft, я сам не проверял это):

1) Использование объекта ADSystemInfo COM-объекта.

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 (Microsoft Passport). Кроме того, даже с вашим собственным сервером управления правами может быть возможно изменить вашу личность в PowerPoint во время выполнения, и в этом случае описанные выше подходы, вероятно, не дадут желаемых результатов (я больше не исследовал это).

В конце концов, мне пришлось придумать обходной путь, который проверяет необходимые мне разрешения, пытаясь выполнить какой-то типичный вызов API и затем проверить, не произошел ли вызов.

Спасибо за ваш вклад,
Volker

1 голос
/ 18 декабря 2009

Попробуйте одну из функций GetUserName (), GetUserNameW () или GetUserNameA () и объявите ее таким образом:

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

Также см. MSDN о GetUserName .

Вам нужно dim строка длиной 255 и передать 254 в качестве параметра nSize. Эта строка передается ByVal обратно вызывающей стороне. Возможно, вам нужно left() строку, прежде чем вы сможете использовать ее для сравнения с uperm.UserId.

0 голосов
/ 18 января 2010

Сегодня я получил дополнительный ответ от Microsoft (по-прежнему касающийся SRQ091221600157), который, похоже, действительно решает проблему, по крайней мере, в моем конкретном случае. Этот подход все еще пахнет как обходной путь, и нет документации, которая бы подтверждала, что он действительно работает, но он кажется достаточно правдоподобным и выдерживает некоторые специальные тесты. И это кажется намного менее пятнистым, чем любой другой обходной путь, который я придумал. Это выглядит так:

Только пользователи с msoPermissionFullControl могут видеть разрешения других пользователей (недокументированное предположение). Таким образом, если у пользователя нет msoPermissionFullControl, коллекция Permission содержит ровно один элемент, и этот элемент отражает разрешения текущего пользователя. Если коллекция разрешений содержит несколько элементов, это означает, что текущий пользователь должен иметь msoPermissionFullControl. Кроме того, текущий пользователь должен быть виден в коллекции разрешений, но по-прежнему нет способа узнать, какие из удостоверений в коллекции разрешений представляют текущего пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...