nachtfalkeaw
Goto Top

RunAs mit VBscript - Ausführung mehrerer VERSCHACHTELTER batch Dateien als Admin im eingeschränkten Benutzerkonto

Hallo,

ich habe eine Rechnerumgebung mit mehreren Clients, die sich NICHT in einer Domäne befinden.
Auf diesen Rechnern möchte ich regelmässig Softwareupdates durchführen für z.B. Adobe, VLC, 7-zip, etc. pp.

Ich habe mir dafür jeweils batchdateien geschrieben, welche diese programme per silent Schalter installieren/aktualisieren etc.

Mein Problem ist nun, dass einige der Programme Administratorrechte benötigen, der Benutzer aber keine Administratorrechte hat.
Die Scripte sollen sich nach jeder Anmeldung des Benutzers starten, dann wird überprüft, ob es Neuerungen auf dem zentralen Speichern gibt und wenn ja, installiert, ansonsten das Script beendet.

Da ich mit "RunAs" kein Passwort mitgeben kann, habe ich mir shconmal ein .VBS script im netz gesucht:

Option explicit
Dim oShell
set oShell= Wscript.CreateObject("WScript.Shell")  
'Replace the path with the program you wish to run c:\program files...  
oShell.Run "RunAs /noprofile /user:administrator ""C:\Program Files\Microsoft Office\OFFICE11\WINWORD.EXE"""  
WScript.Sleep 100
'Replace the string --> yourpassword~ with the  
'password used on your system. Include the tilde "~"  
oShell.Sendkeys "yourpassword~"  
Wscript.Quit

Ich habe nun aber viele batchdateien, die je nach Bedingung aufgerufen werden - dann aber leider nicht mehr als Administrator.
Wie kann ich das geshcickt ändern ? Ich kenne mich in vbs GAR NICHT aus.


Eine andere Frage bzw. Überlegung:
Habe es schon über den Tasklplaner von Windows XP probiert, wenn ich da ausführen als Administrator einstelle und sich ein Benutzer anmeldet, dann wird es zwra im Hintergund ausgeführt (TaskManager zeigt es an), aber der Benutzer bekommt dann keinen Hinweis - das ist shclecht.
Wenn ich dem Benutzer einen Hinweise hinterlassen könnte, dass er nichts am PC machen soll, während das Update läuft, wäre das auch ok.

Ich hoffe, ihr könnt mir einen guten, einfachen Tip geben, wie ich das realisieren kann.


Dankeschön!

Content-ID: 168622

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

Ausgedruckt am: 19.11.2024 um 02:11 Uhr

Clijsters
Clijsters 26.06.2011 um 00:38:36 Uhr
Goto Top
Hallo,

diese Sendkeys-Krücke ist meiner Meinung nach keine gute und auch keine funktionssichere Methode, das, was du vorhast zu bewerkstelligen.
Das Passwort mitzugeben sollte nicht allzu schwer sein. (Google hätte sicherlich auch gut geholfen...)
Folgendes ist zwar nicht sicherer, aber funktionssicherer, da SendKeys auch daneben senden kann ;) - und du kannst weiterhin bei Batch bleiben
Echo Geheimespassqort | Runas /USER:Dominique Programm.exe


Gruß
Dominique

PS.:
Einfacher wäre es, einfach geplante Tasks zu erstellen...
Warum sollte der User nichts machen?

Könnte auch so gehen:
 ' Option explicit lasse ich mal weg...  
'Deklarieren von Variablen mag ich auch nicht...  
set oShell= Wscript.CreateObject("WScript.Shell")  
'genau so wenig, wie Kommentare ;)  
oShell.Run "CMD /C Echo Passwort|RunAs /noprofile /user:administrator ""C:\Program Files\Microsoft Office\OFFICE11\WINWORD.EXE"""  '<- Hier bin ich mir nicht ganz sicher, ob das so geht...  
MsgBox "Bitte tun sie jetz nix!" & vbcrlf & "Mache Updates...", vbSystemModal + VBInformation, "Hinweis"  
'Wscript.Quit Braucht keiner  
Nachtfalkeaw
Nachtfalkeaw 26.06.2011 um 21:25:49 Uhr
Goto Top
Hi,

