2013-04-14 2 views
-1

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 

답변

2

당신은 strPath에 백 슬래시를 이스케이프하지 않습니다. WMI에서 백 슬래시는 escape characters이므로 두 배로 백 슬래시를 리터럴 백 슬래시로 바꾸지 않으면 WMI 쿼리에서 해당 파일을 찾을 수 없습니다.

또 다른 잠재적 인 결함이 있습니다. 파일 이름을 인용 할 때는 작은 따옴표를 사용합니다. 단일 따옴표는 NTFS 파일 이름에서 유효한 문자입니다. 스크립트가 이름에 작은 따옴표를 포함하는 파일로 실행되는 경우 문자는 WMI 쿼리의 파일 이름 문자열을 조기에 종료하게되고 나머지 파일 이름은 쿼리를 유효하지 않게 만듭니다. 나는 this이라고 썼을 때 같은 문제에 부딪쳤다. 이 교체

:

Set objSecuritySettings = objWMIService.Get _ 
    ("Win32_LogicalFileSecuritySetting.Path='" & strPath & "'") 

이와 :

Set objSecuritySettings = objWMIService.Get _ 
    ("Win32_LogicalFileSecuritySetting.Path=""" & Replace(strPath,"\","\\") & """") 

은 당신이 두 문제를 제거해야한다.

+0

감사합니다. 나는 하나의 후속 문제를 가지고 있는데, 매우 느리게 실행되는 것 같습니다. 내 고용주가 폴더에 대한 명시 적 권한에만 관심이 있기 때문에 objFile 검사기 부분을 제거하고 테스트 환경에서 폴더가 비교적 적은데 상대적으로 빠르지 만 약 94000 개의 폴더/하위 폴더가있는 공유 네트워크 드라이브에서 느슨하게 설정하면 그것에 완료하는 데 약 2 시간이 걸렸습니다. 이 크기의 파일 구조가 적당하다고 생각하십니까? 또는 프로세스 속도를 높이기 위해 수행 할 수있는 작업이 있습니까? – user2278760

+0

스크립트를 로컬에서 실행 해보십시오. 내 테스트 VM 중 하나에서 내 스크립트를 테스트 할 때 스크립트의 소요 시간의 절반 정도 인 20000 개의 폴더에서 약 15 분이 걸렸습니다. –