Von Batch in %Programdata% unter Windows 7 schreiben lassen

Palladin007

assimiliert
Moinsens

Ich möchte ein etwas umfangreicheres Programm schreiben, wofür ich dann aber auch eine Installations-Datei einrichte, die alles dort hin erstellt, wo es sein soll.

Da das aber schon toll unter Programme zu finden sein soll, soll es mit dieser Variable: %Programdata% dort hin Ordner erstellen und Datein schreiben.

Außerdem müssen sie dort geändert werden können.


Das WIndows 7 das aber anscheinend verhindert, brauche ich eine Lösung, wie man das erzwingen kann.



Kennt jemand einen Trick, womit das geht?
 
Überprüfe ob das Script im elevated modus läuft (oder starte es als administrator).
Wenn es nicht im elevated mode läuft, dann starte es erneut als administrator.

THEORETISCH kann man das gleich Batchmäßig umsetzen:
Code:
:: method (applicable to Windows 7, and maybe Vista) 
:: try to write a zero-byte file to a system directory 
:: if successful, we are in Elevated mode and delete the file 
:: if unsuccessful, avoid the "Access is denied" message 

:: arbitrary choice of system directory and filename 
set tst="%windir%\$del_me$" 

:: the first brackets are required to avoid getting the message, 
:: even though 2 is redirected to nul.  no, I don't know why. 
:: next command should be on a single line 
(type nul>%tst%) 2>nul && (del %tst% & set elev=t) || (set elev=) 

if not defined elev (
	runas /user:Administrator "%~f0"
	exit /b
)

:: Hauptscript kommt danach ...

Der code ist völlig ungetestet da meine Win7-Maschine gerade @home ist, ich aber nicht.
 
runas, das ist das Stichwort, welches mir heute Morgen partout nicht einfallen wollte.
Da war doch mal was... ach, hier: pcwRunAs | PC-WELT Praxis

Ob das kleine Tool für Win7 überhaupt noch notwendig ist, kann ich aber nicht sagen.
 
Ob das noch nötig ist, weis ich auch nicht, ich persönlich kann es aber trotzdem nicht brauchen, da ich eh der einzige Nutzer bin und Admin-Rechte habe (logisch^^)

Wenn ich mich angemeldet habe, muss ich also nur noch bestätigen. Eingeben muss man nur, wenn man auf einem Konto ist, was keine Admin-Rechte hat. So kann man dann halt installieren, ohne das Konto zu wechseln.
 
Das müsste dann der Kern von deinem Code sein, oder?
Code:
set tst="%windir%\$del_me$" 
(type nul>%tst%) 2>nul && (del %tst% & set elev=t) || (set elev=) 
if not defined elev (
	runas /user:Administrator "%~f0"
	exit /b
)
Aber warum hast du nicht einfach
runas /user:Administrator "%~f0"
geschrieben?

Irgendwie kapier ich den Rest nicht :D
Das runas geht ja noch, aber alles drüber wird schwierig.

Code:
set tst="%windir%\$del_me$"

Wofür steht $del_me$? Ist das auch so etwas, wie eine Variable?

Code:
(type nul>%tst%) 2>nul && (del %tst% & set elev=t) || (set elev=)

Die Zeile kapier ich gar nicht. type, schreibt das nix in die Variable tst?
Da zwei &-Zeichen, sind die auch zum Trennen der Befehle, oder warum sind es zwei?
del löscht den Inhalt der Variable, aber warum wurde er dann vorher erstellt?
und gleich danach wird %elev% definiert, nur um es danach wieder zu löschen.

Ich kapier es nicht...

Code:
if not defined elev (
	runas /user:Administrator "%~f0"
	exit /b
)

Wenn elev nicht definiert wird, wird das ganze als Administrator ausgeführt, aber da elev doch eh gelöscht wurde, ist es doch klar, dass sie nicht definiert wurde. Also kann man doch die If-Abfrage gleich weg lassen, oder?

Und warum wird das Programm beendet?
Soll das eine extra Batch sein? Das würde /b erklären...



Edit: Sorry, dass ich doppelt gepostet hab, aber als ich schon senden gedrückt hatte, konnte ich es nicht mehr ändern.
 
Jeez, hast du dir schon mal die Windows-Hilfe durchgelesen, da stehen die meisten Fragen von dir drin...

Das müsste dann der Kern von deinem Code sein, oder?
Code:
set tst="%windir%\$del_me$" 
(type nul>%tst%) 2>nul && (del %tst% & set elev=t) || (set elev=) 
if not defined elev (
	runas /user:Administrator "%~f0"
	exit /b
)
Ja.

Aber warum hast du nicht einfach
runas /user:Administrator "%~f0"
geschrieben?
Weil ich keinen Neustart des Scripts machen muss wenn ich ohnehin schon als Admin unterwegs bin.

Code:
set tst="%windir%\$del_me$"

Wofür steht $del_me$? Ist das auch so etwas, wie eine Variable?
Nein, das ist der Dateiname

Code:
(type nul>%tst%) 2>nul && (del %tst% & set elev=t) || (set elev=)

