Error - Batch findet die TXT - Dateien nicht wenn man die Batch Datei als Administrator ausführt
Hallo alle zusammen
Ich habe ein Problem mit meiner Batch Datei.
Aber zuerst was ich genau machen will/sollte(ein bisschen Vorgeschichte damit man es besser versteht):
-Ich habe ein Batch Programm geschrieben mit dem man sich schnell und einfach einen User erstellen lässt und den dann in der Admingruppe
den Administrator ersetzt und den Administrator Account auch deaktiviert.
Soweit hat alles auch funktioniert. Doch nun will ich das ganze noch schön darstellen mit einem GUI. Also habe
ich mich über HTA informiert und so ein GUI erstellt.
So nun zu meinem Problem:
Ich habe meine HTA-Anwendung so gestaltet dass sie mir die Eingaben zu Username, Passwort & Ob es ein Admin Konto werden soll in 3 TXT-files
speichert. Nun wollte ich die files danach in der Bach-Datei einlesen, und danach mit dem "net user" Befehl einen User erstellen. aber wenn ich diese
Batch-Datei als Standard User ausführe verweigert es den Zugriff(Was nicht verwunderlich ist), Aber wenn ich sie als Administrator ausführe gibt es immer nur aus dass die
Dateien nicht gefunden werden können . Obwohl sie im selben Ordner sind. Kann mir jemand helfen? oder sagen wie ich dieses Problem lösen kann.
Freundliche Grüsse
Noah Gloor
Im Anhang:
-Mein HTA-Script
-Meine Batch Code
PS: Sorry falls ich dumme Fehler gemacht haben sollte. Ich bin noch kein Profi ;)
Mein HTA-Script:
L>
<HEAD>
<HTA:APPLICATION
SCROLL="no"
SYSMENU="yes"
MaximizeButton="No"
Border="dialog"
windowstate="normal"
height=250
width=200
<TITLE>AAC</TITLE>
<script language="VBScript">
Sub SaveUsername
SET objFSO = CreateObject("Scripting.FileSystemObject")
If objFSO.FileExists("username.txt") then
Set objFile =objFSO.OpenTextFile("username.txt",2)
strLine = vUsername.Value
objFile.WriteLine strLine
objFile.Close
Else
Set objFile = objFSO.CreateTextFile("username.txt")
strLine = vUsername.Value
objFile.WriteLine strLine
objFile.Close
End If
End Sub
Sub SavePassword
SET objFSO = CreateObject("Scripting.FileSystemObject")
If objFSO.FileExists("password.txt") then
Set objFile =objFSO.OpenTextFile("password.txt",2)
strLine = vPassword.Value
objFile.WriteLine strLine
objFile.Close
Else
Set objFile = objFSO.CreateTextFile("password.txt")
strLine = vPassword.Value
objFile.WriteLine strLine
objFile.Close
End If
End Sub
Sub SaveAdmin
SET objFSO = CreateObject("Scripting.FileSystemObject")
If objFSO.FileExists("administrator.txt") then
Set objFile =objFSO.OpenTextFile("administrator.txt",2)
strLine = AdminCB.Value
objFile.WriteLine strLine
objFile.Close
Else
Set objFile = objFSO.CreateTextFile("administrator.txt")
strLine = AdminCB.Value
objFile.WriteLine strLine
objFile.Close
End If
window.close()
End Sub
Sub Run
SaveUsername
SavePassword
SaveAdmin
End Sub
</script>
<script language="JavaScript">
window.resizeTo(200,250);
</script>
</HEAD>
<BODY>
<div>Username:</div>
<div><input type="text" name="vUsername" size="20"></div>
<div>Password:</div>
<div><input type="text" name="vPassword" size="20"></div>
<div>Confirm Password:</div>
<div><input type="text" name="vConfirmPassword" size="20"></div>
<div><input type="checkbox"name="AdminCB"value="1">Administrator</div>
<br>
<input type="button" value="Okay" name="run_button" onClick="Run">
<br>
</BODY>
</HTML>
Meine Batch Datei:
@echo off
cls
for /f "usebackq" %%a in (username.txt) do set _username=%%a
for /f "usebackq" %%a in (password.txt) do set _password=%%a
net user %_username% %_password% /add
pause
Ich habe ein Problem mit meiner Batch Datei.
Aber zuerst was ich genau machen will/sollte(ein bisschen Vorgeschichte damit man es besser versteht):
-Ich habe ein Batch Programm geschrieben mit dem man sich schnell und einfach einen User erstellen lässt und den dann in der Admingruppe
den Administrator ersetzt und den Administrator Account auch deaktiviert.
Soweit hat alles auch funktioniert. Doch nun will ich das ganze noch schön darstellen mit einem GUI. Also habe
ich mich über HTA informiert und so ein GUI erstellt.
So nun zu meinem Problem:
Ich habe meine HTA-Anwendung so gestaltet dass sie mir die Eingaben zu Username, Passwort & Ob es ein Admin Konto werden soll in 3 TXT-files
speichert. Nun wollte ich die files danach in der Bach-Datei einlesen, und danach mit dem "net user" Befehl einen User erstellen. aber wenn ich diese
Batch-Datei als Standard User ausführe verweigert es den Zugriff(Was nicht verwunderlich ist), Aber wenn ich sie als Administrator ausführe gibt es immer nur aus dass die
Dateien nicht gefunden werden können . Obwohl sie im selben Ordner sind. Kann mir jemand helfen? oder sagen wie ich dieses Problem lösen kann.
Freundliche Grüsse
Noah Gloor
Im Anhang:
-Mein HTA-Script
-Meine Batch Code
PS: Sorry falls ich dumme Fehler gemacht haben sollte. Ich bin noch kein Profi ;)
Mein HTA-Script:
L>
<HEAD>
<HTA:APPLICATION
SCROLL="no"
SYSMENU="yes"
MaximizeButton="No"
Border="dialog"
windowstate="normal"
height=250
width=200
<TITLE>AAC</TITLE>
<script language="VBScript">
Sub SaveUsername
SET objFSO = CreateObject("Scripting.FileSystemObject")
If objFSO.FileExists("username.txt") then
Set objFile =objFSO.OpenTextFile("username.txt",2)
strLine = vUsername.Value
objFile.WriteLine strLine
objFile.Close
Else
Set objFile = objFSO.CreateTextFile("username.txt")
strLine = vUsername.Value
objFile.WriteLine strLine
objFile.Close
End If
End Sub
Sub SavePassword
SET objFSO = CreateObject("Scripting.FileSystemObject")
If objFSO.FileExists("password.txt") then
Set objFile =objFSO.OpenTextFile("password.txt",2)
strLine = vPassword.Value
objFile.WriteLine strLine
objFile.Close
Else
Set objFile = objFSO.CreateTextFile("password.txt")
strLine = vPassword.Value
objFile.WriteLine strLine
objFile.Close
End If
End Sub
Sub SaveAdmin
SET objFSO = CreateObject("Scripting.FileSystemObject")
If objFSO.FileExists("administrator.txt") then
Set objFile =objFSO.OpenTextFile("administrator.txt",2)
strLine = AdminCB.Value
objFile.WriteLine strLine
objFile.Close
Else
Set objFile = objFSO.CreateTextFile("administrator.txt")
strLine = AdminCB.Value
objFile.WriteLine strLine
objFile.Close
End If
window.close()
End Sub
Sub Run
SaveUsername
SavePassword
SaveAdmin
End Sub
</script>
<script language="JavaScript">
window.resizeTo(200,250);
</script>
</HEAD>
<BODY>
<div>Username:</div>
<div><input type="text" name="vUsername" size="20"></div>
<div>Password:</div>
<div><input type="text" name="vPassword" size="20"></div>
<div>Confirm Password:</div>
<div><input type="text" name="vConfirmPassword" size="20"></div>
<div><input type="checkbox"name="AdminCB"value="1">Administrator</div>
<br>
<input type="button" value="Okay" name="run_button" onClick="Run">
<br>
</BODY>
</HTML>
Meine Batch Datei:
@echo off
cls
for /f "usebackq" %%a in (username.txt) do set _username=%%a
for /f "usebackq" %%a in (password.txt) do set _password=%%a
net user %_username% %_password% /add
pause
Please also mark the comments that contributed to the solution of the article
Content-ID: 314579
Url: https://administrator.de/forum/error-batch-findet-die-txt-dateien-nicht-wenn-man-die-batch-datei-als-administrator-ausfuehrt-314579.html
Printed on: May 13, 2025 at 09:05 o'clock
14 Comments
Latest comment
Hi,
Hinweis:
BeimBatch -schreiben immer auf den "voll ausgeschriebenen Pfad" achten.
Beispiel:
Falsch: g:\Daten\install\setup.exe ( G: - wenn es ein gemapptes Laufwerk ist - mit "net use" - da der Admin, ja da ein andere Verbindung haben könnte - Stichwort: "Systemvariable")
Fast-Richtig: \\server.test.local\daten\install\setup.exe ( Server.test.local = IP 10.10.10.10 -> wenn DNS richtig funktioniert )
Richtig: \\10.10.10.10\daten\install\setup.exe ( Bemerkung dahinter welcher Server es ist )
usw.
Gruß
Holli
Hinweis:
BeimBatch -schreiben immer auf den "voll ausgeschriebenen Pfad" achten.
Beispiel:
Falsch: g:\Daten\install\setup.exe ( G: - wenn es ein gemapptes Laufwerk ist - mit "net use" - da der Admin, ja da ein andere Verbindung haben könnte - Stichwort: "Systemvariable")
Fast-Richtig: \\server.test.local\daten\install\setup.exe ( Server.test.local = IP 10.10.10.10 -> wenn DNS richtig funktioniert )
Richtig: \\10.10.10.10\daten\install\setup.exe ( Bemerkung dahinter welcher Server es ist )
usw.
Gruß
Holli
Hallo TheVo1d,
wenn Du den Benutzerkontext wechselst um die Batchdatei auszuführen, ändert sich automatisch auch das aktuelle Verzeichnis, ich tippe mal auf
BTW: Hier im Forum gibt es Tags für die Code-Formatierung, damit man Programmcode besser lesen kann. Siehe hier.
Gruß
Friemler
wenn Du den Benutzerkontext wechselst um die Batchdatei auszuführen, ändert sich automatisch auch das aktuelle Verzeichnis, ich tippe mal auf
C:\Windows\System32
. Dort werden Deine Textdateien natürlich nicht gefunden. Gib einfach absolute Pfade in den FOR
-Befehlen an oder übergib dem Batchscript beim Start den Pfad zu den Textdateien als Parameter und ändere die FOR
-Befehle entsprechend ab.BTW: Hier im Forum gibt es Tags für die Code-Formatierung, damit man Programmcode besser lesen kann. Siehe hier.
Gruß
Friemler
Ich sehe in Deinem Code nirgends eine Stelle, wo Du das Batchfile startest. Erzähle uns doch bitte zunächst mal wo und wie Du das machst, dann vereinfacht sich evtl. alles ganz erheblich.
Möglicherweise werden auch die Dateien mit den Benutzereingaben nicht mehr benötigt. Es ist sowieso keine gute Idee, Login-Informationen auf die Festplatte zu schreiben. Deinem Code nach zu urteilen werden diese Dateien auch nicht gelöscht - ganz schlecht.
Grüße
Friemler
PS:
Bitte ergänze die Code Tags in Deinem Eröffnungs-Posting!!
Möglicherweise werden auch die Dateien mit den Benutzereingaben nicht mehr benötigt. Es ist sowieso keine gute Idee, Login-Informationen auf die Festplatte zu schreiben. Deinem Code nach zu urteilen werden diese Dateien auch nicht gelöscht - ganz schlecht.
Grüße
Friemler
PS:
Bitte ergänze die Code Tags in Deinem Eröffnungs-Posting!!
Hallo Noah,
in dem Fall kannst Du alle Unterprogramme
Den Namen der Batchdatei (hier
abfragen. Die Batchdatei wird abhängig vom Status der Admin-Checkbox entweder unter dem aktuellen Benutzerkontext ausgeführt oder es werden per UAC-Dialog erhöhte Rechte angefordert und das Batchscript mit Admin-Rechten ausgeführt.
Wenn Du den letzten Parameter der
Die Validierung, ob in beide Passwortfelder das gleiche Passwort eingetragen wurde, fehlt natürlich noch...
Gruß
Friemler
in dem Fall kannst Du alle Unterprogramme
SaveXxxxx
entfernen und das HTA-File folgendermaßen schreiben:<HTML>
<HEAD>
<HTA:APPLICATION
ID="objHTA"
SCROLL="no"
SYSMENU="yes"
MaximizeButton="No"
Border="dialog"
windowstate="normal"
height=250
width=200/>
<TITLE>AAC</TITLE>
<script language="VBScript">
Sub Run
arrArgs = Split(UnQuoteString(objHTA.commandLine, """"), """ """)
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("Shell.Application")
strBatchScriptName = "mybatch.cmd"
strCommand = objFSO.BuildPath(objFSO.GetParentFolderName(arrArgs(0)), strBatchScriptName)
strParams = """" & vUsername.Value & """ """ & vPassword.Value & """ """ & AdminCB.Checked & """"
If AdminCB.Checked Then
objShell.ShellExecute "cmd.exe", "/c """"" & strCommand & """ " & strParams & """", "", "runas", 1
Else
objShell.ShellExecute "cmd.exe", "/c """"" & strCommand & """ " & strParams & """", "", "open", 1
End If
window.close()
End Sub
Function UnQuoteString(strString, strQuote)
Dim strResult
strResult = Trim(strString)
If Left(strResult, 1) & Right(strResult, 1) = strQuote & strQuote Then
strResult = Mid(strResult, 2, Len(strResult) - 2)
End If
UnQuoteString = strResult
End Function
</script>
<script language="JavaScript">
window.resizeTo(200, 250);
</script>
</HEAD>
<BODY>
<div>Username:</div>
<div><input type="text" name="vUsername" size="20"></div>
<div>Password:</div>
<div><input type="password" name="vPassword" size="20"></div>
<div>Confirm Password:</div>
<div><input type="password" name="vConfirmPassword" size="20"></div>
<div><input type="checkbox" name="AdminCB" checked>Administrator</div>
<br>
<input type="button" value="Okay" name="run_button" onClick="Run">
<br>
</BODY>
</HTML>
Den Namen der Batchdatei (hier
mybatch.cmd
in Zeile 22) musst Du natürlich noch anpassen. Die Werte der GUI-Controls aus der HTA kannst Du im Batchscript dann mit%~1
=> UserName,%~2
=> Password und%~3
=> Checked-Status der Admin-Checkbox (Wert:Wahr
oderFalsch
)
abfragen. Die Batchdatei wird abhängig vom Status der Admin-Checkbox entweder unter dem aktuellen Benutzerkontext ausgeführt oder es werden per UAC-Dialog erhöhte Rechte angefordert und das Batchscript mit Admin-Rechten ausgeführt.
Wenn Du den letzten Parameter der
ShellExecute
-Aufrufe in den Zeilen 27 und 29 (die 1) durch eine 0 ersetzt, wird das Batchscript in einem unsichtbaren Fenster ausgeführt.Die Validierung, ob in beide Passwortfelder das gleiche Passwort eingetragen wurde, fehlt natürlich noch...
Gruß
Friemler
Hallo Noah,
auch Dateien mit der Dateierweiterung
Ja, die Variablen
Was habe ich geändert?
So, ich hoffe mal, dass Dir diese Erklärungen etwas weiterhelfen. Um den Quellcode wirklich zu verstehen wirst Du trotzdem nicht darum herum kommen, mit dem Code zu experimentieren. Wenn ich fremden Code nicht verstehe, extrahiere ich mir einen kleinen Abschnitt, recherchiere und überlege wie dieser Abschnitt funktioniert, ändere ihn ab und überprüfe, ob er sich dann wie von mir vorhergesagt verhält, wenn ja habe ich ihn verstanden.
Grüße
Friemler
auch Dateien mit der Dateierweiterung
CMD
sind Batchfiles. CMD
wurde irgendwann in den 90ern mit Windows NT eingeführt um deutlich zu machen, dass es sich um "moderne" Batchfiles mit einem erweiterten Befehlssatz handelt. Heutzutage sollte man Batchfiles immer die Dateierweiterung CMD
geben.Ja, die Variablen
%~1
usw. kannst Du in der Batchdatei benutzen. Variablen dieses Typs (ein Prozentzeichen am Anfang, danach eine Zahl zwischen 0 und 9, die Tilde ~
ist eine Ergänzung und entfernt umschließende Anführungszeichen vom Wert der Variablen) enthalten die Parameter, die einem Batchfile beim Aufruf übergeben wurden.Was habe ich geändert?
- Im Kopf des HTA-Files (unter
HTA:APPLICATION
) habe ich einen EintragID=objHTA
ergänzt. Durch diesen kann ich im VBScript-Teil mitobjHTA.commandline
auf die Befehlszeile zugreifen, mit der das HTA-File gestartet wurde. Diese wird in Zeile 17 mit Hilfe des UnterprogrammsUnQuoteString
in ihre Einzelteile zerlegt (als Trennzeichen zwischen den Elementen wird die Zeichenkombination " " (Anführungszeichen+Leerzeichen+Anführungszeichen) verwendet ), welche in dem ArrayarrArgs
gespeichert werden. Das erste Element dieses Arrays enthält den vollständigen Pfad des HTA-Files, evtl. übergebene Parameter folgen in weiteren Array-Elementen. Den Pfad benötige ich, um in Zeile 23 den vollständigen Pfad zum Batchfile zu erzeugen. Das Batchfile nur über seinen Namen (ohne Pfadangabe) mit Admin-Rechten zu starten funktioniert genau wie bei Deiner bisherigen Lösung nicht.
Ergänzung: Die Zerlegung der Befehlszeile (und damit auch die Ermittlung des vollständigen Pfades des HTA-Files) funktioniert bei der Übergabe von Parametern an das HTA-File nur dann, wenn die Parameter alle in Anführungszeichen eingeschlossen werden. Aber das ist für dich z.Z. ja nicht relevant.
- Anhand des Status der Admin-Checkbox in der GUI wird das Batchfile in Zeile 27 mit Admin-Rechten gestartet (wenn der Benutzer den aufpoppenden UAC-Dialog mit
Ja
bestätigt) und in Zeile 29 wird es mit den Rechten des aktuellen Benutzers gestartet. Entscheidend dafür ist der vorletzte Parameter desShellExecute
-Befehls. Dieser Parameter ist ein sogenanntes Verb, das die auszuführende Aktion festlegt.OPEN
führt bei Programmen zum Start, bei einem Verzeichnispfad zum Öffnen eines Explorer-Fensters in dem Verzeichnis und bei z.B. PDF-Dokumenten zum Start des mit der DateierweiterungPDF
verknüpften Programms (z.B. Adobe Reader), wobei das PDF-Dokument direkt geladen wird.RUNAS
führt zur Anzeige des UAC-Dialogs, der den Benutzer fragt, ob das Programm mit Admin-Rechten laufen darf. Es gibt auch noch andere Verben, z.B. führtPRINT
auf ein PDF-Dokument angewandt zum Ausdruck des Dokuments. DieShellExecute
-Funktion ist hier dokumentiert. Das VerbRUNAS
findet sich dort jedoch nicht, es ist undokumentiert.
Ergänzung: Zeile 29 könnte man (besser lesbar) auch so schreiben:In Zeile 27 (start des Batchfiles mit Admin-Rechten) funktioniert das jedoch nicht, aus Gründen der Vereinheitlichung habe ich die kompliziertere Syntax für beide Fälle benutzt.objShell.ShellExecute strCommand, strParams, "", "open", 1
- Statt die Parameter in Dateien zu schreiben übergebe ich sie dem Batchfile beim Start als Parameter, zur Sicherheit jedoch in Anführungszeichen eingeschlossen, damit sie auch Leerzeichen enthalten können und trotzdem "am Stück" im Batchfile ankommen. Wenn in VBScript ein Anführungszeichen Bestandteil eines Strings sein soll, muss man es im Quellcode doppelt schreiben, z.B. steht der Ausdruck für den in Anführungszeichen eingeschlossenen Wert der Variablen
"""" & strXYZ & """"
strXYZ
, z.B."Hallo Welt"
.
So, ich hoffe mal, dass Dir diese Erklärungen etwas weiterhelfen. Um den Quellcode wirklich zu verstehen wirst Du trotzdem nicht darum herum kommen, mit dem Code zu experimentieren. Wenn ich fremden Code nicht verstehe, extrahiere ich mir einen kleinen Abschnitt, recherchiere und überlege wie dieser Abschnitt funktioniert, ändere ihn ab und überprüfe, ob er sich dann wie von mir vorhergesagt verhält, wenn ja habe ich ihn verstanden.
Grüße
Friemler
Hallo Noah,
tja, ich würde mal sagen: Das ist jetzt Dein Part.
Wenn Du den Code zur Erstellung von Benutzerkonten schon als Batchscript hast, brauchst Du dieses Script ja nur noch anzupassen, dass es sich die Daten zu Benutzername, Passwort und ob es ein Admin-Konto werden soll aus den Parametern holt, die es beim Aufruf übergeben bekommt (die Variablen
Dann änderst Du das HTA-File ab, sodass das o.g. Batchscript aufgerufen wird und zwar immer mit Admin-Rechten (damit das Anlegen der User funktioniert). Was Du dazu tun musst geht aus meinem letzten Posting hervor.
Das ist jetzt nur noch Fleißarbeit und Du solltest das selbst hinbekommen, ein wenig Lerneffekt sollte bei der ganzen Aktion schon dabei sein.
Grüße
Friemler
tja, ich würde mal sagen: Das ist jetzt Dein Part.
Wenn Du den Code zur Erstellung von Benutzerkonten schon als Batchscript hast, brauchst Du dieses Script ja nur noch anzupassen, dass es sich die Daten zu Benutzername, Passwort und ob es ein Admin-Konto werden soll aus den Parametern holt, die es beim Aufruf übergeben bekommt (die Variablen
%~1
usw., siehe meine Erklärung unter dem Script-Code).Dann änderst Du das HTA-File ab, sodass das o.g. Batchscript aufgerufen wird und zwar immer mit Admin-Rechten (damit das Anlegen der User funktioniert). Was Du dazu tun musst geht aus meinem letzten Posting hervor.
Das ist jetzt nur noch Fleißarbeit und Du solltest das selbst hinbekommen, ein wenig Lerneffekt sollte bei der ganzen Aktion schon dabei sein.
Grüße
Friemler