Документы 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
Можно сохранить трассировку стека перед повторным воспроизведением без отражения:
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
созданы равными; -)
Сегодня я получил дополнительный ответ от Microsoft (по-прежнему касающийся SRQ091221600157), который на самом деле, кажется, решает проблему, по крайней мере, в моем конкретном случае. Этот подход по-прежнему пахнет как обход, и нет документации, которая бы подтверждала, что он на самом деле работает, но он кажется достаточно правдоподобным и выдерживает некоторые специальные тесты. И он чувствует себя гораздо менее патовым, чем любая другая работа, которую я придумал. Это происходит следующим образом:
Только пользователи с msoPermissionFureControl могут видеть разрешения других пользователей (недокументированное предположение). Таким образом, если у пользователя нет msoPermissionFureControl, коллекция Permission содержит ровно один предмет, и этот предмет отражает разрешения текущего пользователя. Если коллекция разрешений содержит несколько предметы, это означает, что текущий пользователь должен иметь msoPermissionFureControl. Кроме того, текущий пользователь должен быть видимым в коллекции разрешений, но до сих пор нет пути узнать, какое из удостоверений в коллекции разрешений представляет текущего пользователя.
Попробуйте одну из функций 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
.
] По этому поводу я открыл билет в 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, а затем проверить, не сработал ли вызов.[
] []Спасибо за ваш вклад,[
].
Фолькер[