danke für den/die Tips. Ich werde das bei Gelegenheit einmal testen und mich in jedem Fall melden face-smile

Zum Thema "Der Nutzer soll nichts machen"
Ich meine damit, er soll sich keine PDFs anschauen, wenn ich den Adobe Reader aktualisieren will. Kann ja keine Software aktualisieren, wenn sie in Benutzung ist.
Clijsters
Clijsters 26.06.2011 um 21:36:36 Uhr
Goto Top
Kann ja keine Software aktualisieren, wenn sie in Benutzung ist.
Das regelt der Adobe Reader schon selber face-smile
Nachtfalkeaw
Nachtfalkeaw 26.06.2011 um 22:02:44 Uhr
Goto Top
Hallo,

also der batch Befehl funktioniert leider nicht bei mir oder ich mache etwas falsch.
Benutzername ist "test" und Kennwort ist ebenfalls "test"

Echo test | Runas /USER:test install.cmd


Geben Sie das Kennwort für "test" ein:  
Es wird versucht, install.cmd als Benutzer "TESTPC\test" zu starten...  
RUNAS-FEHLER: install.cmd kann nicht ausgeführt werden
1326: Anmeldung fehlgeschlagen: unbekannter Benutzername oder falsches Kennwort.

Ich habe in der Vergangenheit shcon mehrfach gegoogelt und keine Lösung gefunden, wie man "runas" ein PW mitgeben kann.
Nachtfalkeaw
Nachtfalkeaw 28.06.2011 um 16:01:05 Uhr
Goto Top
Kann mir jemand helfen ?
Wo liegt mein Fehler in obiger batch, wenn es doch angeblich gehen soll ?
Clijsters
Clijsters 28.06.2011 um 19:21:48 Uhr
Goto Top
Hallo nochmal,

Ich muss dir Recht geben, es geht auch bei mir nicht.Was mich wundert, da ich es schon so gelöst habe...
Wenn du keinen geplanten Task möchtest, kannst du auch, um zu vermeiden, dass SendKeys daneben sendet,
mit AppActivate dein Script in den Vordergrund holen...

Gruß
Dominique
Nachtfalkeaw
Nachtfalkeaw 28.06.2011 um 20:05:24 Uhr
Goto Top
Zitat von @Clijsters:
Hallo nochmal,

Ich muss dir Recht geben, es geht auch bei mir nicht.Was mich wundert, da ich es schon so gelöst habe...
Wenn du keinen geplanten Task möchtest, kannst du auch, um zu vermeiden, dass SendKeys daneben sendet,
mit AppActivate dein Script in den Vordergrund holen...

Gruß
Dominique

Hallo Diminique,

das Problem beim VBS Script ist für mich, dass ich grob geschätzt 15 batch files habe. Es steht nicht alles in einer, sondern es werden verschachtelt diverse andere batch files gestartet. Grund ist einfach, dass ich vershciedene Aufgaben auslagern wollte um nur bestimmte dateien ändern/anpassen zu müssen, wenn sich etwas daran ändert.
Da ich aber kein VBS kann, müsste ich mit einem VBS script eine batch als Admin starten, die wird abgearbeitet und am ende startet diese batch ein anderes vbs script was nur dazu dient, wieder eine batch als admin zu starten. Das ist Blödsinn. Entweder nehme ich batch oder vbs, da ich letzteres nicht kann, muss ich mit batch auskommen face-wink

Aber vielleicht kannst du mir trotzdem anders helfen:
Angenommen ich führe dieses Batch-Konstrukt über den Taskplaner mit einem Administrator-Konto aus und zwra bei jeder Anmeldung eines Nutzers. Dann wird das Skript ausgeführt, allerdings für den Benutzer vollkommen unsichtbar - das ist blöd.

Du kannst es gerne einmal testen, ein batch, die eine textdatei öffnet in den Taskplaner und als Administrator ausführen, anshcließénd dann als Benutzer anmelden. Im TaskManager sieht man den Prozess aber sonst bekommt man keine Meldung. Wenn du mir zu diesem Problem eine Lösung nennen könntest, dann wäre mir damit auch schon geholfen face-smile
Vielleicht ein Skript, was einen Ordner auf eine bestimmte Datei überprüft und solange diese Datei noch nicht da ist, wird ein Fenster geziegt "Bitte warten, wird aktualisiert" und sobald diese Datei da ist, kommt die Meldung "Aktualisierung beendet". Diese könnte ich in den Windows Autostart unter "All Users" legen.

