Кто я? Как использовать Microsoft Office Permission/UserPermission

Документы 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), я мог искать свои полномочия в Объекте полномочий. Но я не могу найти тот бит информации. Что я пропускаю?

Существуют известные способы получить имя пользователя Windows (имя для входа в систему для текущего пользователя на той машине Windows). К сожалению, это не идентификатор пользователя, который проверяется по тому, когда PowerPoint решает, какие полномочия я имею на документе. Подчеркнуть: PowerPoint обеспечивает UI, который позволяет мне измениться, "кто я" во время выполнения. Очевидно, это не меняет имя использования входа в систему (т.е. имя, возвращенное ADVAPI). Имена пользователей, к которым относится PowerPoint, определяются/авторизовываются с помощью паспорта Microsoft.

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

7
задан vschoech 21 December 2009 в 19:33
поделиться

3 ответа

Можно сохранить трассировку стека перед повторным воспроизведением без отражения:

static void PreserveStackTrace (Exception e)
{
    var ctx = new StreamingContext  (StreamingContextStates.CrossAppDomain) ;
    var mgr = new ObjectManager     (null, ctx) ;
    var si  = new SerializationInfo (e.GetType (), new FormatterConverter ()) ;

    e.GetObjectData    (si, ctx)  ;
    mgr.RegisterObject (e, 1, si) ; // prepare for SetObjectData
    mgr.DoFixups       ()         ; // ObjectManager calls SetObjectData

    // voila, e is unmodified save for _remoteStackTraceString
}

Это растрачивает много циклов по сравнению с вызовом InternalPreserateStackTrace через кэшируемый делегат, но имеет преимущество полагаться только на общедоступные функциональные возможности. Вот несколько общие узоры использования для функций сохранения трассировки стека:

// usage (A): cross-thread invoke, messaging, custom task schedulers etc.
catch (Exception e)
{
    PreserveStackTrace (e) ;

    // store exception to be re-thrown later,
    // possibly in a different thread
    operationResult.Exception = e ;
}

// usage (B): after calling MethodInfo.Invoke() and the like
catch (TargetInvocationException tiex)
{
    PreserveStackTrace (tiex.InnerException) ;

    // unwrap TargetInvocationException, so that typed catch clauses 
    // in library/3rd-party code can work correctly;
    // new stack trace is appended to existing one
    throw tiex.InnerException ;
}
-121--557451-

Исходный вопрос:

в чем разница между драйверами базы данных и диалектами базы данных?

Вопрос неоднозначный; вот мой выбор.

Драйвер - это программное обеспечение для доступа к базе данных.

Диалект - это вариант языка запроса (т.е. протокола), используемый для доступа к базе данных. В зависимости от программного обеспечения базы данных она может поддерживать несколько различных диалектов .

Т.е. не все sql созданы равными; -)

-121--1675429-

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

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

0
ответ дан 7 December 2019 в 18:43
поделиться

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

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

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

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

1
ответ дан 7 December 2019 в 18:43
поделиться
[

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

] [

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

] [

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

] [

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

] [

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

] [

]Спасибо за ваш вклад,[
]. Фолькер[

]
1
ответ дан 7 December 2019 в 18:43
поделиться