Die Zeile kapier ich gar nicht. type, schreibt das nix in die Variable tst?
Da zwei &-Zeichen, sind die auch zum Trennen der Befehle, oder warum sind es zwei?
del löscht den Inhalt der Variable, aber warum wurde er dann vorher erstellt?
und gleich danach wird %elev% definiert, nur um es danach wieder zu löschen.
- Die Variable tst beinhaltet den Dateipfad (ca.: C:\Windows\$del_me$ )
- Es wird nicht nichts in die Datei geschrieben, es wird nur eine Datei angelegt.
- 2>nul leitet die Ausgabe um ins nirvana (optik).
- Das && ist gleichzusetzen mit "wenn der vorherige Befehl erfolgreich abgeschlossen wurde, dann"
- del löscht nicht den inhalt der variable, sondern die Datei. Um eine Variable zu löschen macht man "set var=" (ohne "")
- elev wird nicht erstellt und dann gleich geleert sondern das ist im prinzip eine If-Else-Anweisung im OTB-Style.
Aufgeschlüsselt wäre dass so ungefähr:
Code:
(type nul>%tst%) 2>nul
If not Errorlevel (
   del %tst%
   set elev=t
) Else (
   set elev=
)


Ich kapier es nicht...

Code:
if not defined elev (
	runas /user:Administrator "%~f0"
	exit /b
)

Wenn elev nicht definiert wird, wird das ganze als Administrator ausgeführt, aber da elev doch eh gelöscht wurde, ist es doch klar, dass sie nicht definiert wurde. Also kann man doch die If-Abfrage gleich weg lassen, oder?
Nein, da die variable nur bei bestimmten umständen gelöscht wird.

Und warum wird das Programm beendet?
Soll das eine extra Batch sein? Das würde /b erklären...
Nur um sauber zu coden. Der Parameter /b bedeutet dass die Batch beendet wird, nicht die cmd.exe
Das ist wichtig falls die Batch aus einer anderen Batch aufgerufen wird...
 
Hoffe, das das auch so funktioniert, wie du sagst und nix dazwischen funkt.
Hoffe auch, wie gesagt, es ist nicht getestet...

PS.: Ich nehm mal an, du arbeitest noch immer an deiner Automatisierten Installation, richtig?!? Ich hoffe, du brennst nicht jedes mal ne DVD, sondern testest das Iso gleich in ner VM... jm2c

EDIT:
PPS.: Du könntest auch das
Code:
(type nul>%tst%) 2>nul
mit einem (einfacheren)
Code:
echo. > %tst%
ersetzen. Ist dann vllt. etwas klarer zu sehen...
 
Ne, ich schreib an einem anderen Programm^^

Aber ich glaub, ich lasse den Teil raus und lass es irgendwo im Temp-Ordner, oder so speichern. Da blockiert nix.

Und es soll ja auch auf XP laufen können.
 
Weil ich nur Batch kenne^^

Wenn ich für inf nicht zu viel lernen muss, dann nehm ich auch das, aber bis jetzt kenne ich nur Batch und ganz wenig Java
 
Interessante Sache, aber ich glaube, ich muss trotzdem mehr machen^^

Ich will nämlich nicht nur ein einfaches geradeaus-Programm schreiben, sondern Installationspfad und Menü sollen auch vorhanden sein.

Oder ist das mit drin?
 
Nee, auf grafische Menüs musst du da verzichten. Inf-Dateien werden einfach nur per rechtem Mausklick und "Installieren" gestartet und installieren dann das Gewünschte sofort. Eine Auswahlmöglichkeit gibt es da nicht. Es sei denn, du strickst dir ein Textmenü in einer Batch-Datei, aus der du dann die verschiedenen inf-Dateien startest.

Für ein richtiges Setup kannst du aber eins der vielen kostenlosen Setup-Tools und Installer verwenden:
Setup-Routinen - Dr. Windows
 
Guuuuuuuuten Morgen

Ich schreibe gerade an einem relativ einfachen Geradeaus-Programm für eine Freundin.
Allerdings benötigt das Administratoren-Rechte, die es dann halt abfragen wollte.

Ich hab dazu diese Zeile eingebaut:

runas /noprofile /user:Administrator %username%

Das Problem an der Sache ist nur, dass die Passwort-Eingabe auf keinen Tastendruck reagiert.

Wenn ich dann aber 'Enter' drücke, geht es ganz normal weiter, nur sagt er mir, dass lehre Passwörter nicht akzeptiert werden.


Wie kann ich das Problem lösen?

Dass die Eingabe wieder normal funktioniert, oder wie kann ich ein Passwort schon in der Zeile, fest legen lassen?
Also, dass das Passwort nicht mehr abgefragt wird, da es ja schon in der Zeile bekannt ist.

Auf diese Art und Weise könnte man das Passwort in eine Variable speichern lassen und dann mit der Variable in der Zeile direkt fest legen lassen.


Weiß jemand, wo da das Problem liegt, oder kennt jemand eine funktionierende Alternative zu runas?


PS: Ich möchte bei Batch bleiben und nicht irgendwas dazu nehmen.
 
Oben