Windows 7 시스템에서 사용하고 싶지 않은 vbscript를 발견했습니다. 내가 그것을 사용하려고 할 때, 나는 라인 38에서 잘못된 개체 경로 가져 오기 : 스크립트가이 오류를 생산하는 것이 왜명시 적 권한을 나열하는 Vbscript
Set objSecuritySettings = objWMIService.Get _
("Win32_LogicalFileSecuritySetting.Path='" & strPath & "'")
어떤 아이디어? 코드 소스 : http://www.indented.co.uk/index.php/2008/10/22/listing-explicit-rights/comment-page-1/#comment-3947
Option Explicit
' Looks for a Trustee containing the SECURITY_PRINCIPAL string on
' the file system. Recurses from BASE_PATH down (file and folders).
' Set these values for the search.
Const BASE_PATH = "C:\"
Const SECURITY_PRINCIPAL = "Chris"
Sub FSRecurse(strPath)
' Simple FS recursion
Dim objFolder, objFile, objSubFolder
Set objFolder = objFileSystem.GetFolder(strPath)
For Each objFile in objFolder.Files
CheckDescriptor objFile.Path
Next
For Each objSubFolder in objFolder.SubFolders
CheckDescriptor objSubFolder.Path
FSRecurse objSubFolder.Path
Next
Set objFolder = Nothing
End Sub
Sub CheckDescriptor(strPath)
' Look for the Trustee in the Security Descriptor and filter out
' inherited ACEs
Const ACE_FLAG_INHERITED = &H10 ' 16
Dim objSecuritySettings, objSecurityDescriptor, objACE, objTrustee
Set objSecuritySettings = objWMIService.Get _
("Win32_LogicalFileSecuritySetting.Path='" & strPath & "'")
objSecuritySettings.GetSecurityDescriptor objSecurityDescriptor
For Each objACE in objSecurityDescriptor.dACL
If InStr(1, objACE.Trustee.Name, _
SECURITY_PRINCIPAL, VbTextCompare) > 0 Then
' ACEFlags is binary. Must perform binary comparison.
If objACE.ACEFlags And ACE_FLAG_INHERITED Then
' Problems with negation of the above.
' This is just easier.
Else
EnumAccess strPath, objACE
End If
End If
Next
End Sub
Sub EnumAccess(strPath, objACE)
' Most access mask values have matching Folder versions. These are not
' numerically different, they only differ when interpreted.
' ACE Type
Const ACCESS_ALLOWED_ACE_TYPE = &h0
Const ACCESS_DENIED_ACE_TYPE = &h1
' Base Access Mask values
Const FILE_READ_DATA = &h1
Const FILE_WRITE_DATA = &h2
Const FILE_APPEND_DATA = &h4
Const FILE_READ_EA = &h8
Const FILE_WRITE_EA = &h10
Const FILE_EXECUTE = &h20
Const FILE_DELETE_CHILD = &h40
Const FILE_READ_ATTRIBUTES = &h80
Const FILE_WRITE_ATTRIBUTES = &h100
Const FOLDER_DELETE = &h10000
Const READ_CONTROL = &h20000
Const WRITE_DAC = &h40000
Const WRITE_OWNER = &h80000
Const SYNCHRONIZE = &h100000
' Constructed Access Masks
Dim FULL_CONTROL
FULL_CONTROL = FILE_READ_DATA + FILE_WRITE_DATA + FILE_APPEND_DATA + _
FILE_READ_EA + FILE_WRITE_EA + FILE_EXECUTE + FILE_DELETE_CHILD + _
FILE_READ_ATTRIBUTES + FILE_WRITE_ATTRIBUTES + FOLDER_DELETE + _
READ_CONTROL + WRITE_DAC + WRITE_OWNER + SYNCHRONIZE
Dim READ_ONLY
READ_ONLY = FILE_READ_DATA + FILE_READ_EA + FILE_EXECUTE + _
FILE_READ_ATTRIBUTES + READ_CONTROL + SYNCHRONIZE
Dim MODIFY
MODIFY = FILE_READ_DATA + FILE_WRITE_DATA + FILE_APPEND_DATA + _
FILE_READ_EA + FILE_WRITE_EA + FILE_EXECUTE + _
FILE_READ_ATTRIBUTES + _
FILE_WRITE_ATTRIBUTES + FOLDER_DELETE + READ_CONTROL + SYNCHRONIZE
Dim strRights
Dim intAccessMask
WScript.Echo "Path: " & strPath
WScript.Echo "Username: " & objACE.Trustee.Name
WScript.Echo "Domain: " & objACE.Trustee.Domain
WScript.Echo "ACE Flags (Decimal): " & objACE.ACEFlags
' ACE Type
If objACE.ACEType = ACCESS_ALLOWED_ACE_TYPE Then
WScript.Echo "ACE Type: Allow"
Else
WScript.Echo "ACE Type: Deny"
End If
' Attempt to generate a basic summary of access rights
strRights = ""
intAccessMask = objACE.AccessMask
If intAccessMask = FULL_CONTROL Then
strRights = " (FullControl)"
ElseIf intAccessMask = MODIFY Then
strRights = " (Modify)"
ElseIf intAccessMask = READ_ONLY Then
strRights = " (ReadOnly)"
End If
' Echo the decimal mask with any summarised rights
WScript.Echo "Access Mask (Decimal): " & intAccessMask & strRights
WScript.Echo
End Sub
'
' Main code block
'
Dim objFileSystem, objWMIService
Set objFileSystem = CreateObject("Scripting.FileSystemObject")
' WMI Connection to the local machine
Set objWMIService = GetObject("winmgmts:\\.")
FSRecurse BASE_PATH
Set objWMIService = Nothing
Set objFileSystem = Nothing
감사합니다. 나는 하나의 후속 문제를 가지고 있는데, 매우 느리게 실행되는 것 같습니다. 내 고용주가 폴더에 대한 명시 적 권한에만 관심이 있기 때문에 objFile 검사기 부분을 제거하고 테스트 환경에서 폴더가 비교적 적은데 상대적으로 빠르지 만 약 94000 개의 폴더/하위 폴더가있는 공유 네트워크 드라이브에서 느슨하게 설정하면 그것에 완료하는 데 약 2 시간이 걸렸습니다. 이 크기의 파일 구조가 적당하다고 생각하십니까? 또는 프로세스 속도를 높이기 위해 수행 할 수있는 작업이 있습니까? – user2278760
스크립트를 로컬에서 실행 해보십시오. 내 테스트 VM 중 하나에서 내 스크립트를 테스트 할 때 스크립트의 소요 시간의 절반 정도 인 20000 개의 폴더에서 약 15 분이 걸렸습니다. –