tompazi
Goto Top

Verknüpfungen erstellen

Wie erstelle ich mit einer Batch Datei Verknüpfungen?
eine Verknüpfung ht ja diese Endung *.lnk aber wie sage ich der Batch Datei wohin die Verknüpfung führen soll?

Danke Thomas

Content-Key: 72240

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

Ausgedruckt am: 29.03.2024 um 05:03 Uhr

Mitglied: schregi82
schregi82 29.10.2007 um 20:55:23 Uhr
Goto Top
hi thomas,

das "problem" hatte ich neulich auch, scau mal unter
http://www.wer-weiss-was.de/theme9/article3146278.html

wenn du noch fragen hast ..
Mitglied: bastla
bastla 29.10.2007 um 21:27:34 Uhr
Goto Top
... und wenn's tatsächlich vorrangig über Batch laufen soll, musst Du gar nicht so in die Ferne schweifen face-wink: (batch)(vbs) ShortCut Ziel und Befehl

Grüße
bastla
Mitglied: bastla
bastla 29.10.2007 um 22:08:15 Uhr
Goto Top
Hallo Tompazi!

Da sich die im verlinkten Thread dargestellte Variante noch etwas straffen ließ, hier eine aktualisierte (und etwas kommentierte Fassung):
@echo off & setlocal

::Speicherort der Verknüpfung (unterhalb von Startmenue\Programme)
set "zielpfad=%userprofile%\Startm~1\Programme\XXXXX"  
::Falls das Symbol auf den Desktop soll:
::set "zielpfad=%userprofile%\Desktop" 

::Name der Verknüpfung (ohne ".lnk") 
set "progtitel=XXXXXXX"  
::Speicherort der Programmdatei (wird auch für "Ausführen in:" verwendet) 
set "progdir=C:\Programme"  
set "progexe=XXXXXXXXX.exe"  
::Kommentar
set "beschreibung=Erklärung eigentlich unnötig ..."  

::Bei Bedarf Speicherordner der Verknüpfung erstellen (siehe oben "zielpfad"): 
if not exist "%zielpfad%" md "%zielpfad%"  

::temporäres VBScript erzeugen ...
echo Set objShell=WScript.CreateObject("Wscript.Shell")>%temp%\MakeShortCut.vbs  
echo Set objShortcut=objShell.CreateShortcut("%zielpfad%\%progtitel%.lnk")>>%temp%\MakeShortCut.vbs  
echo objShortcut.TargetPath="%progdir%\%progexe%">>%temp%\MakeShortCut.vbs  
echo objShortcut.Description="%beschreibung%">>%temp%\MakeShortCut.vbs  
echo objShortcut.WorkingDirectory="%progdir%">>%temp%\MakeShortCut.vbs  
echo objShortcut.Save>>%temp%\MakeShortCut.vbs

::... ausführen ...
cscript //nologo %temp%\MakeShortCut.vbs

::... und wieder löschen.
del %temp%\MakeShortCut.vbs

Grüße
bastla

[Edit] Noch kleine Korrekturen vorgenommen (überzähliges " entfernt, fehlende :: hinzugefügt) [/Edit]
Mitglied: 42687
42687 20.03.2008 um 19:20:55 Uhr
Goto Top
was muss ich bei Progdir und progexe eintragen wenn das einen Verknüpfung zu einem Ordner sein soll?
danke
Mitglied: bastla
bastla 20.03.2008 um 20:09:13 Uhr
Goto Top
Hallo Peter161!

Für "progdir" ist der Pfad zum Ordner anzugeben und bei "progexe" gar nix (also das Anführungszeichen sofort nach dem = platzieren).

Grüße
bastla
Mitglied: 65445
65445 21.05.2008 um 13:19:49 Uhr
Goto Top
Hallo zusammen,

ich hab mir nun nach obiger Erklärung eine Verknüpfung auf dem Desktop erstellt.
Dabei hätte ich aber gerne, dass ich ein Symbol automatisch zuweisen kann, also nicht per Rechtsklick auf die Verknüpfung -> Eigenschaften, usw.
Kann man das realisieren und wenn ja, wie?

Gruß Steffen
Mitglied: bastla
bastla 21.05.2008 um 13:44:20 Uhr
Goto Top
Hallo gizmovetter und willkommen im Forum!

Füge vor der Zeile
echo objShortcut.Save>>%temp%\MakeShortCut.vbs
noch ein:
echo objShortcut.IconLocation = "Pfad zu Deiner .exe-, .dll- oder .ico-Datei,0">>%temp%\MakeShortCut.vbs  
Für den Pfad kannst/solltest Du natürlich auch eine Batch-Variable (etwa %iconpfad%) verwenden. Falls sich in der angegebenen Datei mehrere Icons befinden, kannst Du anstelle von 0 die Nummer des gewünschten Symbols (Zählung beginnt bei 0) angeben.

Grüße
bastla
Mitglied: 65445
65445 24.06.2008 um 14:42:05 Uhr
Goto Top
Hi bastla,

vielen Dank für die sehr schnelle Antwort.
Bin erst jetzt dazu gekommen, das ganze auszuprobieren. Ergebnis: Funktioniert prima! face-smile

Gruß Steffen
Mitglied: evinben
evinben 12.03.2012 um 11:01:15 Uhr
Goto Top
Hallo miteinander!

1. wie kann im Batch das Expandieren der Umgebungsvariable (zu einem Pfad) verhindert werden? Zum besseren Verständnis:
Es soll in dem Skript bei der Ausgabe nicht der expandierte Pfad, sondern die Umgebungsvariable so wie sie ist 1:1 geschrieben werden - also "%UserProfile% anstatt "C:\Benutzer\Administrator".

(Wenn in dem Skript am Schluss eine Umgebungsvariable - z. B. objShortcut.TargetPath="%UserProfile%\wscript.exe" - steht, funktioniert es in diesem Zusammenhang problemlos).

2. Gibt es eine Möglichkeit beim Erstellen einer Verknüpfung zusätzlich die Option "Als Administrator ausführen" zu setzen?

Vielen Dank für Tipps/Anregungen
gruß evinben
Mitglied: bastla
bastla 12.03.2012 um 11:14:07 Uhr
Goto Top
Hallo evinben!
wie kann im Batch das Expandieren der Umgebungsvariable (zu einem Pfad) verhindert werden?
echo %%UserProfile%%
Grüße
bastla
Mitglied: evinben
evinben 12.03.2012 um 11:21:54 Uhr
Goto Top
;), ;)

Du kannst echt gut den Montag zu einem Schontag machen! Fleißig & erfahren!

Dankeee!

gruß
evinben
Mitglied: evinben
evinben 12.03.2012 um 11:49:43 Uhr
Goto Top
Hallo bastla!

allerdings beim Aufruf einer Batch mit CALL wird die Variable weiterhin expandiert face-sad - also so:

call "Probe mit Übergabe einer Umgebungsvariable 1zu1.bat" "%%Userprofile%%" "ArgZwei" "ArgDrei"  

kommt folgendes raus:
echo "C:\Benutzer\Administrator" "ArgZwei" "ArgDrei"  

Gibt es dafür eine Abhilfe?

Danke schön!

gruß
evinben
Mitglied: bastla
bastla 12.03.2012 um 12:01:26 Uhr
Goto Top
Hallo evinben!

Wie wäre es mit
call "Probe mit Übegabe einer Umgebungsvariable 1zu1".bat" "%%%%Userprofile%%%%" "ArgZwei" "ArgDrei"
- kosten ja fast nix, die Prozentzeichen ...

Grüße
bastla

P.S.: Wo kaufst Du denn die Namen Deiner Batches - und haben die nix mit ohne Leer- und Sonderzeichen? face-wink
Mitglied: evinben
evinben 12.03.2012 um 12:43:04 Uhr
Goto Top
ops... tatsächlich, ein Anführungszeichen hat sich hineingeschliechen > korrektur erfolgt - danke!


mit 3x % habe ich schon mal probiert, aber auf 4x % bin ich nicht auf die Idee gekommen face-smile.

ich werde es gleich ausprobieren...

Danke
evinben
Mitglied: evinben
evinben 12.03.2012 um 12:47:55 Uhr
Goto Top
ne, es funktioniert noch nicht. So habe ich es eingetragen:

set "TargetFile=%%%%windir%%%%\System32\wscript.exe"  
call "Probe mit Übergabe einer Umgebungsvariable 1zu1.bat" "%TargetFile%"  

ist es richtig?

danke...
evinben
Mitglied: bastla
bastla 12.03.2012 um 13:20:57 Uhr
Goto Top
Hallo evinben!
ist es richtig?
Das fragst Du mich? Eigentlich solltest Du derjenige sein, der testet (und ev Fehlermeldungen sieht) - obwohl ich eigentlich keinen Grund sehe, warum das nicht funktionieren sollte ...