Grüße und Danke
Alex
Clijsters
Clijsters 28.06.2011 um 20:19:21 Uhr
Goto Top
Hallo Diminique,
Hallo Nachtikea,

Da ich aber kein VBS kann, müsste ich mit einem VBS script eine batch als Admin starten, die wird abgearbeitet und am ende startet diese batch ein anderes vbs script was nur dazu dient, wieder eine batch als admin zu starten. Das ist Blödsinn.

Jepp, das ist Blödsinn. Um nicht zu sagen, Schwachsinn.

Ein Script arbeitet mehere Kommandos nach und nach ab. Das ist nicht nur bei einem Batch so, sondern auch bei einem VBScript.
So ist das VBS auch dazu in der Lage, anstelle der Batch, die ein weiteres VBScript startet, die dann wieder eine Batch startet ääh einfach nach Ausführung der ersten Batch, die zweite zu starten.
Krass, wa? Sorry, ist nicht mein Wetter

set wshshell = createobject("wscript.shell")  
wshshell.run ("cmd /C das batch")  

Do While Wshshell.AppActivate("Batchfenstertitel o.Ä.")  
Sleep 100
Loop

wshshell.run das nächste, immer so weiter...
Am Besten lässt sich sowas mit einer Schleife durch ein Array durch Batches lösen, denke ich.
Es gibt aber Leute, die das besser machen, als ich...

Ist das eine Idee?

Wenn ja, könnte man sich Mühe geben und was posten.


Gruß
Dominique

PS.:
Vielleicht ein Skript, was einen Ordner auf eine bestimmte Datei überprüft und solange diese Datei noch nicht da ist
So hätte ich es auch gemacht, ist aber nicht der professionelle Weg.
Nachtfalkeaw
Nachtfalkeaw 29.06.2011 um 18:35:07 Uhr
Goto Top
Zitat von @Clijsters:
> Hallo Diminique,
Hallo Nachtikea,

> Da ich aber kein VBS kann, müsste ich mit einem VBS script eine batch als Admin starten, die wird abgearbeitet
und am ende startet diese batch ein anderes vbs script was nur dazu dient, wieder eine batch als admin zu
starten. Das ist Blödsinn.

Jepp, das ist Blödsinn. Um nicht zu sagen, Schwachsinn.

Ein Script arbeitet mehere Kommandos nach und nach ab. Das ist nicht nur bei einem Batch so, sondern auch bei einem VBScript.
So ist das VBS auch dazu in der Lage, anstelle der Batch, die ein weiteres VBScript startet, die dann wieder eine Batch startet
ääh einfach nach Ausführung der ersten Batch, die zweite zu starten.
Krass, wa? Sorry, ist nicht mein Wetter

> set wshshell = createobject("wscript.shell")  
> wshshell.run ("cmd /C das batch")  
> 
> Do While Wshshell.AppActivate("Batchfenstertitel o.Ä.")  
> Sleep 100
> Loop
> 
> wshshell.run das nächste, immer so weiter...
> 
Am Besten lässt sich sowas mit einer Schleife durch ein Array durch Batches lösen, denke ich.
Es gibt aber Leute, die das besser machen, als ich...

Ist das eine Idee?

Wenn ja, könnte man sich Mühe geben und was posten.


Gruß
Dominique

PS.:
> Vielleicht ein Skript, was einen Ordner auf eine bestimmte Datei überprüft und solange diese Datei noch nicht da
ist
So hätte ich es auch gemacht, ist aber nicht der professionelle Weg.



Hallo mein französisch klingender Forumsteilnehmer,
es ist schonmal von Vorteil, dass wir bei dem Thema batch -> vbs -> batch -> vbs .... einer Meinung sind.
Allerdings kann dein krasses vbs Skript meine Anforderung so nicht erfüllen, da sich je nach Bedingungserfüllung andere Entscheidungen ergeben, als es ein starrer Ablauf, wie in deinem Beispiel angeführt, zulässt. Die Idee ist aber trotzdem nicht shclecht und lässt sich in Zukunft vielleicht verwenden.

