[VB/WMI] Invalid object path bij ' in folder*

Pagina: 1
Acties:
  • 132 views sinds 30-01-2008
  • Reageer

  • midget
  • Registratie: Maart 2001
  • Laatst online: 19:31
Hieronder een leuk maar lastig probleem met WMI en VB.
Het onderstaande script wordt gebruikt om rechten uit te lezen op een Windows 2000 Server.
Alles gaat goed zolang de folder geen ' bevat.

Hieronder heb ik de code zo aangepast zie regel 40 dat deze de rechten moet uitlezen van folder:
C:\Scripts\New Folders\test's.
Echter geeft WMI hier direct de error terug SWbemServicesEx: Invalid object path.

De volgende onderstaande pagina's van Microsoft heb ik gebruikt om dit probleem te verhelpen echter kom ik er niet uit.
http://www.microsoft.com/.../qanda/dec04/hey1217.mspx
http://www.microsoft.com/.../qanda/mar06/hey0315.mspx

Wie kan mij helpen in de juiste richting te gaan zoeken.
Google en microsoft heb ik ondertussen wel gezien.

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
call IndexScripts

sub IndexScripts()
    dim fso
    set fso = createobject("scripting.filesystemobject")
    dim loc
    if WScript.Arguments.Count = 0 Then
        loc = fso.GetAbsolutePathName(".")
    Else
        loc = WScript.Arguments(0)
    end If
    GetWorkingFolder loc, 0, 1, "|"
    set fso = Nothing
End Sub

function GetWorkingFolder(foldspec, foldcount, _
                                   firsttime, spacer)

    Dim objShell,oExec
    Set objShell = CreateObject("WScript.Shell")
    dim fso
    Set fso = CreateObject("Scripting.FileSystemObject")
    dim fold
    set fold = fso.GetFolder(foldspec)
    dim foldcol
    set foldcol = fold.SubFolders
    'do the first folder stuff
    if firsttime = 1 Then
        foldcount = foldcol.count
        firsttime = 0
    end If
    dim remaincount
    remaincount = foldcol.count
    'do the subfolder stuff
    dim sf
    for each sf in foldcol   
        remaincount = GetWorkingFolder (foldspec +"\"+sf.name, _
                                   remaincount, firsttime, spacer)

