Vba 我是谁?如何使用Microsoft Office权限/用户权限

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=" &

Microsoft Office文档、im我的案例:PowerPoint演示文稿可以具有受限权限。如何以编程方式找出代码对给定文档具有哪些权限

我能在MSDN上找到的关于此主题的所有信息如下:

如果运行以下代码,我将获得对给定文档具有权限的用户列表:

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吗?当心。