VisualBasic WSHShell.run - Datei nicht gefunden - vorher gings noch

Atreju93

Lieutenant
Registriert
Nov. 2010
Beiträge
594
Hallo zusammen. Ich habe ein Tool zusammengebastelt, welches mir zu einem Benutzername die im ActiveDirectory abgelegte Beschreibung anzeigt. Das hat gestern und heute morgen einwandfrei funktioniert.

Als ich das Tool jedoch am Arbeitskollegen weitergegeben habe, bekam er Die Fehlermeldung:

Zeile: 8
Zeichen: 1
Fehler: Die Datei wurde nicht gefunden
Code: 800A0035

Bei mir hats noch funktioniert, nach etwas hin und her Testen mit dem Temp-Verzeichnis habe ich die output.txt einmal gelöscht und seither funktioniert es bei mir auch nicht mehr.

Ich habe das Script total auseinander genommen und jetzt funktionieren sogar einfachste. WSHShell.run Befehle für CMD nicht mehr, selbe Fehlermeldung. z.b.

Code:
Set WshShell = WScript.CreateObject("WScript.Shell")
WSHShell.Run"echo hallo > C:\Temp\output.txt", 0, True

Fehlermeldung:
Zeile 2
zeichen 1
Fehler: Das System kann die angegebene Datei nicht finden

Der Ordner C:\Temp gibt es und wenn ich den Befehl manuell im CMD-Fenster eingebe, funktioniert es tadellos.

Hier der Code zu meinem eigentlichen Script:

Code:
Set WshShell = WScript.CreateObject("WScript.Shell")
eingabe = inputbox ("Benutzername")
WSHShell.Run"%comspec% /c ""net user "&eingabe&" /domain | findstr ""Beschreibung"&vbCRLF&" Vollständiger Name"" > C:\Temp\output.txt""", 0, True
WScript.Sleep 100
strdatei="C:\Temp\output.txt"
Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTest = objFSO.GetFile(strdatei)
If objTest.Size > 0 Then
Set objFile = objFSO.OpenTextFile(strdatei, ForReading)
strText = objFile.ReadAll 
wscript.echo strText
objFile.Close
end if

Hat jemand eine Idee?
 
Der erste "einfachste" Befehl ist ganz einfach zu einfach (selten so einen tollen Satz geschrieben *g*)
echo ist keine exe sondern ein Befehl den nur die cmd verarbeiten kann, also muss es auch

Code:
    Set WshShell = WScript.CreateObject("WScript.Shell")
    WSHShell.Run"%comspec% /c echo hallo > C:\Temp\output.txt", 0, True

heißen, so wie dus im eigentlichen Script auch gemacht hast.
Der Fehler in Zeile 8 deutet darauf hin, dass du die output.txt nicht erzeugen kannst. Ich würd als erstes mal den code unten auf

Code:
WSHShell.Run"%comspec% /k ""net user "&eingabe&" /domain | findstr ""Beschreibung"&vbCRLF&" Vollständiger Name"" > C:\Temp\output.txt""", 1, True

ändern zu Debug Zwecken dann kannst du die Ausgabe der cmd lesen da wird vermutlich ein Grund drin stehn wieso er dir das File nicht mehr erstellt.

EDIT: Ich hab das mal ausprobiert ich denke das problem liegt an der newline die du da einfügst in das command. Wenn dus manuell eingibst wie machst du denn dann die newline?
 
Zuletzt bearbeitet: (getestet)
Das mit dem newline löschen hab ich schon versucht gehabt, hat keine Besserung gebracht.. aber jetzt habe ich es nochmals rausgelöscht und siehe da, es funktioniert nun.. die Datei wird angelegt. Einzig die Umlaute werden nicht korrekt angezeit (Vollständiger Name)

Mein funktionierender Code lautet nun:

Code:
Set WshShell = WScript.CreateObject("WScript.Shell")
eingabe = inputbox ("Benutzername")
WSHShell.Run"%comspec% /c ""net user "&eingabe& " /domain | findstr ""Beschreibung Vollständiger Name"" > C:\Temp\output.txt""", 0, True
WScript.Sleep 100
strdatei="C:\Temp\output.txt"
Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTest = objFSO.GetFile(strdatei)
If objTest.Size > 0 Then
Set objFile = objFSO.OpenTextFile(strdatei, ForReading)
strText = objFile.ReadAll 
wscript.echo strText
objFile.Close
end if
 
Gut dass es funktioniert. Wenn ich dir aber einen allgemeinen Hinweis geben darf... Der Code ist sehr "indirekt". Du könntest mit VBScript die AD ganz einfach direkt befragen:

Code:
Const ADS_NAME_INITTYPE_GC = 3
Const ADS_NAME_TYPE_NT4 = 3
Const ADS_NAME_TYPE_1779 = 1

eingabe = InputBox ("Benutzername")

' Network Object um den namen der Domäne abzufragen
Set nwo = CreateObject("WScript.Network")
' Das NameTranslate Object wandelt den NT Benutzernamen in den Distinguished Name (DN) für den LDAP provider.
Set objTrans = CreateObject("NameTranslate")
' das NameTranslate Object wird mit dem Global Catalog intialisiert
objTrans.Init ADS_NAME_INITTYPE_GC, ""
' Die Set Methode gibt das format for den NT namen vor (verwendet nwo.Domain für den namen der aktuellen Domain, kann auch händisch eingegeben werden)
objTrans.Set ADS_NAME_TYPE_NT4, nwo.UserDomain & "\" & eingabe
' Die Get Methode bezieht den DN laut RFC 1779 spezifikation
strUserDN = objTrans.Get(ADS_NAME_TYPE_1779)
' Falls im namen irgendwelche Slashes '/' vorkommen, müssten sie mit Backslash Slash '\/' escaped werden
' GetObject liefert das eigentliche AD Object des Users mit LDPA:// + DN
Set user = GetObject("LDAP://" & Replace(strUserDN, "/", "\/")) 

WScript.Echo user.description

Keine files, oder cmd calls die man parsen muss
 
@Syberdoor

Danke vielmals, dies ist natürlich die weitaus bessere und zuverlässigere Methode..! Ich bin leider nicht sehr bewandert in Scripting, bzw es ist schon so lange her, dass ich viel vergessen habe und daher mit "Umwegen" an mein Ziel gelangen musste.

Die Idee mit AD direkt ansprechen hatte ich auch, aber bei der Umsetzung gescheitert.

Dein Script funktioniert übrigens perfekt und tadellos
 
Ja ich weiß die AD nach einem User zu durchsuchen ist ein bisschen merkwürdig, deswegen hab ich auch versucht es so gut wie möglich für dich zu kommentieren.
Schön dass es funktioniert!
 
Zurück
Oben