Falls Dir übrigens 4 Prozentzeichen nicht genügen, nimm doch 8 davon ...

Grüße
bastla
Mitglied: evinben
evinben 12.03.2012 um 13:57:37 Uhr
Goto Top
...leider nicht. Mit sehr vielen Varianten habe ich experimentiert.

Dann muss ich eventuell alles auf VBS umstellen und hoffen, dass es dann gehen würde.

gruß
evinben
Mitglied: bastla
bastla 12.03.2012 um 14:58:11 Uhr
Goto Top
Hallo evinben!

Um mich zu korrigieren: Inzwischen hätte ich doch noch einen Grund gesehen (oder genauer: am Anfang Deiner ersten Zeile nicht gesehen face-wink), warum das nicht funktioniert ...

Grüße
bastla
Mitglied: evinben
evinben 12.03.2012 um 15:33:01 Uhr
Goto Top
Hallo bastla,

danke für den Korrekturhinweis nochmal: den fehlenden Befehl "SET" habe ich hier soeben nachgereicht, er war allerdings in der Batch-Datei, während ich alle möglichen Variante ausprobiert habe.
Ich habe auch ohne Anführungszeichen bei SET ausprobiert - so:

set TargetFile=%%%%windir%%%%\System32\wscript.exe
call "Probe mit Übergabe einer Umgebungsvariable 1zu1.bat" "%TargetFile%"  

leider kein positives Ergebnis.
Wüsstest du eventuell eine Antwort auf meine zweite Frage?
(2. Gibt es eine Möglichkeit beim Erstellen einer Verknüpfung zusätzlich die Option "Als Administrator ausführen" zu setzen?)

Ich kämpfe noch...

gruß
evinben
Mitglied: bastla
bastla 12.03.2012 um 19:22:18 Uhr
Goto Top
Hallo evinben!

Bei meinem Test hatte ich kein Problem mit der Übergabe:
D:\>type Aufruf.cmd
setlocal
set TargetFile=%%%%windir%%%%\System32\wscript.exe
call "Probe mit Übergabe einer Umgebungsvariable 1zu1.bat" "%TargetFile%"

D:\>type "Probe mit Übergabe einer Umgebungsvariable 1zu1.bat"
echo %1
D:\>aufruf

D:\>setlocal

D:\>set TargetFile=%%windir%%\System32\wscript.exe

D:\>call "Probe mit Übergabe einer Umgebungsvariable 1zu1.bat" "%%windir%%\S
ystem32\wscript.exe"

D:\>echo "%windir%\System32\wscript.exe"
"%windir%\System32\wscript.exe"
Zur Frage 2 habe ich leider (derzeit) keine Idee ...

Grüße
bastla
Mitglied: evinben
evinben 13.03.2012 um 18:12:09 Uhr
Goto Top
Hallo Bastla,

danke für den Hinweis! Folgend sind meine Erkenntnisse:

Du hast Recht, es funktioniert, !nur! solange die Batch-Datei direkt aufgerufen wird. Wenn diese über eine Verknüpfung erfolgt, dann expandiert die Variable auf dem Weg zur Batchdatei leider zu einem vollständigen Pfad.

:Bei Aufruf einer Batch-Datei über Verknüpfung wird die Variable expandiert
set TargetFile=%%%%windir%%%%\System32\wscript.exe 
call "Probe mit Übergabe einer Umgebungsvariable 1zu1.bat.lnk" "%TargetFile%"   

Und die Antwort wäre dann: C:\Windows\System32\wscript.exe


Wenn es irgendwie zu schaffen wäre das Expandieren der Umgebungsvariable zu unterdrücken, dann ist das Problem gelöst, da das temporärausgegebene VB-Skript - mit dem Variablenpfad - die Verknüpfung wie gewollt erstellt:
objShortcut.TargetPath="%windir%\System32\wscript.exe"  
Und das Ergebnis in der Eigenschaften der Verknüpfung wäre dann 1:1: %windir%\System32\wscript.exe


Meine Mühen die Dateien über Verknüpfungen zu verwalten sind hoffentlich nicht umsonst.
Ich habe in der Hilfe von cmd /? nachgelesen - die Option setlocal enabledelayedexpansion bezieht sich doch nur auf FOR-Schleifen, die mir einbisschen Hoffnung gemach hat.

Wenn euch etwas einfällt, her damit.

gruß
evinben
Mitglied: bastla
bastla 13.03.2012 um 19:34:41 Uhr
Goto Top
Hallo evinben!

Nun müsste mir erst einmal ein Grund einfallen, aus einem Batch einen anderen Batch über dessen Verknüpfung aufzurufen - aber sollte es wirklich so weit kommen, würde ich im aufgerufenen Batch einfach die vorher gesetzte Variable (hier also %TargetFile%) verwenden (und die dann überzählig gewordenen Prozentzeichen für ganz schlechte Zeiten aufbewahren face-wink) ...

Grüße
bastla
Mitglied: evinben
evinben 13.03.2012 um 22:10:58 Uhr
Goto Top
...

Nun müsste mir erst einmal ein Grund einfallen, aus einem Batch einen anderen Batch über dessen Verknüpfung aufzurufen
Es ist flexibler. Die Verknüpfungen können/dürfen verschoben werden. Die Verzeichnisstruktur wird/darf stets optimiert werden - mit der Zeit entstehen viele Änderungen. Die Anpassung der Zielpfade, die durch Änderungen der Verzeichnisstruktur durch den Benutzer ebenso aktualisiert werden müssen, übernimmt dann Windows im Hintergrund automatisch (Z. B. der Windows-Dienst TrkWks zum Überwachen verteilter Verknüpfungen auf Netzwerkebene aktualisiert die Zielpfade).
Viele andere Anwender arbeiten gerne mit Batch-Schablonen. Werden zu der jeweiligen Schablone Verknüpfungen an verschiedene Verzeichnisse verteilt, kann von da aus immer auf sie zugegriffen werden, obwohl die Verzeichnisstruktur im Laufe der Zeit mehrmals verändert wurde.
Mit den Verknüpfung ist es nicht so ganz rosa – oft gehen die Beziehung doch verloren – dennoch meiner Erfahrung nach sehe ich es als günstiger auf Verknüpfungen zuzugreifen, als direkt auf die jeweilige Datei, da die Verzeichnisstruktur sich sehr intensiv ändert. Nue Umgebungsvariablen zu erstellen, ist eine sichere Lösung. Ich muss noch in der Hinsicht an Erfahrung sammeln.
würde ich im aufgerufenen Batch einfach die vorher gesetzte Variable (hier also %TargetFile%) verwenden
Wenn ich in dem aufgerufenen Batch die Variable setze, dann ist sie keine Schablone mehr. Mehrere separate Dateien müssen erstellt werden. Jede neue Idee, jede Änderung müssen dann auf allen Dateien vorgenommen werden. Die Entwicklung ist träge. Und der Hauptvorteil, den ich in den Verknüpfungen sehe, ist deren weitestgehend automatische Aktualisierung.
Da in der Praxis doch öfter passiert, dass die Beziehungen der Verknüpfungen doch verloren gehen, könnten hier benutzerdefinierte Umgebungsvariablen Abhilfe schaffen. Allerdings ist der Datenträger auf den anderen Rechnern nicht einsatzfähig.
Im Grunde genommen, habe ich bisher global gesehen mit der verfolgten Strategie eher positive Ergebnisse gesammelt - es wird besser, robuster.
Was würdet ihr dazu sagen, wie ist eure Erfahrung in der Hinsicht? Gerne bin ich für Tipps und Hinweise offen.

Gruß
evinben
Mitglied: bastla
bastla 13.03.2012 um 22:21:57 Uhr
Goto Top
Hallo evinben!
Wenn ich in dem aufgerufenen Batch die Variable setze, dann ist sie keine Schablone mehr.
Verstehe ich nicht - ich kann doch einfach beide Varianten (bestehende Variable, Parameterübergabe) verwenden:
if not defined TargetPath (
    if #%~1#==## echo Kein TargetPath angegeben & goto :eof
    set "TargetPath=%~1"  
)
Grüße
bastla
Mitglied: evinben
evinben 13.03.2012 um 23:16:24 Uhr
Goto Top
Hallo Bastla!

;), du meist also so, wie es momentan in der Schablone steht:

:Fehlermeldung ausgeben, falls es versucht wird diese Batch-Datei ohne Argumente auszuführen
set ArgumentAbfrage=%1
if not defined ArgumentAbfrage echo Diese Batch-Datei kann nur mit Argumenten ausgeführt werden: z. B: & echo. & echo start "%~dpnx0" "Name der Verknüpfung" "Verzeichnis der Verknüpfung" "Zielpfad" & pause >nul  