strFolderName = "C:\\Scripts\\New Folders\\test\'s"

                                   SE_DACL_PRESENT = &h4
                                   ACCESS_ALLOWED_ACE_TYPE = &h0
                                   ACCESS_DENIED_ACE_TYPE  = &h1
                                
                                   FILE_ALL_ACCESS         = &h1f01ff
                                   FOLDER_ADD_SUBDIRECTORY = &h000004
                                   FILE_DELETE             = &h010000
                                   FILE_DELETE_CHILD       = &h000040
                                   FOLDER_TRAVERSE         = &h000020
                                   FILE_READ_ATTRIBUTES    = &h000080
                                   FILE_READ_CONTROL       = &h020000
                                   FOLDER_LIST_DIRECTORY   = &h000001
                                   FILE_READ_EA            = &h000008
                                   FILE_SYNCHRONIZE        = &h100000
                                   FILE_WRITE_ATTRIBUTES   = &h000100
                                   FILE_WRITE_DAC          = &h040000
                                   FOLDER_ADD_FILE         = &h000002
                                   FILE_WRITE_EA           = &h000010
                                   FILE_WRITE_OWNER        = &h080000

                                   Set objWMIService = GetObject("winmgmts:")
                                   Set objFolderSecuritySettings = _
                                   objWMIService.Get("Win32_LogicalFileSecuritySetting='" & strFolderName & "'")
                                   intRetVal = objFolderSecuritySettings.GetSecurityDescriptor(objSD)
    
                                   intControlFlags = objSD.ControlFlags
                             
                                   If intControlFlags AND SE_DACL_PRESENT Then
                                      arrACEs = objSD.DACL
                                      For Each objACE in arrACEs
                                         WScript.Echo objACE.Trustee.Domain & "\" & objACE.Trustee.Name
                                         If objACE.AceType = ACCESS_ALLOWED_ACE_TYPE Then
                                            WScript.Echo vbTab & "Allowed:"
                                         ElseIf objACE.AceType = ACCESS_DENIED_ACE_TYPE Then
                                            WScript.Echo vbTab & "Denied:"
                                         End If
                                         If objACE.AccessMask AND FILE_ALL_ACCESS Then
                                            WScript.Echo vbTab & vbTab & "FILE_ALL_ACCESS "
                                         End If
                                         If objACE.AccessMask AND FOLDER_ADD_SUBDIRECTORY Then
                                            WScript.Echo vbTab & vbTab & " FOLDER_ADD_SUBDIRECTORY "
                                         End If
                                         If objACE.AccessMask AND FILE_DELETE Then
                                            WScript.Echo vbTab & vbTab & "FILE_DELETE "
                                         End If
                                         If objACE.AccessMask AND FILE_DELETE_CHILD Then
                                            WScript.Echo vbTab & vbTab & "FILE_DELETE_CHILD "
                                         End If
                                         If objACE.AccessMask AND FOLDER_TRAVERSE Then
                                            WScript.Echo vbTab & vbTab & " FOLDER_TRAVERSE "
                                         End If
                                         If objACE.AccessMask AND FILE_READ_ATTRIBUTES Then
                                            WScript.Echo vbTab & vbTab & "FILE_READ_ATTRIBUTES "
                                         End If
                                         If objACE.AccessMask AND FILE_READ_CONTROL Then
                                            WScript.Echo vbTab & vbTab & "FILE_READ_CONTROL "
                                         End If
                                         If objACE.AccessMask AND FOLDER_LIST_DIRECTORY Then
                                            WScript.Echo vbTab & vbTab & " FOLDER_LIST_DIRECTORY "
                                         End If
                                         If objACE.AccessMask AND FILE_READ_EA Then
                                            WScript.Echo vbTab & vbTab & "FILE_READ_EA "
                                         End If
                                         If objACE.AccessMask AND FILE_SYNCHRONIZE Then
                                            WScript.Echo vbTab & vbTab & "FILE_SYNCHRONIZE "
                                         End If
                                         If objACE.AccessMask AND FILE_WRITE_ATTRIBUTES Then
                                            WScript.Echo vbTab & vbTab & "FILE_WRITE_ATTRIBUTES "
                                         End If
                                         If objACE.AccessMask AND FILE_WRITE_DAC Then
                                            WScript.Echo vbTab & vbTab & "FILE_WRITE_DAC "
                                        End If
                                         If objACE.AccessMask AND FOLDER_ADD_FILE Then
                                            WScript.Echo vbTab & vbTab & " FOLDER_ADD_FILE "
                                         End If
                                         If objACE.AccessMask AND FILE_WRITE_EA Then
                                            WScript.Echo vbTab & vbTab & "FILE_WRITE_EA "
                                         End If
                                         If objACE.AccessMask AND FILE_WRITE_OWNER Then
                                            WScript.Echo vbTab & vbTab & "FILE_WRITE_OWNER "
                                        End If
                                     Next
                                   Else
                                      WScript.Echo "No DACL present in security descriptor"
                                   End If

'********************************************************************************
    next 
    'clean up
    set fso = Nothing
    GetWorkingFolder = foldcount - 1
end function

  • Wolf87
  • Registratie: Juli 2004
  • Laatst online: 19:16
ligt dat niet gewoon aan de apostrophe die je gebruikt in het pad?

  • midget
  • Registratie: Maart 2001
  • Laatst online: 19:31
ja dat klopt, maar het gaat om een inventarisatie.
En sommige gebruikers hebben nu eenmaal een map die bv Foto's heet.
Dat moet dus worden geinventariseerd.

Verwijderd

in de 1e link staat dat je bij het filesystemobject niets hoeft te escapen, dus ook de backslashes niet. Ik neem aan dat je dat al geprobeerd hebt??Laat maar je gebruikt het WMI-object in combinatie met de padnaam.

Zoek eens op je error, lijkt er op dat hij iets niet kan vinden... Zie hier bijv.:

http://www.microsoft.com/.../scriptshop/shop1205.mspx

[ Voor 46% gewijzigd door Verwijderd op 08-11-2006 19:33 ]


  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 01-12 20:19

