thevo1d
Goto Top

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

Content-Key: 314579

Url: https://administrator.de/contentid/314579

Ausgedruckt am: 19.03.2024 um 10:03 Uhr

Mitglied: holli.zimmi
holli.zimmi 07.09.2016 um 09:43:26 Uhr
Goto Top
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
Mitglied: Friemler
Lösung Friemler 07.09.2016 aktualisiert um 10:31:24 Uhr
Goto Top
Hallo TheVo1d,

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
Mitglied: TheVo1d
TheVo1d 08.09.2016 um 11:05:09 Uhr
Goto Top
Ja sowas in der Art dachte ich mit schon.
das Problem dieser Ordner mit der Batchdatei und den TXT Dateien und meinem HTA file sollen auf einem USB Sitck abgellegt werden. So dass man den Stick an verschiedenen Computer anstecken kann, und dann einfach das Programm ausführen, dass es dann direkt einen Account erstellt. Den die (Es ist noch nicht fertig darum noch mehrere Dateien). Daher "muss " ich es ohne Pfad angeben. Oder gibt es eine andere Möglichkeit eingaben aus HTA in ein Batchfile zu bekommen?

Gruss
TheVo1d
Mitglied: holli.zimmi
holli.zimmi 08.09.2016 um 11:58:55 Uhr
Goto Top
Hi,

lass doch einfach im Script einen Ordner anlegen: -> dorthin kopierst Du alle notwendigen Dateien!
Dann müsste es eigentlich funktionieren!

Gruß

Holli
Mitglied: Friemler
Lösung Friemler 08.09.2016 aktualisiert um 14:42:30 Uhr
Goto Top
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!!
Mitglied: TheVo1d
TheVo1d 14.09.2016 um 11:58:24 Uhr
Goto Top
Hallo Friemler
Arbeite erst heute wieder. Sorry also für die Späte Antwort.

Im Moment ist das ganze Programm noch in Entwiklung, darum startet man die Batch und die HTA Datei gerade noch separat. Aber das ziel ist das ich in der HTA Datei ein Subscript mache indem ich die Batchdatei dann starte.
Ich habe es zuerst versucht mit der Batchdatei die HTA-Datei zu starten. aber das Ergebnis war dass die Batch die TXT-Dokumente dann nicht fand also drehte ich alles wieder um.
Aber es wird alles in einem Ordner genannt "AACV2.4" auf einem USB-Stick.

Gruss

TheVo1d
Mitglied: holli.zimmi
holli.zimmi 14.09.2016 um 12:26:52 Uhr
Goto Top
Hi,

Aber es wird alles in einem Ordner genannt "AACV2.4" auf einem USB-Stick.

das ist ja das Problem, der USB-Stick bekommt an jedem PC einen anderen Laufwerksbuchstaben.
Am besten erstelle eine GPO für diese PC und lass immer den gleichen LW dir zuweisen.
( Aber vorher prüfen)

Gruß

Holli
Mitglied: Friemler
Lösung Friemler 14.09.2016 aktualisiert um 16:58:07 Uhr
Goto Top
Hallo Noah,

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 oder Falsch)

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
Mitglied: TheVo1d
TheVo1d 15.09.2016 um 08:40:56 Uhr
Goto Top
Hallo Friemler

Danke Vielmal für deine Hilfe.
Ich habe halt einfach das ich erst gerade mit meiner Ausbildung zum Informatiker begonnen hab, und daher noch nicht viel Erfahrung noch wissen habe.
Wäre es da vielleicht möglich das du mir deine Änderungen ein bisschen besser erklärst.
Da wo ich den Namen "mybatch.cmd" auswechseln sollte, ist das wichtig das die Endung CMD ist oder nicht? Denn meine Datei ist ja ein Batch file. Wenn das darauf ankommt und ich es mit der Endung .cmd Speichern muss was hat das für ein Ursprung?

Und wo kann ich jetzt die Variablen mit %~1, %~2 & %~3 abrufen? In der Batch Datei?

Danke im Voraus! Und Entschuldigung dass ich so Dumm frage...

Freundliche Grüsse

TheVo1d
Mitglied: Friemler
Lösung Friemler 15.09.2016 aktualisiert um 10:56:33 Uhr
Goto Top
Hallo Noah,

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 Eintrag ID=objHTA ergänzt. Durch diesen kann ich im VBScript-Teil mit objHTA.commandline auf die Befehlszeile zugreifen, mit der das HTA-File gestartet wurde. Diese wird in Zeile 17 mit Hilfe des Unterprogramms UnQuoteString in ihre Einzelteile zerlegt (als Trennzeichen zwischen den Elementen wird die Zeichenkombination " " (Anführungszeichen+Leerzeichen+Anführungszeichen) verwendet ), welche in dem Array arrArgs 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 des ShellExecute-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 Dateierweiterung PDF 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ührt PRINT auf ein PDF-Dokument angewandt zum Ausdruck des Dokuments. Die ShellExecute-Funktion ist hier dokumentiert. Das Verb RUNAS findet sich dort jedoch nicht, es ist undokumentiert.

    Ergänzung: Zeile 29 könnte man (besser lesbar) auch so schreiben:
    objShell.ShellExecute strCommand, strParams, "", "open", 1
    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.

  • 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
    """" & strXYZ & """"
    für den in Anführungszeichen eingeschlossenen Wert der Variablen 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
Mitglied: TheVo1d
TheVo1d 15.09.2016 um 13:35:10 Uhr
Goto Top
Hallo Friemler

Danke vielmal für deine Top Hilfe. Es funktioniert Tip Top.
Und dank deinen Erklärungen versteh ich mehr oder weniger auch alles was du gemacht hast.
Danke Vielmal.
Jetzt am Ende bleibt nur ein Problem.
Die Administrator Checkbox im GUI soll nicht dafür da sein zu entscheiden ob es als Administrator ausgeführt werden soll. Sondern ob den zu ertellenden Account in die Administratoren Gruppe aufgenommen werden soll. Ich hoffe da kommt jetzt nicht all zu viel dazu.

Grüsse

TheVo1d
Mitglied: TheVo1d
TheVo1d 15.09.2016 um 13:41:20 Uhr
Goto Top
PS:
Ich habe noch was vergessen.
Es soll so ablaufen dass bei Positiver Checkbox
der neu erstellte User in die Administratoren Gruppe aufgenommen werden soll. und danach den aktiven, auf einem Computer bereits existierenden Administrator account deaktivieren soll. Nicht löschen, sondern einfach deaktivieren.
Bevor ich mich ans GUI gemacht habe hatte ich eine reine Batch Version, und da habe ich das mit den Zeilen:

net Localgroup "variable für den username" /add

net user Administrator /activ:no

gemacht. Das Soll aber nur ausgeführt werden wenn die checkbox Positiv also eine 1 ausgibt.
Mitglied: Friemler
Lösung Friemler 15.09.2016 aktualisiert um 16:24:47 Uhr
Goto Top
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 %~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
Mitglied: TheVo1d
TheVo1d 19.09.2016, aktualisiert am 18.10.2016 um 13:11:20 Uhr
Goto Top
Hallo Friemler & Holli

Danke Vielmals für eure ganze Hilfe und deine Geduld mit mir. :D
Ich bin halt echt noch ein kompletter Anfänger und kenne mich so gut wie gar nicht aus.
Deshalb stellte ich vielleicht auch dümmere Fragen als andere. Aber ich bin euch sehr dankbar für eure
Hilfe.
Es hat mich schon mal ein riesen Stück weiter gebracht.

Danke vielmal!

Freundliche Grüsse

TheVo1d