Was ändert das alles eigentlich an der Tatsache, dass die Umgebungsvariable, die mit dem ersten Argument (anhand CALL „Verknüpfung zum Batch.lnk“) übergeben wird, expandiert wird?
Ich verstehe nicht so ganz was damit erreicht werden kann, außer einem versehentlichen Aufruf des Batches ohne Argumente zu verhindern?


Gruß
evinben
Mitglied: bastla
bastla 13.03.2012 um 23:22:04 Uhr
Goto Top
Hallo evinben!
Ich verstehe nicht so ganz was damit erreicht werden kann, außer einem versehentlichen Aufruf des Batches ohne Argumente zu verhindern?
Wenn Du den Aufruf von einem Batch aus vornimmst, kannst Du bereits im aufrufenden Batch die Variable setzen - der aufgerufene Batch "erbt" diese dann, sodass eine Parameterübergabe gar nicht nötig ist. Wenn es dennoch die Option dazu geben soll, kannst Du ja durch geeignete Abfragen ("Wenn Parameter, dann diesen verwenden" oder, wie in meinem Beispiel oben, "Wenn Variable bereits gesetzt, dann diese verwenden, ansonsten Parameter") steuern, was gelten soll ...

Grüße
bastla
Mitglied: evinben
evinben 13.03.2012 um 23:48:21 Uhr
Goto Top
Ohh mannn ihr alte Hasen !!!

endlich begriffen! Ich dachte mir die ganze Zeit, dass ein Argument via %~x zwingend erforderlich wäre. Bei mir hat das rote Lämpchen parallel zu deinem Schreiben aufgeleuchtet, dank deinem indirekten Tipp. Nun wollte ich gleich es schreiben, dass ich es verstanden habe, aber hast mich etwas überhohlt gehabt.
So lange hast du mich also quellen lassen … face-wink

Bastla - alles läuft bestens und die Verknüpfung wird mit der Variable 1:1 erstellt.

PS: es wären dann allerdings nur 2x % erforderlich (also set TargetFile=%%windir%%\System32\wscript.exe)

Nun bleibt noch das Ziel der Verknüpfung via VBS-Umweg inkl. den Umlauten auszulesen und das spannende Projekt "Verknüpfungen" ist zumindest soweit abgeschlossen.
Ich habe jedenfalls vieles dabei gelernt.

Gruß
evinben
Mitglied: bastla
bastla 13.03.2012 um 23:52:46 Uhr
Goto Top
Hallo evinben!
PS: es wären dann allerdings nur 2x % erforderlich (also set TargetFile=%%windir%%\System32\wscript.exe)
... und somit könntest Du die dann überzählig gewordenen Prozentzeichen für ganz schlechte Zeiten aufbewahren face-wink ...

Grüße
bastla
Mitglied: evinben
evinben 13.03.2012 um 23:57:29 Uhr
Goto Top
aaa jaaa...
deine Rätsel sind mir etwas zu tief, aber es wird besser face-wink

evinben
Mitglied: evinben
evinben 03.04.2012 um 01:13:13 Uhr
Goto Top
Hallo bastla,

ich brauche deine Hilfe:

In der Verknüpfung soll exakt folgender Pfad eingebaut werden, damit sie fehlerfrei funktioniert:
%windir%\System32\runas.exe /user:Administrator /savecred "%windir%\System32\wscript.exe \"%AppData%\Install\RegJump als Administrator.vbs\""

Wenn ich allerdings in dem Code zur Erstellung einer Verknüpfung unter Parameter (Arguments) in dem Pfad die beiden Rückwärtsschrägstriche einfüge, dann meldet mir das VB-Skript jeweils beim Ausführen einen Fehler. So sieht das Skript momentan aus:
Set objShell=WScript.CreateObject("Wscript.Shell")  
Set objShortcut=objShell.CreateShortcut("%AppData%\Install\RegJump als Administrator.lnk")  
objShortcut.TargetPath="%windir%\System32\runas.exe"  
objShortcut.Arguments=/user:Administrator /savecred "%windir%\System32\wscript.exe \"%AppData%\Install\RegJump als Administrator.vbs\""  
objShortcut.IconLocation="C:\Windows\regedit.exe,0"  
objShortcut.Save
Ich habe viele Varianten/Kombinationen ausprobiert aber leider alles ohne Erfolg. Sollen die Schrägstriche escaped werden und wie genau sollte es in VB geschehen?
Gibt es eventuell eine Möglichkeit eine fertige Verknüpfung auszulesen und die korrekte Schreibweise der Parameterzeile, die in VB-Skript eingegeben werden soll, zu erfahren?
Vielen Dank

Gruß
evinben
Mitglied: bastla
bastla 03.04.2012 um 02:04:15 Uhr
Goto Top
Hallo evinben!

Anführungszeichen werden in VB durch Verdoppelung "escaped", sodass das syntaktisch etwa so aussehen sollte:
Set objShell=WScript.CreateObject("WScript.Shell")  
Set objShortcut=objShell.CreateShortcut(objShell.ExpandEnvironmentStrings("%AppData%")&"\Install\RegJump als Administrator.lnk")  
objShortcut.TargetPath="%windir%\System32\runas.exe"  
objShortcut.Arguments="/user:Administrator /savecred %windir%\System32\wscript.exe ""%AppData%\Install\RegJump als Administrator.vbs"""  
objShortcut.IconLocation="%windir%\regedit.exe,0"  
objShortcut.Save
wobei noch anzumerken wäre, dass der Ordner "%AppData%\Install" bereits existieren (oder eben vom Script erstellt werden) muss ...
Bist Du übrigens sicher, dass Du "/savecred" verwenden willst?

Grüße
bastla

P.S.: Wenn
%windir%\System32\runas.exe
keine Anführungszeichen braucht, sollten sie auch für
%windir%\System32\wscript.exe
nicht erforderlich sein ...
Mitglied: 106009
106009 03.04.2012 um 02:18:02 Uhr
Goto Top
Hallo,

Bist Du übrigens sicher, dass Du "/savecred" verwenden willst?

Vielleicht kennt er das Tool nicht? Die verschlüsselte Verknüpfung, die damit erstellt werden kann, enthält das Passwort, ohne dass das eingegeben werden muss oder ausgelesen werden kann.
http://www.pcwelt.de/downloads/pcwRunAs-1215998.html

Gruß
Mitglied: evinben
evinben 03.04.2012, aktualisiert am 23.09.2017 um 11:31:24 Uhr
Goto Top
Hallo bastla,
und ollidolli

genauso wie du es vorgeschlagen hast bastla, habe ich gestern einige Male probiert. Wie ich es oben geschrieben habe face-smile, muss der Pfad in der Eigenschaften der Verknüpfung unter Ziel letztendlich so 1:1 aussehen:

%windir%\System32\runas.exe /user:Administrator /savecred "%windir%\System32\wscript.exe \"%AppData%\Install\RegJump als Administrator.vbs\""

D. h. ohne die beiden Rückwärts-Schrägstriche (Backslash) wird es nichts – sie stellen hier das Hauptproblem, so dass das Skript nicht richtig ausgeführt werden kann. face-sad

wobei noch anzumerken wäre, dass der Ordner "%AppData%\Install" bereits existieren (oder eben vom Script erstellt werden) muss ...
Ja, dafür wurde gesorgt: der Ordner wird bei Bedarf von dem übergeordneten Batch, der das Skript ausführt, erstellt (im Vergleich zu VB kenne ich mich in Batch noch deutlich besser aus)
Bist Du übrigens sicher, dass Du "/savecred" verwenden willst?
Puuhhh, ich hoffe sehr die Gefahren erhöhen sich somit nicht, da das Benutzer-Passwort vom Anfang an in der Registry ja sowieso verschlüsselt gelagert wird und das Tool RunAs mit dem Schalter /savecred für jeweilige Datei nur einen Stempel erstellt, mit dem er sich merkt, welche Dateien ohne erneuten Passwortabfrage direkt ausgeführt werden dürfen. Das wäre zumindest meine Logik. RunAs speichert in dem Sinne keine Passwörter!? Es wäre ja sicherheitstechnisch etwas schwächer, da mehr Potential zum Knacken anbieten würde.
Eine Verknüpfung mit dem Schalter „/savecred“ wird nur den erlaubten Benutzern erstellt. Ich muss natürlich sehr aufpassen, dass die restlichen Benutzer keine Verknüpfungen versehentlich mit dem Schalter /savecred erhalten bzw. vielleicht gar keine. Am besten erstellt ich dann eine txt-Datei, in welcher die Benutzer mit erhöhten Rechten einzutragen wären, mit einer for /f Schleife die txt-Datei zeilenweise ablesen und nur für die vorhandenen Benutzern den Schalter /savecred automatisch einbauen lassen.
Über eine Äußerung und eventuelle Hinweise eurer Bedenken, hinsichtlich dem Schalter /savecred, würde ich mich sehr freuen.