Gerco

Professional Newbie

In VB is de \ geen escape character. Je moet gewoon dit gebruiken:
Visual Basic .NET:
1
strFolderName = "C:\Scripts\New Folders\test's"

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • midget
  • Registratie: Maart 2001
  • Laatst online: 19:31
Gerco schreef op woensdag 08 november 2006 @ 19:41:
In VB is de \ geen escape character. Je moet gewoon dit gebruiken:
Visual Basic .NET:
1
strFolderName = "C:\Scripts\New Folders\test's"
Dit werkt ook niet aangezien ik de strFolderName oproep in een WMI Query en die gaat onderuit door de '
\ is wel een escape in WMI maar werkt op de een of andere manier niet.

  • midget
  • Registratie: Maart 2001
  • Laatst online: 19:31
Hij is opgelost.
Hieronder het werkende script voor de mensen die hem ook kunnen gebruiken.
Hierin zitten wat extra functies maar het idee is hetzelfde:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
' First thing, check the argument list for a directory.
' If they didn't specify one, use the current directory.
'option Explicit
' Run the function :)
'On Error Resume Next

call IndexScripts

sub IndexScripts()
    dim fso
    set fso = createobject("scripting.filesystemobject")
    dim loc
    if WScript.Arguments.Count = 0 Then
        loc = fso.GetAbsolutePathName(".")
    Else
        loc = WScript.Arguments(0)
    end If
    GetWorkingFolder loc, 0, 1, "|"
    set fso = Nothing
End Sub

' called recursively to get a folder to work In

function GetWorkingFolder(foldspec, foldcount, _
                                   firsttime, spacer)
    Dim objShell,oExec
    Set objShell = CreateObject("WScript.Shell")
    dim fso
    Set fso = CreateObject("Scripting.FileSystemObject")
    dim fold
    set fold = fso.GetFolder(foldspec)
    dim foldcol
    set foldcol = fold.SubFolders
    'do the first folder stuff
    if firsttime = 1 Then

'         wscript.echo fold.path
        foldcount = foldcol.count
        firsttime = 0
    end If

    dim remaincount
    remaincount = foldcol.count
    'do the subfolder stuff
    dim sf
    for each sf in foldcol
        
'         Set oExec = objShell.Exec("cacls " & chr(34) & sf.path & chr(34))
'         
'         Do While Not oExec.StdOut.AtEndOfStream
'              str = oExec.StdOut.ReadAll
'              Dim str
'              Wscript.StdOut.WriteLine str
'         Loop
'         
'         set oExec = nothing
'         
'         remaincount = GetWorkingFolder (foldspec +"\"+sf.name, _
'                                    remaincount, firsttime, spacer)

        remaincount = GetWorkingFolder (foldspec +"\"+sf.name, _
                                   remaincount, firsttime, spacer)
                              
