Vba 我是谁?如何使用Microsoft Office权限/用户权限
Microsoft Office文档、im我的案例:PowerPoint演示文稿可以具有受限权限。如何以编程方式找出代码对给定文档具有哪些权限 我能在MSDN上找到的关于此主题的所有信息如下: 如果运行以下代码,我将获得对给定文档具有权限的用户列表:Vba 我是谁?如何使用Microsoft Office权限/用户权限,vba,com,ms-office,permissions,Vba,Com,Ms Office,Permissions,Microsoft Office文档、im我的案例:PowerPoint演示文稿可以具有受限权限。如何以编程方式找出代码对给定文档具有哪些权限 我能在MSDN上找到的关于此主题的所有信息如下: 如果运行以下代码,我将获得对给定文档具有权限的用户列表: Sub test() Dim perm As Office.Permission Set perm = ActivePresentation.Permission Debug.Print "Enabled=" &
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),我可以在Permission对象中查找我的权限。但我找不到那一点信息。我错过了什么
有已知的方法可以获取Windows用户名(该Windows计算机上当前用户的登录名)。不幸的是,当PowerPoint决定我对文档拥有哪些权限时,这不是要检查的用户id。强调:PowerPoint提供了一个UI,允许我在运行时更改“我是谁”。显然,这不会更改登录使用名称(即ADVAPI返回的名称)。PowerPoint所指的用户名通过Microsoft的Passport进行识别/授权
提前谢谢Volker尝试函数GetUserName()、GetUserNameW()或GetUserNameA()之一,然后声明它:
Private Declare Function GetUserName Lib "advapi32.dll" Alias _
"GetUserName" (ByVal lpBuffer As String, nSize As Long) As Long
另见
您需要
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"))
以下是解释这些方法的文章–但是,这些方法不适用于使用在线IRM services(Microsoft Passport)的身份。此外,即使使用自己的权限管理服务器,也可能在运行时更改PowerPoint中的身份,在这种情况下,上述方法可能不会产生预期的结果(我没有进一步研究) 最后,我不得不想出一个变通办法,通过尝试运行一些具有代表性的API调用,然后检查调用是否失败,来测试我需要的权限 感谢您的贡献,
沃尔克今天,我收到了微软的另一个答复(仍然是关于SRQ091221600157的),这实际上似乎解决了这个问题,至少在我的例子中是这样。这种方法闻起来仍然像是权宜之计,没有任何文档可以证实它确实有效,但它似乎足够合理,并且能够经受一些特别的测试。而且,与我想到的任何其他作品相比,它感觉上没有那么零碎。事情是这样的:
只有具有MSOperationFullControl的用户才能查看其他用户的权限(未记录的假设)。因此,如果用户没有msoPermissionFullControl,则权限集合只包含一个项,此项反映当前用户的权限。如果权限集合包含多个项,这意味着当前用户必须具有msoPermissionFullControl。此外,当前用户必须在权限集合中可见,但仍然无法确定权限集合中的哪些身份代表当前用户。啊,古老的问题“我是谁?”。然后是“我在这里做什么?”和其他重要的哲学问题,所有这些问题都归结为“生命、宇宙和一切”。你知道,这只是一个没完没了地寻找最好的最终架构来解决这个问题。唉,这一切都是徒劳的,因为我们都知道答案,但无法理解它的重要性。(现在是42,因为你不得不问…)如果时间允许,我会跟进一个完整的解决方案。但也许这已经足够让你开始了。谢谢你,我想我知道该怎么做了。无需花费更多时间来获得完整的解决方案。。。如果我成功了,我会告诉你的。根据你的建议,我得到的是Windows用户名(该Windows计算机上当前用户的登录名)。不幸的是,当PowerPoint决定我对文档拥有哪些权限时,这不是要检查的用户id。强调:PowerPoint提供了一个UI,允许我在运行时更改“我是谁”。显然,这不会更改登录使用名称(即ADVAPI返回的名称)。PowerPoint所指的用户名通过Microsoft的Passport进行识别/授权。总而言之:这个问题仍然可以获得一些分数…!;-)我很抱歉。我对微软护照了解不多。我需要了解一下。如果没有人知道答案,我会尽力为你找到答案。我发现了一些可能对你有帮助的东西:--但这是.NET。你知道如何从VBA调用.NET吗?当心。