Ah so @106009, ich bin da mittlerweile ein Windows-Bordmittel-Fanatiker geworden und fahre mit dieser Strategie ziemlich gut und immer noch begeistert zufrieden – vor allem bin ich sehr flexibel. Solche CHIP-Tools in meinen früheren Jahren haben die Registry oft so fahrlässig verstellt, dass ich im Schock bis heute bin (Systemwiederherstellung hat nicht geholfen, da einige Probleme zu spät lokalisiert worden sind). Ich habe ein Trauma davon – ich bin traumatisiert face-wink. Nun habe ich gelernt, dass ein bewusster Umgang beim Werkeln im System und einer Auseinandersetzung in der Funktion einzelner Schritten und Zusammenhängen nicht schadet . Klar investiert man da viel an Zeit, aber ehrlich ich möchte das Wissen !in meiner Tätigkeit! nicht mehr missen.
Danke schön für den Tipp. Vielleicht siehst du in meiner Erfahrung und Meinung Kontra-Punkte, dann natürlich diese gerne äußern – ich bleibe weiterhin offen - wobei klare Argumenten wären hier entscheidend.

Gruß
evinben
Mitglied: 106009
106009 03.04.2012 um 11:09:59 Uhr
Goto Top
Zitat von @evinben:
Solche CHIP-Tools .....
Die mag ich auch nicht. Aber das ist kein Chip-Tool, sondern eines der PC-Welt, von dem auch irgendwann mal die Sourcen veröffentlicht wurden.

Nun habe ich gelernt, dass ein bewusster Umgang beim Werkeln im System und einer Auseinandersetzung in der Funktion einzelner
Schritten und Zusammenhängen schadet nicht.
Sicher nicht, wenn man weiß, wie man damit richtig umgehen muss.

Der Parameter /savecred bei runas merkt sich nach einmaliger Eingabe das Passwort für den Administrator und ermöglich so jede weitere Verwendung von runas ohne erneute Nachfrage/Eingabe für jeden damit verwendeten Parameter! Wenn das in deinem Sinne sein sollte, kannst du das so einsetzen. face-smile

Bei einer mit pcwRunas erstellten Verknüpfung funktioniert das nur und ausschließlich für das als Parameter eingetragene Programm und auch nur mit der Programmversion, die auch beim Erstellen der Verknüpfung aktuell war.

Gruß
Mitglied: bastla
bastla 03.04.2012 um 12:54:11 Uhr
Goto Top
Hallo evinben!

