You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:ADsSecurityUtility.GetSecurityDescriptor传入完整文件路径时失效的问题

求助:ADsSecurityUtility.GetSecurityDescriptor传入完整文件路径时失效的问题

各位大佬好,我最近在写VBA代码实现“获取锁定文件的用户名”功能,找到了一个能正常运行的函数,但遇到了个奇怪的问题:当我把函数参数从拆分的fileDir(目录)和fileName(文件名)改成直接传完整文件路径变量fullFileName时,ADsSecurityUtility.GetSecurityDescriptor方法就失效了。我甚至试过去掉函数直接写代码测试,还是不行,必须把路径拆成目录加文件名才能正常运行,实在搞不懂原因,麻烦帮我看看哪里出问题了。

能正常工作的版本(Case 1)

Function GetUsername(fileDir As String, fileName As String) As String
    Dim secUtil As Object
    Dim secDesc As Object
    Set secUtil = CreateObject("ADsSecurityUtility")
    Set secDesc = secUtil.GetSecurityDescriptor(fileDir & fileName, 1, 1)
    GetUsername = secDesc.Owner
End Function

Function IsOpen(file As String) As Boolean
    Dim filenum As Integer, errnum As Integer
    On Error Resume Next
    filenum = FreeFile()
    Open file For Input Lock Read As #filenum
    Close filenum
    errnum = Err
    On Error GoTo 0
    Select Case errnum
        Case 0
            IsOpen = False
        Case 70
            IsOpen = True
        Case Else
            Error errnum
    End Select
End Function

Function CheckFile(file As String) As Boolean
    ' 文件存在性检查
    Set fs = CreateObject("Scripting.FileSystemObject")
    If fs.fileexists(file) = True Then ' 文件存在
        If IsOpen(file) = True Then ' 文件已被打开
            MsgBox "文件已打开" & Chr(10) & "打开者: " & GetUsername("R\", "TEST.xlsx") ' 此方式可正常返回用户名
        Else
            MsgBox "文件已关闭"
        End If
    Else
        MsgBox "错误:文件不存在"
    End If
End Function

Private Sub TestOpen()
    Dim ftest As String
    ftest = "R:\TEST.xlsx"
    CheckFile (ftest)
End Sub

修改后失效的版本(Case 2)

我把GetUsername改成接受完整路径的参数,但调用时无法获取到用户名:

Function GetUsername(fullFileName As String) As String
    Dim secUtil As Object
    Dim secDesc As Object
    Set secUtil = CreateObject("ADsSecurityUtility")
    Set secDesc = secUtil.GetSecurityDescriptor(fullFileName, 1, 1) ' 传入完整路径此处失效
    GetUsername = secDesc.Owner
End Function

' IsOpen函数与上述一致,此处省略

Function CheckFile(file As String) As Boolean
    ' 文件存在性检查
    Set fs = CreateObject("Scripting.FileSystemObject")
    If fs.fileexists(file) = True Then ' 文件存在
        If IsOpen(file) = True Then ' 文件已被打开
            MsgBox "文件已打开" & Chr(10) & "打开者: " & GetUsername(file) ' 调用修改后的函数,无法返回正确结果
        Else
            MsgBox "文件已关闭"
        End If
    Else
        MsgBox "错误:文件不存在"
    End If
End Function

' TestOpen子过程与上述一致,此处省略

我试过直接在代码里硬写完整路径传入GetSecurityDescriptor,结果还是不行,必须拆成目录加文件名才能正常工作。有没有大佬知道这是为什么?或者有没有办法让它支持直接传入完整路径?

备注:内容来源于stack exchange,提问作者Reiler74

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 14:29:51