Kommen wir nun zum PS:
als batch würde ich einfach ein "if exist "filename goto" machen und das ganze mit einem ping 127.0.0.1 >NUL etwas herauszögern, so dass quasi alle ~10s geprüft wird.

Eine bessere Idee ?

Grüße
Alex
Clijsters
Clijsters 29.06.2011 um 19:12:20 Uhr
Goto Top
Hallo mein französisch klingender Forumsteilnehmer,
Das verdient einen goldenen Stern face-smile

Mein krasses Script war nur ein Funktionsbeispiel.

zum PS:
Ja, das Prinzip ist das, was ich auch machen würde. Mit einem VBS geht das genauso. Nun ist es aber erstmal egal, ob Batch oder VBS.

VBS würde meiner einung nach so aussehen:
set fso = createobject("scripting.filesystemobject")  

'Methode 1: Wenn existiert, dann...  
if fso.fileexist("bla.txt") Then  
  Tuhe das
  tuhe das
Else
  Tuhe was anderes
End If

'Oder, noch besser:  
'Solange existiert, warte und tuhe dann etwas (Dialog anzeigen:  

Do While FSO.Fileexist(bla.txt")  
  sleep 500 'Entspricht 0.5 Sek.  
Loop

MsgBox "Fertig!"  

Der einzige Unterschied hier ist, dass wir ziemlich präzise auf das Ereignis, dass die Datei existiert, oder halt eben gelöscht wird warten können.
Ansonsten, schreib doch mal ein Batch, wie du es ungefähr für richtig hältst.
So kommen wir der Praxis, denke ich etwas näher.
Oder:
Nenne mir die genauen Bedingungen und ich versuche, etwas unkrasses, produktiveres zu basteln face-smile

Gruß
Dominique
Nachtfalkeaw
Nachtfalkeaw 01.07.2011 um 22:28:22 Uhr
Goto Top
cls
@echo off
:ANFANG
cls
if exist C:\ZIEL\OK_ENDE.txt goto OK_ENDE
if exist C:\ZIEL\FEHLER_ENDE.txt goto FEHLER_ENDE
	cls
	@echo off
@echo @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@echo @@@@@                BITTE SPEICHERN SIE IHRE ARBEIT UND                   @@@@@
@echo @@@@@                   SCHLIESSEN SIE ALLE PROGRAMME                      @@@@@
@echo @@@@@                                                                      @@@@@
@echo @@@@@                   IHR SYSTEM WIRD AKTUALISIERT                       @@@@@
@echo @@@@@                      !!! BITTE WARTEM !!!                            @@@@@
@echo @@@@@                                                                      @@@@@
@echo @@@@@                  ES ERSCHEINT EINE MELDUNG, WENN                     @@@@@
@echo @@@@@                 ALLE VORGAENGE ABGESCHLOSSEN SIND                    @@@@@
@echo @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
	ping localhost -n 10 >NUL
	goto ANFANG


:OK_ENDE
	cls
	@echo off
@echo @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@echo @@@@@                                                                      @@@@@
@echo @@@@@               INSTALLATION ERFOLGREICH BEENDET                       @@@@@
@echo @@@@@               INSTALLATION ERFOLGREICH BEENDET                       @@@@@
@echo @@@@@               INSTALLATION ERFOLGREICH BEENDET                       @@@@@
@echo @@@@@               INSTALLATION ERFOLGREICH BEENDET                       @@@@@
@echo @@@@@                                                                      @@@@@
@echo @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
	del C:\ZIEL\OK_ENDE.txt
	del C:\ZIEL\FEHLER_ENDE.txt
	ping localhost -n 10 >NUL
	exit 0

:FEHLER_ENDE
	cls
	@echo off
@echo @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@echo @@@@@                                                                      @@@@@
@echo @@@@@                   FEHLER - INSTALLATION ABGEBROCHEN                  @@@@@
@echo @@@@@                   FEHLER - INSTALLATION ABGEBROCHEN                  @@@@@
@echo @@@@@                   FEHLER - INSTALLATION ABGEBROCHEN                  @@@@@
@echo @@@@@                   FEHLER - INSTALLATION ABGEBROCHEN                  @@@@@
@echo @@@@@                                                                      @@@@@
@echo @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
	del C:\ZIEL\OK_ENDE.txt
	del C:\ZIEL\FEHLER_ENDE.txt
	ping localhost -n 10 >NUL
	exit 0

Ich prüfe ob die Datei OK_ENDE.txt oder FEHLER_ENDE.txt da ist. Diese entstehen, jenahcdem, welche Errorlevel in den vorherigen scripts zurückgegeben werden und was dann eben für Folgen daraus resultieren.
Clijsters
Clijsters 04.07.2011 um 19:37:15 Uhr
Goto Top
Grundsätzlich sicherlich nicht schlecht.
Ich würde die überflüssigen @echo off und @'s und cls' noch vlt. herausnehmen, das macht einen komischen Eindruck.

Wobei ich als User schon stutzig werden würde, wenn mich auf einmal so ein schwarzer Kasten anschreien würde.
Vor allen Dingen, wenn die Schleife abbricht, die andere Batch (warum auch immer) die Dateien nicht erstellt...
und das Fenster nicht mehr aufhört, zu schreien.


Gruß
Dominique
Nachtfalkeaw
Nachtfalkeaw 04.07.2011 um 19:57:42 Uhr
Goto Top
Zum Glück kann man verschiedener Meinung sein.
Weiterhin haben die "cls" schon ihre Berechtigung, aber dazu muss man das script ausführen um den optischen Effekt zu betrachten.

Alternativ würde mich natürlich DEINE Lösung interessieren - geschrieen werden sollte dabei natürlich nicht. Ich bin gespannt und nehme Vorschläge gerne an.
Clijsters
Clijsters 04.07.2011 um 22:23:45 Uhr
Goto Top
etwas zu CLSen, was keine Augabe gibt, ist meiner Meinung nach nicht ziemlich sinnvoll...

Nun ja, das wäre meine auf die Schnelle gebastelte Lösung:
set wshshell = createobject("Wscript.Shell")  

RegPfadstatus = "HKEY_LOCAL_MACHINE\SOFTWARE\SWUpdates\Status"  

on error resume next

MsgBox "Ihr System wird aktualisiert" & vbcrlf & "Bitte schließen Sie alle geöffneten Anwendungen, bevor Sie fortfahren.", vbSystemModal + vbInformation, "Softwareupdates werden installiert..."  
wscript.sleep 4500     '4,5 Sekunden warten.  

counter = 1

Do
		
	if counter = 360 Then       '6 Minuten  
		MsgBox "Die Updates scheinen fehlgeschlagen zu sein." & vbcrlf & "Die anwendung antwortet nicht, der Vorgang wird abgebrochen...", vbexclamation + VbWarning, "Timeout"  
		wscript.quit
	End If
	
	counter = counter+1
	wscript.sleep 100
	Err.Clear	
	
	If Wshshell.RegRead(RegPfadstatus) = "OK" Then  
		if err.number = 0 Then 
			MsgBox "Die Installtion der Updates wurde abgeschlossen.", vbinformation, "Ende"  
			wscript.quit
		End If
	elseif Wshshell.RegRead(RegPfadstatus) = "Fehler" Then  
		If Err.Number = 0 Then
			MsgBox "Bei der Installation der Updates ist ein Fehler aufgetreten!", vbExclamation + vbSystemModal, "Fehler bei Updates!"  
			wscript.quit
		End If
	End If
	
Loop
Dein Script schreibt einen Status in die Reg und sobald dieser von dem VBS gelesen wird, spuckt es einen kleinen Dialog aus.
Wenn nach 6 Minuten kein Status erscheint, bricht das Script ab und meldet einen Timeout (Die Zeit ist selbstverständlich anpassbar)


Gruß
Dominique
Nachtfalkeaw
Nachtfalkeaw 04.07.2011 um 23:19:26 Uhr
Goto Top
Hi,

die Idee ist gut und ich erkenne die Problematik dahinter, dass mein Script im schlimmsten Fall zu keinem Ende kommt.

Danke.