Naja, wenn Du die Backslashes haben willst (ich habe die Verknüpfung nicht getestet, würde aber dennoch annehmen, dass sie überflüssig sind):
objShortcut.Arguments="/user:Administrator /savecred ""%windir%\System32\wscript.exe \""%AppData%\Install\RegJump als Administrator.vbs\"""""
Grüße
bastla
Mitglied: 3xplor3r
3xplor3r 16.04.2012 um 11:59:16 Uhr
Goto Top
Hallo,

ich habe das Script mal übernommen und angepasst, funktioniert auch tadellos, wäre da nicht noch eine Sache.

objShortcut.TargetPath fügt nun den Zielpfad zum Programm der Verknüpfung hinzu. Jetzt möchte ich aber zusätzlich noch Parameter übergeben, die die Programmausführung steuern. Nun werden diese Parameter leider mit in Anführungszeichen gesetzt, wodurch der Programmpfad ungültig wird.

Wie kriege ich es hin, dass die gesamte Anweisung (objShortcut.TargetPath) die Variable %progdir% ohne Anführungszeichen in die Verknüpfung schreibt? Oder wie kriege ich es hin, dass nur für die Variable %progdir% Anführungszeichen gesetzt werden, für alles Weitere, für die Parameter habe ich eigene Variablen definiert, keine Anführungszeichen.
Mitglied: bastla
bastla 16.04.2012 um 12:42:06 Uhr
Goto Top
Hallo 3xplor3r!

Parameter gehören ja auch nicht in den "TargetPath", sondern sind als "Arguments" zu übergeben ...

Grüße
bastla
Mitglied: evinben
evinben 19.04.2012 um 13:40:39 Uhr
Goto Top
Hallo!
hier bin ich wieder bei euch face-smile.

Hallo ollidolli,

danke dir!
Die mag ich auch nicht. Aber das ist kein Chip-Tool, sondern eines der PC-Welt…
Ops… dann muss ich mich wohl wegen meines Vorurteils entschuldigen und werde nach deiner Empfehlung bei Gelegenheit eventuell das Tool ausprobieren.

Sicher nicht, wenn man weiß, wie man damit richtig umgehen muss.
Entschuldigung, den Sinn deines Satzes verstehe ich nicht. Wie meinst du es genau?

… und ermöglich so jede weitere Verwendung von runas ohne erneute Nachfrage/Eingabe für jeden damit verwendeten Parameter!
Vielen Dank für den Hinweis. Ich habe runas-Verknüpfung auf demselben Rechner aber mit einem anderen Benutzerkonto ausprobiert. Das Passwort wird doch für jeden Benutzer abgefragt. Also das Abspeichern des Passworts erfolgt nicht global für das ganze System – nicht „für jeden“.
Die Passwörter können bei Bedarf im „Tresor“ gelöscht werden, falls jemand es rückgängig machen möchte. Allerdings gebe ich dir völlig Recht, dass ein Admin unter einem anderen Benutzerkonto eine Datei über die bestehenden Verknüpfung mit runas /savecred ebenso mal irgendwann ausführen möchte und in der Vergessenheit mal schnell sein Passwort, das dann leider permanent gespeichert wird, angibt. Der Misst ist dadurch schnell geschehen…

Hallo bastla,

ich werde es gleich versuchen und dann berichten.
Mitglied: 106009
106009 19.04.2012 um 17:31:33 Uhr
Goto Top
Hallo,

Zitat von @evinben:
Entschuldigung, den Sinn deines Satzes verstehe ich nicht. Wie meinst du es genau?

Das steht in den 2 Sätzen dahinter. face-wink

Gruß
Mitglied: evinben
evinben 21.04.2012 um 19:10:22 Uhr
Goto Top
Hallo bastla!

Naja, wenn Du die Backslashes haben willst (ich habe die Verknüpfung nicht getestet, würde aber dennoch annehmen, dass sie überflüssig sind):


Vielen Dank! Die Verknüpfung wird erstellt und sie funktioniert mit der von dir zuletzt mitgeteilten Syntax endlich! Mit deiner vorherigen Syntax (ohne die Rückwährts-Schrägstriche) geht es definitiv nicht.


Ein großes Problem habe ich noch. Wenn ich einen HKCU-Registry-Zweig mit runas.exe lade, dann lande ich zwar in dem HKCU-Zweig aber zwangsweise des Benutzers Administrator, obwohl ich den Schalter /env (behält die aktuelle Umgebung, anstatt diejenige des angegebenen Benutzers) verwende. Sehr enttäuschend.
Es geht ja darum nicht etwas zwingend mit dem Benutzer Administrator zu starten, sondern hauptsächlich mit erhöhten „administrativen“ Rechten zu starten, und zwar so als ob die Kontensteuerungsabfrage bestätigt wäre (also genau so wie mit "Als Administrator ausführen" über das kontextmenü der rechten Maustaste). Nur dann können bestimmte REG-Schlüssel geändert werden, ohne der Bastelei die Berechtigungen für jeden Schlüssel jeweils verändern zu müssen.
Wir sind zwar aus dem Weg des Themas „Verknüpfung erstellten“ einiges weggerutscht, ich finde es passt noch etwas dazu, ansonsten eröffne ich einen neuen Beitrag, falls es sein muss.

Gruß ollidolli!

danke dir - ja, jetzt habe ich es verstanden face-wink

Gruß
evinben
Mitglied: bastla
bastla 21.04.2012 um 19:14:41 Uhr
Goto Top
Hallo evinben!
ansonsten eröffne ich einen neuen Beitrag, falls es sein muss.
Empfehlen würde ich es jedenfalls ...

Grüße
bastla
Mitglied: 106009
106009 21.04.2012 um 19:30:16 Uhr
Goto Top
Hi,

Zitat von @evinben:
Ein großes Problem habe ich noch. Wenn ich einen HKCU-Registry-Zweig mit runas.exe lade, dann lande ich zwar in dem
HKCU-Zweig aber zwangsweise des Benutzers Administrator, obwohl ich den Schalter /env (behält die aktuelle
Umgebung, anstatt diejenige des angegebenen Benutzers
) verwende. Sehr enttäuschend.

Nee, korrekt. Umgebung ist das Environment mit den Umgebungsvariablen.

Im HKU-Zweig findest du auch unter dem entsprechenden SID den Zweig des auch angemeldeten Benutzers, aus dessen Kontext du runas aufgerufen hast.
Und da kannst du deine Änderungen vornehmen.

Gruß
Mitglied: sugram
sugram 24.04.2012 um 07:26:09 Uhr
Goto Top
Hallo


Ich hätte dazu eine Frage.
In meiner Verknüpfung muß hinter der exe noch ein -vx.x.x.x

Ich habe schon mit den " " rumexperimentiert, leider bisher ohne Erfolg.
Endweder fehlt dann der Zusatz -v, oder der Shortcut wird nicht erstellt, weil beim erstellen eine Fehlermeldung in der Batch kommt.


Danke schon mal

Gruß sugram
Mitglied: bastla
bastla 24.04.2012, aktualisiert am 18.10.2012 um 18:50:43 Uhr
Goto Top
Hallo sugram!

Da damit ein zu übergebender Parameter gemeint sein dürfte: Verknüpfungen erstellen

Im übrigen wäre eine konkrete Beschreibung (des Batches und der Fehlermeldung) hilfreich ...

Grüße
bastla
Mitglied: sugram
sugram 24.04.2012 um 09:36:58 Uhr
Goto Top
Hallo bastla!

Da hast du vollkommen recht ... funktioniert nun einwandfrei face-smile
Ich dachte ich müßte den Parameer irgendwie bei set "progexe= ..... einbauen.
Daher hat das dann nicht funktioniert.

VIELEN Dank!!


Gruß
sugram
Mitglied: Ertgtct
Ertgtct 04.02.2013 um 10:54:25 Uhr
Goto Top
ok, hat auch mir geholfen, aber wie kann ich ein .exe mit zusätzlichen Parametern wie "-game" starten?
Mitglied: evinben
evinben 04.02.2013 um 11:32:40 Uhr
Goto Top
Hallo Ertgtct,

einfach so wie oben eine Verknüpfung entweder per Batch, VBS oder einfach manuell erstellen und die notwendigen Parameter eintragen.
Bzw. schreib uns, was dir nicht genau klar ist.

Gruß
evinben
Mitglied: Ertgtct
Ertgtct 04.02.2013 aktualisiert um 17:24:40 Uhr
Goto Top
Hallo evinben,

ich hab einfach keine Ahnung wo ich in den VBS teil der batch-Datei die Parameter , hier in meinen Fall " -game ..." eintragen soll, mit dem die .exe gestartet wird, damit sie auf die Ressourcen eines anderen Ordners zugreifen kann (der Teil ist jetzt hier nicht wichtig).
Ich möchte die Datei nähmlich als .exe kompilieren, damit sie das für andere alleine tut. Aber sonst funktioniert alles prima =)
Mitglied: Ertgtct
Ertgtct 04.02.2013 um 14:34:54 Uhr
Goto Top
und danke für die schnelle Antwort ;)
Mitglied: Ertgtct
Ertgtct 04.02.2013 aktualisiert um 17:23:54 Uhr
Goto Top
Nein sorry, war eine falsche Verknüpfung
Mitglied: DerKamiKatze
DerKamiKatze 21.09.2017 um 09:52:40 Uhr
Goto Top
Hallo.

Dieses Script hat mir sehr geholfen und funktioniert Einwandfrei!
Eine Herausforderung habe ich da allerdings noch:

Ich möchte dass im "Ziel", also "TargetPath" vor dem "%progdir%\%progexe%" folgendes steht:
"C:\Windows\System32\runas.exe /savedcred /env /user:administrator"

Also zusammen soll es dann so aussehen:
C:\Windows\System32\runas.exe /savedcred /env /user:administrator "%progdir%\%progexe%"

Was ich bisher erfolglos versucht habe:
- manuell in die Zeile TargetPath meinen Wunschzusatz eingetragen
- alternativ zum C:\Windows den %windir% verwendet
- meinen Wunschzusatz als set "adminbefehl=C:\Windows\System32\runas.exe /savedcred /env /user:administrator" und anschließend bei TargetPath als %adminbefehl% vorne eingefügt

Ich verzweifle langsam....
Kann mir jemand dabei helfen?
Mitglied: DerKamiKatze
DerKamiKatze 21.09.2017 um 15:03:41 Uhr
Goto Top
Ich habe es nun selbst behoben bekommen.

Der Code sieht nun wie folgt aus:

:: Dies erstellt eine Verknüpfung des Programms
@echo off & setlocal
set zielpfad=Zielpfad
set progtitel=Programmname
set progdir=Pfad zum Programmm
set progexe=Programmname.exe
set runas=%windir%\System32\runas.exe
set savedcred=/savedcred /env /user:administrator ""%progdir%\%progexe%""  

 >%temp%\MakeShortCut.vbs echo Set objShell=WScript.CreateObject("Wscript.Shell")>%temp%\MakeShortCut.vbs  
>>%temp%\MakeShortCut.vbs echo Set objShortcut=objShell.CreateShortcut("%zielpfad%\%progtitel%.lnk")>>%temp%\MakeShortCut.vbs  
>>%temp%\MakeShortCut.vbs echo objShortcut.TargetPath="%runas%">>%temp%\MakeShortCut.vbs  
>>%temp%\MakeShortCut.vbs echo objShortcut.Arguments="%savedcred%">>%temp%\MakeShortCut.vbs  
>>%temp%\MakeShortCut.vbs echo objShortcut.WorkingDirectory="%progdir%">>%temp%\MakeShortCut.vbs  
>>%temp%\MakeShortCut.vbs echo objShortcut.IconLocation = "Pfad zum Programm\Programmname.exe,0">>%temp%\MakeShortCut.vbs  
>>%temp%\MakeShortCut.vbs echo objShortcut.Save>>%temp%\MakeShortCut.vbs

cscript //nologo %temp%\MakeShortCut.vbs

Und falls sich jemand fragen sollte, wozu das gut ist:

Wenn man an einem PC ohne Adminrechte arbeitet, hat man ggf. Probleme damit, Programme auszuführen die Adminrechte benötigen.
Die auf die Art angelegte Verknüpfung wird unter dem Adminaccount ausgeführt, ohne dass der User das Passwort eingeben muss.
Mitglied: evinben
evinben 23.09.2017 um 11:00:19 Uhr
Goto Top
seltsam, dass ich keine Benachrichtigungen über neue Kommentare vom ADMINISTRATOR-Forum erhalten habe, sonst hätte ich gerne dem Mitglied Ertgtct noch damals auf seine Frage vom 04.02.2013 geantwortet.

Auch keine Benachrichtigung über die neue Frage (über den Kommentar) von DerKamiKatze vom 21.09.2017 habe ich erhalten, was darauf hindeutet, dass die Aussetzer im ADMINISTRATOR-Forum weiterhin vorhanden sind.
Erst heute um 9:55 Uhr ist eine Benachrichtigungs-E-Mail vom ADMINISTRATOR-Forum eingegangen.
Mitglied: evinben
evinben 23.09.2017 um 11:07:22 Uhr
Goto Top
Hallo DerKamiKatze,

schön, dass du es alleine geschafft hast.
Wieso gibst du die temporäre VBS.Datei sowohl am Anfang als auch am Ende jeder Zeile an?

>>%temp%\MakeShortCut.vbs echo objShortcut.Save>>%temp%\MakeShortCut.vbs 

Üblich wäre nur am Ende
echo objShortcut.Save>>%temp%\MakeShortCut.vbs

oder nur am Anfang
>>%temp%\MakeShortCut.vbs echo objShortcut.Save

Und mit
del "%temp%\MakeShortCut.vbs"  
lässt sich die temporär erstellte Datei löschen, was das Ganze etwas sauberer macht.

Gruß
evinben
Mitglied: DerKamiKatze
DerKamiKatze 13.11.2018 um 16:23:37 Uhr
Goto Top
Aloha zusammen.

Danke @evinben - die Tipps zum Aufräumen habe ich beherzigt und erfolgreich angewendet!
Nun stehe ich vor einem neuen Problem, welches ich bisher nicht lösen konnte... :

Es steht eine firmeninterne Systemumstellung an, welche den bisher genutzten Pfad ändert - das an sich ist okay, ABER der neue Pfad enthält einen Umlaut... In meinem Fall ein "ü".

Alle Versuche, den Umlaut umzuwandeln, funktionierten zwar innerhalb der Batch-Datei, jedoch nicht im vbs script... Bedeutet dass der unter "progdir" angelegte Pfad später in der Verknüpfung unter "Ziel" bzw. "Ausführen in" unsauber dargestellt wird.. Konkret wird das "ü" einfach nicht geschrieben.

Hat jemand eine Idee?
Kann ja nix schweres sein... Aber für heute bin ich durch mit meinem Latein.

Vielen Dank vorab!
Mitglied: evinben
evinben 13.11.2018 aktualisiert um 17:19:06 Uhr
Goto Top
Hallo @DerKamiKatze,

anbei eine Hilfe als Batch-Skript (rein als Beispiel) und solltest du analytisch doch nicht zurecht kommen, melde dich gerne erneut:

:Ziel der Verknüpfung erfahren
:~~~~~~~~~~~~~~~~~~~~~~~~~

@echo off
setlocal enabledelayedexpansion 
setlocal
@prompt -$G
chcp 1252 >nul

PushD %~dp0


:Ziel der Verknüpfung abfragen, um die Verknüpfungsdatei/den Verknüpfungsordner zu kopieren
:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
:Verknüpfung eingeben
set "LinkFile=Den Namen einer Datei (ohne Erweiterung) erhalten.bat (z. B. für den Namen einer Verknüpfung).lnk"   

:Über das temporär erzeugte VBS-Skript das Ziel der Verknüpfung abfragen
set "TempVBSkriptFile=%temp%\GetTargetPath.vbs"   
>%TempVBSkriptFile% echo WScript.Echo CreateObject("WScript.Shell").CreateShortcut(WScript.Arguments(0)).TargetPath   
for /f "delims=" %%i in ('cscript //nologo "%TempVBSkriptFile%" "%LinkFile%"') do set File=%%~nxi& set FileDirectory=%%~dpi& set TargetPath=%%~i  

goto :M1
:Umlauten durch ASCII Zeichen ersetzen 
:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
:Da der Pfad vom VBS-Skript in ANSI-Zeichen ausgegeben wird, kann er wegen den Umlauten von den (meisten) Befehlen nicht verarbeitet werden.
:Vor dem Fortsetzen müssen alle Umlauten in der Zeichenfolge durch ASCII-Zeichen ersetzt werden.    
set NoUmlaut=%1
set NoUmlaut=%NoUmlaut:Ž=Ä%
set NoUmlaut=%NoUmlaut:„=ä%
set NoUmlaut=%NoUmlaut:™=Ö%
set NoUmlaut=%NoUmlaut:”=ö%
set NoUmlaut=%NoUmlaut:=ü%
set NoUmlaut=%NoUmlaut:š=Ü%
set NoUmlaut=%NoUmlaut:á=ß%
goto :eof
:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

:M1 
:Umlauten im Zielpfad ersetzen:
echo.
call :Umlauten "%File%"  
set File=%NoUmlaut%
echo Datei:		%File%
echo.
call :Umlauten "%FileDirectory%"  
set FileDirectory=%NoUmlaut%
echo Verzeichnis:	%FileDirectory%
echo.
call :Umlauten "%TargetPath%"  
set TargetPath=%NoUmlaut%
echo Zielpfad:	%TargetPath%


:echo %TargetPath%>tmp.txt
pause >nul

Viel Erfolg!
Mitglied: DerKamiKatze
DerKamiKatze 13.11.2018 um 17:41:23 Uhr
Goto Top
Danke für deinen Beitrag.
Nur leider fühle ich mich nun unwissender als vorher face-sad

Ich weiß, dass VB Scripte kein UTF-8 verstehen bzw. schreiben können... So weit bin ich auch gekommen.
Aber ich verstehe nicht, wie man es schafft, dass die Umlaute auch korrekt geschrieben werden.
Die Auflistung des obigen Codes interpretiere ich so, dass man eine (temporäre?) Liste der benötigten Umlaute erstellt - aber das wird doch nichts daran ändern, dass beim schreiben der Umlaute in der Verknüpfung diese nicht oder falsch geschrieben werden - oder?

Da beim verwendeten Script mittels vbs geschrieben wird, würde ich drauf tippen, dass man am besten einfach erst die Verknüpfung erstellt.
In meinem Fall würde ich alle Umlaute mit Platzhaltern versehen - im Falle des "ü" z.B. "AAA". Anschließend könnte man per Batch in den Verknüpfungen ja jedes "AAA" durch ein "ü" ersetzen... Wäre das ein einfacher Ansatz? Das könnte man ja alles in derselben Batch-Datei zusammenpacken, oder?

Hab ich einen Denkfehler oder bin ich heute einfach nur doof? ... hmm
Mitglied: evinben
evinben 14.11.2018 um 08:46:53 Uhr
Goto Top
Hallo @DerKamiKatze

Hab ich einen Denkfehler oder bin ich heute einfach nur doof?

Keiner ist doof nur weil er was fragt, was er nicht weiß. Zumindest fragt er face-wink, was schon mal sehr gut ist!!! Statt klug zu schauen ... und nichts zu fragen ...


DerKamiKatze sende uns einfach das Skript, wie es aktuell ist, und beschreibe das Vorhaben und das Problem Schritt für Schritt: was du alles machen möchtest und was nicht funktioniert, alles an einer Stelle. Dann wird es transparenter und dir wird es sicherlich schnell geholfen.

Bis bald
Mitglied: DerKamiKatze
DerKamiKatze 14.11.2018 um 11:54:41 Uhr
Goto Top
Guten Morgen.

Okay - über Nacht hat sich mein Fehler aufgelöst und die Ursache ist identifiziert: Wie so oft, ist es der Nutzer selbst (ich), der den Fehler verursachte...

Ich dachte mir gestern nämlich, dass es doch toll sei, wenn die Ausgabe der Anweisungen in der Batchdatei auch Umlaute wie z.B. "ü"anzeigen würde, anstatt dass ich "ue" schreibe... Also änderte ich die Codierung mit dem Befehl
chcp 65001
zu UTF-8.

Das an sich funktionierte hervorragend und alle Umlaute wurden nun im Batch-Fenster angezeigt! Jedoch führte es dazu, dass das VB Script, welches UTF-8 ja nicht "versteht", dadurch beim Schreiben der Parameter in der Verknüpfung die Umlaute falsch angab, und die Verknüpfungen nicht funktionierten (Statt "ü" wurde "ü" geschrieben).

Die Lösung: Codierung zurück auf ANSI gesetzt und über den Schönheitsfehler hinweggesehen. Und ZACK - schon wird die Verknüpfung auch korrekt angegeben - denn wider erwarten schreibt das Script auch ein "ü" problemlos in die Verknüpfungseigenschaften.

Ich werde nachher mal einen anonymisiertes Codebeispiel einfügen, damit man das gesamte Ausmaß des Projekts klar wird face-smile

Dennoch ergibt sich daraus eine neue Frage: Kann man temporär, bei "echo" Textanweisungen in UTF-8 Schreiben, und danach wieder in ANSI wechseln? Oder ist immer nur eine Codierung pro Batch-Datei möglich?
Mitglied: DerKamiKatze
DerKamiKatze 15.11.2018 um 14:45:20 Uhr
Goto Top
Aaalso - nun ist es soweit. Das Wunder ist vollbracht und funktioniert einwandfrei.
Der Code sieht wie folgt aus:

:: Dies erstellt eine Verknuepfung des [PROGRAMMS] im [ORDNER]
@echo off & setlocal
set zielpfad=[ZIELPFAD]
set progtitel=[NAME_DER_VERKNÜPFUNG]
set progdir=[PFAD_DER_AUSZUFÜHRENDEN_.EXE_DATEI]
set progexe=[NAME_DER_.EXE_DATEI].exe
set runas=%windir%\System32\runas.exe
set savecred=/savecred /env /user:administrator ""%progdir%\%progexe%""  

echo Set objShell=WScript.CreateObject("Wscript.Shell")>>%temp%\MakeShortCut.vbs  
echo Set objShortcut=objShell.CreateShortcut("%zielpfad%\%progtitel%.lnk")>>%temp%\MakeShortCut.vbs  
echo objShortcut.TargetPath="%runas%">>%temp%\MakeShortCut.vbs  
echo objShortcut.Arguments="%savecred%">>%temp%\MakeShortCut.vbs  
echo objShortcut.WorkingDirectory="%progdir%">>%temp%\MakeShortCut.vbs  
echo objShortcut.IconLocation= "[PFAD_DER_.EXE_DATEI_DESSEN_SYMBOL_MAN_NUTZEN_MÖCHTE]\[NAME_DER_.EXE_DATEI].exe,0">>%temp%\MakeShortCut.vbs  
echo objShortcut.Save>>%temp%\MakeShortCut.vbs

cscript //nologo %temp%\MakeShortCut.vbs

del %temp%\MakeShortCut.vbs
:: Ende der Verknuepfungserstellung 

Das ist die Basis. Aus der heraus kann man wunderbar massenhaft Verknüpfungen erstellen lassen, welche dann auch noch mit Adminrechten ausgeführt werden - Wichtig: Der Admin muss beim Erststart 1x das Kennwort manuell eingeben.

Meine Batchdatei hat derzeit 1306 Zeilen und beinhaltet vier verschiedene Varianten der Verknüpfungserstellung, einen Changelog, einen Hilfeberich sowie "ASCII-Logos" face-smile

Ich erweitere das ganze noch deutlich mehr, aber das hat mit diesem Thema dann nichts mehr zu tun.

--

Bleibt nur noch eine Frage:
"Kann man temporär, bei "echo" Textanweisungen in UTF-8 Schreiben, und danach wieder in ANSI wechseln? Oder ist immer nur eine Codierung pro Batch-Datei möglich?"
Mitglied: evinben
evinben 15.11.2018, aktualisiert am 17.11.2018 um 18:14:48 Uhr
Goto Top
Hallo @DerKamiKatze,

wunderbar!

Kann man temporär, bei "echo" Textanweisungen in UTF-8 Schreiben, und danach wieder in ANSI wechseln? Oder ist immer nur eine Codierung pro Batch-Datei möglich?

Vielleicht hilft dir hier mein Beispiel weiter?

:Autobefehlsanzeige ausschalten:
@echo off
:Zeilenanfang in der Eingabeaufforderung auf ">" kürzen (Zeilenausgabe ohne Pfade): 
@prompt -$G

:	 CODE
:~~~~~~~~~~~~~~~~
:setlocal EnableDelayedExpansion
:setlocal DisableDelayedExpansion
:PushD %~dp0
echo.

set SrartCodePage=65001
chcp %SrartCodePage% >nul

echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
echo Test mit verschiedenen Codepages, um den Unterschied zu visualisieren zw.:
echo 1.Variante: Umschaltung von der einen in die andere Codepage, NACHDEM die Text-Variablen bereits gesetzt worden sind.
echo 2.Variante: Jeweils direkte Zuweisung der gewünschten Codepage, BEVOR die Text-Variablen gesetzt worden sind (ohne Doppelgemoppel und Verzerrung = die sauberere Lösung)
echo.
echo In diesem Beispiel werden die Codepages 65001 (Unicode), 1252 (Westeuropäisch) und 1251 (Kyrillisch) verwendet.
echo Es können auch andere Codepages verwendet werden (der Text in den Variablen kann dann bei Bedarf um andere Sprachen ergänzt werden)
echo.
echo Für besseres Verständnis das Batch-Skript einmal in ANSI und einmal in UTF-8 Zeichenkodierung ausführen
echo und anschließend die beiden Ausgabedateien miteinander vergleichen.
echo Bei beiden Zeichenkodierungen lässt sich der Text in der Ausgabedatei mit der 2. Variante bei allen drei Codepages einwandfrei lesen.
echo Mit der 1. Variante ist der Text nicht bei jeder Zeichenkodierung lesbar, z.B.:
echo Wenn die Zeichenkodierung der ausgegebenen Textdatei von UTF-8 auf ANSI umgeschaltet wird (z. B. im Notepad++ über "Kodierung > ANSI"),   
echo wird der Text mit der Codepage 1252 (Westeuropäisch) normal lesbar. Die anderen beiden Texte,
echo mit den Codepages 65001 (Unicode) und 1251 (Kyrillisch), werden dagegen nicht korrekt lesbar.
echo.
echo Einfach die Codepage-Nummer in der Reihenfolge zueinander tauschen und experimentieren, was dann mit dem Text in der 1. Variante passiert!
echo Welche Codepage vor diesem Text gesetzt ist, hat nicht nur auf die Lesbarkeit dieses Textes in der CMD eine Bedeutung, sondern auch auf die nachfolgenden Ergebnisse.
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

:Set Options
set OutputFileName=BatchAusgabe.txt

:/Set Options


set OutputFilePath="%~dp0%OutputFileName%"  

:Aktuelle Codepage ermitteln (Prüfung)
for /f "tokens=3 delims=. " %%d in ('CHCP') do set CurrentCodepage=%%d  
echo Start-Codepage: %CurrentCodepage%>%OutputFilePath%

echo.>>%OutputFilePath%

:Erklärung des Rätsels:
:Für den Text gesetzt in den nachfolgenden beiden Variablen wirkt sich die nacheinander abwechselnde Codepage aus!!!
:D. h. die Zeichen werden von der einen (die %SrartCodePage% oben) zu der anderen Codepage umgewandelt,
:was je nach Codepage-Unterstützug zu mehr oder weniger Informationsverlusten führt.
:Für den Text gesetzt in den namentlich gleichen Variablen in der Unterprozedur ":M10" ganz unten (die über den CALL-Aufruf abgearbeitet wird), 
:wird der Text dagegen nicht erst zw. zwei Codepages umgewandelt, sondern direkt in die jeweilige Codepage geschrieben (die sauberere Lösung!),
:also ohne den Umweg mit der Übersetzung von der einen in die andere Codepage (was dann höchstwahrscheinlich
:zu ungewollten Überraschungen bei der Verarbeitung der Zeichen führt).

set DE_String=Muskatnuss Herr Müller! MUSKATNUSS!!!
set RU_String=Матрёшка

:Die gewünschten Codepages nacheinander abarbeiten. Deren Reihenfolge spielt eine Rolle für die 1.Variante (jedoch ohne Auswirkung auf die 2.Variante).
FOR %%d in (65001 1252 1251) do (
	set CodePage=%%d
	call :M5
	call :M10
	)
	
echo.
echo ENDE! Siehe Ergebnisse in der Ausgabedatei %OutputFilePath%

timeout /t 40 >nul
:pause >nul
goto :eof
:END ____________________________________________________



:M5
CHCP %CodePage% >nul
echo Codepage: %CodePage%>>%OutputFilePath%
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~>>%OutputFilePath%
echo 1.Variante: Umschaltung von der einen in die andere Codepage (von %SrartCodePage% auf %CodePage%):>>%OutputFilePath%
echo (Codepage-Zuweisung nach den Text-Variablen)>>%OutputFilePath%
echo		DE %DE_String%>>%OutputFilePath%
echo		RU %RU_String%>>%OutputFilePath%
goto :eof

:M10
echo.>>%OutputFilePath%
echo 2.Variante: Codepage-Zuweisung vor den Text-Variablen>>%OutputFilePath%
set DE_String=Muskatnuss Herr Müller! MUSKATNUSS!!!
set RU_String=Матрёшка
echo		DE %DE_String%>>%OutputFilePath%
echo		RU %RU_String%>>%OutputFilePath%
echo.>>%OutputFilePath%
goto :eof


Viel Erfolg
Mitglied: DerKamiKatze
DerKamiKatze 21.02.2019 um 10:32:28 Uhr
Goto Top
Guten Morgen.

Das mit dem temporären Schreiben in UTF-8 hat leider nicht geklappt. Habe mich mangels Zeit dazu entschlossen, dass Umlaute im klassischen "ue", "ae" usw, geschrieben werden.

Wie dem auch Sei... Ich habe eine neue Herausforderung, für dich ich noch keine Lösung finden konnte:

Kann man bei der Verknüpfungserstellung automatisch den Haken im Reiter "Kompatibilität" bei "als Administrator ausführen" setzen?

Hintergrund ist der, dass es Systeme gibt, die ohne den "savecred" Befehl auskommen, die Programme dennoch "als Admin ausgeführt" werden müssen. Dies sind autarke Systeme ohne tatsächlichen Adminaccount. D.h. wenn diese den "savecred" Befehl nutzen, poppt zwar eine einmalige Eingabe des Kennworts für den User "administrator" auf, da dieser jedoch nicht existiert, kommt der User da nicht weiter.

Danke vorab für alle Ideen/Vorschläge face-smile
Mitglied: evinben
evinben 21.02.2019 um 15:24:24 Uhr
Goto Top
Hallo @DerKamiKatze,

lies z.B. hier:

"How to create a Run As Administrator shortcut using Powershell"
https://stackoverflow.com/questions/28997799/how-to-create-a-run-as-admi ...

Gruß
Mitglied: DerKamiKatze
DerKamiKatze 22.02.2019 um 07:48:53 Uhr
Goto Top
Guten Morgen.

Ich bin bei PowerShell ein absoluter Noob. Mich da rain zu fuchsen, steht noch auf meiner To-Do-Liste... Bis dahin gilt die Dumme Frage meinerseits:

Wie baue ich den befehl

$WshShell = New-Object -comObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut("$Home\Desktop\ColorPix.lnk")  
$Shortcut.TargetPath = "C:\Program Files (x86)\ColorPix\ColorPix.exe"  
$Shortcut.Save()

$bytes = [System.IO.File]::ReadAllBytes("$Home\Desktop\ColorPix.lnk")  
$bytes[0x15] = $bytes[0x15] -bor 0x20 #set byte 21 (0x15) bit 6 (0x20) ON
[System.IO.File]::WriteAllBytes("$Home\Desktop\ColorPix.lnk", $bytes)  

in eine Batch Datei ein?
Mitglied: DerKamiKatze
DerKamiKatze 22.02.2019 um 09:19:25 Uhr
Goto Top
So. Bitte verzeiht mir mein dummes Gefrage.. meist folgt erst darauf die Verbissenheit.

Die Lösung sieht wie folgt aus:

echo $WshShell = New-Object -comObject WScript.Shell>>%temp%\DP_Server.ps1
echo $Shortcut = $WshShell.CreateShortcut("ORT UND NAME DEINER VERKNÜPFUNG.lnk")>>%temp%\NAME DES TEMPORÄREN SCRIPTS.ps1  
echo $Shortcut.TargetPath = "ORT UND NAME DEINER .EXE DATEI.exe">>%temp%\NAME DES TEMPORÄREN SCRIPTS.ps1  
echo $Shortcut.Save()>>%temp%\NAME DES TEMPORÄREN SCRIPTS.ps1
echo $bytes = [System.IO.File]::ReadAllBytes("ORT UND NAME DEINER VERKNÜPFUNG.lnk")>>%temp%\NAME DES TEMPORÄREN SCRIPTS.ps1  
echo $bytes[0x15] = $bytes[0x15] -bor 0x20 #set byte 21 (0x15) bit 6 (0x20) ON>>%temp%\NAME DES TEMPORÄREN SCRIPTS.ps1
echo [System.IO.File]::WriteAllBytes("ORT UND NAME DEINER VERKNÜPFUNG.lnk", $bytes)>>%temp%\NAME DES TEMPORÄREN SCRIPTS.ps1  
PowerShell.exe -NoProfile -ExecutionPolicy Bypass -Command "%temp%\NAME DES TEMPORÄREN SCRIPTS.ps1"  
del %temp%\NAME DES TEMPORÄREN SCRIPTS.ps1

Auf diese Weise wird erst ein PowerShell Script im temporären Ordner erzeugt. Dieses Script erzeugt dann beim Ausführen mittels PowerShell eine Verknüpfung zur gewünschten .exe Datei im gewünschten Zielordner, welche jedoch pauschal den Haken bei "Als Administrator ausführen" gesetzt hat. Dies wird jedoch grafisch nicht angezeigt, wenn man dies unter Eigenschaften => Kompatibilität nachschaut. Ist aber da. Habe es soeben getestet und funktioniert einwandfrei!

So - nun schreibe ich das alles auf meine benötigten Stellen im Code um und kann dann ruhigen Gewissens ins Wochenende gehen!

Cheers!
Mitglied: evinben
evinben 22.02.2019 aktualisiert um 09:54:53 Uhr
Goto Top
Hallo,

einfach mit echo und mit > am Ende jeder Zeile, um jede diese Zeile in eine Datei zu schreiben:

set  PowerShellFile=MeineErstePowerShelDateil.ps1

echo $WshShell = New-Object -comObject WScript.Shell>%PowerShellFile%
echo $Shortcut = $WshShell.CreateShortcut("$Home\Desktop\ColorPix.lnk")>>%PowerShellFile%  

echo und hier alle Restlichen Zeilen, welche in die PowerShell-Datei hingeschrieben werden müssen, mit der selben Struktur eintragen.

echo Nächste Zeile>>%PowerShellFile%
echo Nächste Zeile>>%PowerShellFile%
echo ...

echo Dann diese neue PowerShell-Datei aus dem Batch-Skript ausführen lassen
Mitglied: evinben
evinben 22.02.2019 um 09:32:00 Uhr
Goto Top
du warst schneller eine Antwort zu finden, als ich deine Nachricht gelesen zu haben.
Bravo
Mitglied: DerKamiKatze
DerKamiKatze 22.02.2019 um 09:44:56 Uhr
Goto Top
face-smile

Darf ich mal blöde nachfragen, worin der Unterschied zwischen
>
und
>>
liegt? Mit zwei klappts doch?
Blicke dahingehend nicht ganz durch.
Mitglied: 138810
138810 22.02.2019 aktualisiert um 09:59:43 Uhr
Goto Top
einfach mit echo und mit > am Ende jeder Zeile, um jede diese Zeile in eine Datei zu schreiben:
Vollkommen überflüssig, da reicht ein Oneliner
Powershell -Executionpolicy ByPass -Command "$WshShell = New-Object -comObject WScript.Shell; $Shortcut = $WshShell.CreateShortcut(\"$Home\Desktop\ColorPix.lnk\"); $Shortcut.TargetPath = 'C:\Program Files (x86)\ColorPix\ColorPix.exe'; $Shortcut.Save(); $bytes = [System.IO.File]::ReadAllBytes(\"$Home\Desktop\ColorPix.lnk\"); $bytes[0x15] = $bytes[0x15] -bor 0x20; [System.IO.File]::WriteAllBytes(\"$Home\Desktop\ColorPix.lnk\",$bytes)"  
Mitglied: evinben
evinben 22.02.2019 aktualisiert um 09:56:51 Uhr
Goto Top
Hallo DerKamiKatze,

mit >> bei allen darauf folgenden Zeilen ist richtig. Ich habe bloß auf der Schnelle (Copy&Paste) es dann nicht mehr ergänzt (bereits korrigiert).

Mit nur einem Größer-als-Zeichen (>) wird die Datei überschrieben
Mit zwei aufeinander folgenden Größer-als-Zeichen (>>) wird die Datei um jede Zeile ergänzt.

Darf ich mal blöde nachfragen ...

bitte nein, jedoch frag einfach ruhig nach und beleidige dich selbst nicht
Mitglied: DerKamiKatze
DerKamiKatze 22.02.2019 um 09:58:37 Uhr
Goto Top
Zitat von @138810:

einfach mit echo und mit > am Ende jeder Zeile, um jede diese Zeile in eine Datei zu schreiben:
Vollkommen überflüssig, da reicht ein Onliner
> Powershell -Executionpolicy ByPass -Command "$WshShell = New-Object -comObject WScript.Shell; $Shortcut = $WshShell.CreateShortcut(\"$Home\Desktop\ColorPix.lnk\"); $Shortcut.TargetPath = 'C:\Program Files (x86)\ColorPix\ColorPix.exe'; $Shortcut.Save(); $bytes = [System.IO.File]::ReadAllBytes(\"$Home\Desktop\ColorPix.lnk\"); $bytes[0x15] = $bytes[0x15] -bor 0x20; [System.IO.File]::WriteAllBytes(\"$Home\Desktop\ColorPix.lnk\",$bytes)"  
> 

Interessant. Da ich - wie gesagt - ein "PowerShell n00b", bin nehme ich dies erstmal nur zur Kenntnis. Mein inzwischen 11.478 Zeilen langer Code in der .bat Datei wird irgendwann gänzlich in PowerShell geschrieben. Aber das mache ich erst, wenn ich dahingehend mehr gelernt habe.
Mitglied: evinben
evinben 22.02.2019 um 10:00:06 Uhr
Goto Top
Vollkommen überflüssig, da reicht ein Onliner

ein "onliner" ist für vieles scheinbar etwas ganz cooles. Aber die Übersicht? Diese ist ja bei der virtuellen Wellt sehr wichtig.
Mit einer Befehlszeile ist die Verarbeitung nicht etwa spürend schneller.
Mitglied: DerKamiKatze
DerKamiKatze 22.02.2019 um 10:03:47 Uhr
Goto Top
Zitat von @evinben:

Vollkommen überflüssig, da reicht ein Onliner

ein "onliner" ist für vieles scheinbar etwas ganz cooles. Aber die Übersicht? Diese ist ja bei der virtuellen Wellt sehr wichtig.
Mit einer Befehlszeile ist die Verarbeitung nicht etwa spürend schneller.

Okay. D.h. ob Oneliner oder alles in separate Zeilen - spielt für die Funktionalität keine Rolle?