求助: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
相关产品推荐
相关产品推荐