'********************************************************************************

                                   strFolderName = sf.path

                                   SE_DACL_PRESENT = &h4
                                   ACCESS_ALLOWED_ACE_TYPE = &h0
                                   ACCESS_DENIED_ACE_TYPE  = &h1
                                   FILE_ALL_ACCESS         = &h1f01ff
                                   FOLDER_ADD_SUBDIRECTORY = &h000004
                                   FILE_DELETE             = &h010000
                                   FILE_DELETE_CHILD       = &h000040
                                   FOLDER_TRAVERSE         = &h000020
                                   FILE_READ_ATTRIBUTES    = &h000080
                                   FILE_READ_CONTROL       = &h020000
                                   FOLDER_LIST_DIRECTORY   = &h000001
                                   FILE_READ_EA            = &h000008
                                   FILE_SYNCHRONIZE        = &h100000
                                   FILE_WRITE_ATTRIBUTES   = &h000100
                                   FILE_WRITE_DAC          = &h040000
                                   FOLDER_ADD_FILE         = &h000002
                                   FILE_WRITE_EA           = &h000010
                                   FILE_WRITE_OWNER        = &h080000

    Set WMI = GetObject("winmgmts:\\.\root\cimv2") 
    Set objFolderSecuritySettings = WMI.Get(_ 
     "Win32_LogicalFileSecuritySetting.Path=" _ 
       & Chr(34) _ 
       & replace(strFolderName,"\","\\") _ 
       & Chr(34) _ 
      ) 
    WScript.Echo strFolderName
                                   'Set objWMIService = GetObject("winmgmts:")
                                   'Set objFolderSecuritySettings = _
                                   'objWMIService.Get("Win32_LogicalFileSecuritySetting='" & strFolderName & "'")
                                   intRetVal = objFolderSecuritySettings.GetSecurityDescriptor(objSD)
                                   intControlFlags = objSD.ControlFlags
                                   If intControlFlags AND SE_DACL_PRESENT Then
                                      arrACEs = objSD.DACL
                                      For Each objACE in arrACEs
                                         WScript.Echo objACE.Trustee.Domain & "\" & objACE.Trustee.Name
                                         If objACE.AceType = ACCESS_ALLOWED_ACE_TYPE Then
                                            WScript.Echo vbTab & "Allowed:"
                                         ElseIf objACE.AceType = ACCESS_DENIED_ACE_TYPE Then
                                            WScript.Echo vbTab & "Denied:"
                                         End If
                                         If objACE.AccessMask AND FILE_ALL_ACCESS Then
                                            WScript.Echo vbTab & vbTab & "FILE_ALL_ACCESS "
                                         End If
                                         If objACE.AccessMask AND FOLDER_ADD_SUBDIRECTORY Then
                                            WScript.Echo vbTab & vbTab & " FOLDER_ADD_SUBDIRECTORY "
                                         End If
                                         If objACE.AccessMask AND FILE_DELETE Then
                                            WScript.Echo vbTab & vbTab & "FILE_DELETE "
                                         End If
                                         If objACE.AccessMask AND FILE_DELETE_CHILD Then
                                            WScript.Echo vbTab & vbTab & "FILE_DELETE_CHILD "
                                         End If
                                         If objACE.AccessMask AND FOLDER_TRAVERSE Then
                                            WScript.Echo vbTab & vbTab & " FOLDER_TRAVERSE "
                                         End If
                                         If objACE.AccessMask AND FILE_READ_ATTRIBUTES Then
                                            WScript.Echo vbTab & vbTab & "FILE_READ_ATTRIBUTES "
                                         End If
                                         If objACE.AccessMask AND FILE_READ_CONTROL Then
                                            WScript.Echo vbTab & vbTab & "FILE_READ_CONTROL "
                                         End If
                                         If objACE.AccessMask AND FOLDER_LIST_DIRECTORY Then
                                            WScript.Echo vbTab & vbTab & " FOLDER_LIST_DIRECTORY "
                                         End If
                                         If objACE.AccessMask AND FILE_READ_EA Then
                                            WScript.Echo vbTab & vbTab & "FILE_READ_EA "
                                         End If
                                         If objACE.AccessMask AND FILE_SYNCHRONIZE Then
                                            WScript.Echo vbTab & vbTab & "FILE_SYNCHRONIZE "
                                         End If
                                         If objACE.AccessMask AND FILE_WRITE_ATTRIBUTES Then
                                            WScript.Echo vbTab & vbTab & "FILE_WRITE_ATTRIBUTES "
                                         End If
                                         If objACE.AccessMask AND FILE_WRITE_DAC Then
                                            WScript.Echo vbTab & vbTab & "FILE_WRITE_DAC "
                                         End If
                                         If objACE.AccessMask AND FOLDER_ADD_FILE Then
                                            WScript.Echo vbTab & vbTab & " FOLDER_ADD_FILE "
                                         End If
                                         If objACE.AccessMask AND FILE_WRITE_EA Then
                                            WScript.Echo vbTab & vbTab & "FILE_WRITE_EA "
                                         End If
                                         If objACE.AccessMask AND FILE_WRITE_OWNER Then
                                            WScript.Echo vbTab & vbTab & "FILE_WRITE_OWNER "
                                         End If
                                      Next
                                   Else

                                      WScript.Echo "No DACL present in security descriptor"
                                   End If
'********************************************************************************
    next 
    'clean up
    set fso = Nothing
    GetWorkingFolder = foldcount - 1
end function
Pagina: 1