Кто я? Как использовать разрешение Microsoft Office / UserPermission
документы Microsoft Office, im мой случай: презентации 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
"разрешение" - это растровое определение, для которого я нашел в общедоступных файлах заголовков microsoft 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), я мог бы посмотреть свои разрешения в объекте разрешений. Но я не могу найти эту информацию. Что я упускаю?
известны способы получения имени пользователя Windows (логин имя текущего пользователя на Windows-машине). К сожалению, это не идентификатор пользователя, который проверяется, когда PowerPoint решает, какие права я имею на этот документ. Подчеркиваю: PowerPoint предоставляет пользовательский интерфейс, который позволяет мне изменить "кто я" во время выполнения. Очевидно, что это не изменяет имя использования входа (т. е. имя, возвращаемое ADVAPI). Имена пользователей, на которые ссылается PowerPoint, идентифицируются / авторизованы через паспорт Microsoft.
спасибо вперед!
Волкер!--4-->
3 ответов
попробуйте одну из функций 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
.
Я открыл билет с Microsoft на этом (SRQ091221600157). После длительного обсуждения с поддержкой Microsoft билет все еще ожидает, но я думаю, что уже можно с уверенностью сказать, что нет явного способа получить необходимую мне информацию.
Microsoft явно заявляет, что в PowerPoint нет API для получения идентификатора, который использовался для открытия презентации, или текущих активных разрешений. Запрос функции для добавления этого API зарегистрированный.
Если вы находитесь в закрытой среде с вашим собственным сервером управления правами, следующие подходы, вероятно, будут работать (цитируя поддержку Microsoft, я не тестировал это сам):
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 (Microsoft Passport). Кроме того, даже с вашим собственным сервером управления правами можно изменить свою личность в PowerPoint во время выполнения, и в этом случае вышеуказанные подходы, вероятно, не дадут желаемых результатов (я не исследовал это дальнейший.)
Я в конце концов, я должен был придумать обходной путь, который проверяет разрешения, которые мне нужны, пытаясь запустить некоторый репрезентативный вызов API, а затем проверить, если вызов не удался.
Спасибо за Ваш вклад,
Волкер!--3-->
сегодня я получил дополнительный ответ от Microsoft (все еще относительно SRQ091221600157), который, по-видимому, решает проблему, по крайней мере, в моем конкретном случае. Этот подход по-прежнему пахнет обходным путем, и нет документации, которая подтвердила бы, что он действительно работает, но он кажется достаточно правдоподобным и выдерживает некоторые специальные тесты. И он чувствует себя гораздо менее пятнистым, чем любая другая работа, которую я придумал. Он звучит так:
только для пользователей с msoPermissionFullControl может видеть разрешения других пользователей (недокументированное предположение). Таким образом, если пользователь не имеет msoPermissionFullControl, коллекция разрешений содержит ровно один элемент и этот элемент отражает разрешения текущего пользователя. Если коллекция разрешений содержит несколько элементов, это означает, что текущий пользователь должен иметь msoPermissionFullControl. Кроме того, текущий пользователь должен быть виден в коллекции разрешений, но по-прежнему нет способа узнать, какой из идентификаторы в коллекции разрешений представляют текущего пользователя.