niet werkende WScript.Shell

Status
Niet open voor verdere reacties.

jofred

Gebruiker
Lid geworden
16 dec 2006
Berichten
172
Ik krijg het volgende stuk code niet aan de praat.

Code:
Dim ws As Worksheet
Dim ToRow As Long 
Dim wsShell As Object
Dim MyFile  As String
Dim wsCommand As String
Dim wsExecObject As Object
'-
Dim MyResults As Variant
'- break down string
Dim Cnum As Integer             ' character position
Dim MyChar As String            ' singe character
Dim MyCharCode As Integer       ' character code - to get carriage return
Dim MyStr As String             ' single line extract
'===========================================
'- MAIN ROUTINE
'===========================================
Sub LIST_ACL()
    Application.ScreenUpdating = False
    MyFile = "G:\map3.xls"
    
    Workbooks.Add  ' een nieuw werkboek maken met een tabblad
    Application.DisplayAlerts = False
    While Worksheets.Count > 1
        Worksheets(2).Delete
    Wend
    Application.DisplayAlerts = True
    
    Set ws = ActiveSheet
    ws.Columns("A:A").ClearContents
    ToRow = 1                       ' first worksheet row for results
    '-------------------------------------------------------------------------
    Set wsShell = CreateObject("WScript.Shell")
    wsCommand = "c:\winnt\system32\cacls.exe " & Chr(34) & MyFile & Chr(34)
    Set wsExecObject = wsShell.Exec(wsCommand)
De gegenereerde code die wordt uitgevoerd in het laatste statement is:

c:\winnt\system32\cacls.exe "G:\map3.xls"

Als ik dit statement los uitvoer op de command prompt, dan levert het resultaat op.
Bij de uitvoering van de VBA-code, strandt deze in een foutmelding: methode wordt niet herkend.
Ik gebruik Excel 2003 in combinatie met Windows 2000 Professional (allebei Nederlandse versie)

Wat moet ik doen om dit aan de praat te krijgen?
 
waarom gebruik je de WScript shell en niet de VBA-build in Shell?

wat is cacls.exe voor een programma?

Enjoy!
 
Guus,

Allereerst dank voor je reactie.
De antwoorden op je vraag:
1) geen bijzondere reden anders dan gewoon over genomen van een voorbeeld
2) cacls.exe is een programma waarmee je de rechten op bestanden en mappen kunnen tonen en evt. wijzigen. In dit voorbeeld wil ik ze alleen uitlezen en weergeven in een Excel-werkblad.

Wat zou ik aan de code moeten wijzigen om van de VBA-build in Shell gebruik te maken? Dan kan ik proberen of dit het wel werkt.
 
Uit de Access Help (F1):rolleyes:

Code:
Dim RetVal
RetVal = Shell("C:\WINDOWS\CALC.EXE", 1)    ' Run Calculator.
 
Guus,

Ik heb je voorstel uitgevoerd, alleen heeft dit niet resultaat wat ik verwacht. Ik heb geprobeerd te achterhalen waarom niet. :confused:
De functie Shell geeft volgens de helpfunctie "een Variant (Double) als resultaat die het taak-id weergeeft, wanneer het programma met succes wordt gestart. Als het programma niet met succes wordt gestart is het resultaat nul.".
Als output verwacht ik echter inhoudelijke informatie als uitvoer, nl. het overzicht van de verleende rechten op een bestand. Deze uitvoer wil ik verder verwerken tot een leesbaar overzicht.
Ik heb een schermprintje bijgevoegd van de output van het statement via de command-prompt.
 

Bijlagen

  • Klembord01.jpg
    Klembord01.jpg
    91,8 KB · Weergaven: 48
Krijg je die wel als je het commando uitvoert met WScript.Shell?

Je kan je output opvangen door je commando uit te breiden met een " >output.txt" eventueel aangevuld met "2>&1" dat is afhankelijk naar welke filedescriptor wordt geschreven. 1 is standaard output en 2 is standaard error. Met "2>&1" wordt standaard error ook naar 1 geschreven. Die vang je beide dan weer op met "> output.txt"

Daarna kan je die file oppakken en uitlezen.

Maar als het WScript.Shell commando wel zou moeten werken hetgeen ik betwijfel dan krijgen we die wel werkend. Kan je een voorbeeldje sturen waarbij je constructie wel werkt?

HTH:D
 
Ik heb mijn code inmiddels uitgeprobeerd op een PC met XP Professional i.c.m. Excel 2003 en op een PC met Vista Home Premium i.c.m. Excel 2007.
In beide gevallen leverde de code wel het gewenste resultaat op.
Ik denk daarom dat de optie in combinatie met Windows 2000 om een of andere duistere reden niet tot het gewenste resultaat leidt.

Wie het weet mag het zeggen. Als iemand nog een oplossing weet om het gewenste resultaat in Windows 2000 te bereiken, is dat mooi meegenomen.

Wat mij betreft is de vraag opgelost, oftewel ik berust er maar in
 
Het lijkt wel of c:\winnt\system32\cacls.exe een hulpprogramma van Windows is.
Als Windows 2000 dat hulpprogramma niet bevat is het niet vreemd dat het met VBA niet aangeroepen kan worden.
Kopieer het programma van een computer waar het wel staat naar de computer met Windows 2000.
Wellicht lukt het dan wel.
 
snb,

Het programma bestaat wel in Windows 2000. In een van de eerdere posts heb ik aangegeven dat ik wel resultaat krijg van de opdracht als ik die los vanaf de opdrachtprompt (DOS-venster) uitvoer.
Dit verbaast me dus het meest.
 
Dit onderwerp heeft me niet losgelaten en ik kreeg vanavond een brainwave :D
Op de windows 2000-machine had ik een geslipstreamde installatie van Windows 2000 gedaan, waarbij ik ook een aantal onderdelen uit de installatie heb verwijderd (met nLite)
Een van die verwijderde onderdelen was Windows Script Host. Ik heb daarop dit programma los weer geïnstalleerd en vervolgens de code van deze post weer gedraaid.
En zowaar kreeg ik zonder foutmeldingen het resultaat dat ik verwacht had.
Dus het raadsel is opgelost.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan