peterleb
Goto Top

Berechtigung für vbs-Script auf dem Systemlaufwerk

Hallo,
folgender VBS-Code zum Umbenennen einer EXE-Datei funktioniert tadellos,
nur nicht im Programme- oder Windows-Verzeichnis des Systemlaufwerkes.
Fehlermeldung: Erlaubnis verweigert
Das Script startet doch schon mit erhöhten Rechten!

'rename_with_version.vbs  
'  
Set WshShell = WScript.CreateObject("WScript.Shell")  
If WScript.Arguments.Length = 0 Then
  Set ObjShell = CreateObject("Shell.Application")  
  ObjShell.ShellExecute "wscript.exe", """" & WScript.ScriptFullName & """ RunAsAdministrator", , "runas", 1  
  WScript.Quit
End if

Dim arg, folder, fso, objShell, bname, ext, destination, fileversion
Set fso = CreateObject("Scripting.FileSystemObject")  
Set objShell = CreateObject("Shell.Application")  

If WScript.Arguments.Count > 0 Then
	arg = WScript.Arguments(0)
Else
	MsgBox "Keine Datei übergeben!",vbExclamation  
	WScript.Quit 1
End If

If fso.FileExists(arg) Then
	folder = fso.GetParentFolderName(arg)
	bname = fso.GetBaseName(arg)
	ext = fso.GetExtensionName(arg)
	fileversion = objShell.NameSpace(folder).ParseName(fso.GetFileName(arg)).ExtendedProperty("{0CEF7D53-FA64-11D1-A203-0000F81FEDEE} 4")  
	If fileversion <> "" Then  
		destination = folder & "\" & bname & "." & fileversion & "." & ext  
		fso.MoveFile arg, destination
	Else
		MsgBox "Versionsinfo ist leer!",vbExclamation  
	End If
Else
	MsgBox "Datei '" & arg & "' existiert nicht.", vbExclamation  
	WScript.Quit 1
End If

Schönen Advent noch
Peter

Content-ID: 1611958285

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

Ausgedruckt am: 19.12.2024 um 13:12 Uhr

beidermachtvongreyscull
beidermachtvongreyscull 12.12.2021 um 19:15:58 Uhr
Goto Top
Dir ist bewusst, dass Du keine Frage gestellt hast?
PeterleB
PeterleB 12.12.2021 aktualisiert um 22:04:26 Uhr
Goto Top
Sorry,
unklar ausgedrückt.
Also warum hat das Script in Systemverzeichnissen keine Berechtigung, eine Datei (hier *.exe, ist in der Registry als Kontextmenü verlinkt) umzubenennen?

Grüße
Peter
beidermachtvongreyscull
beidermachtvongreyscull 13.12.2021 um 05:03:16 Uhr
Goto Top
Schau mal hier:
https://stackoverflow.com/questions/17466681/how-to-run-vbs-as-administr ...

Es kann zwar sein, dass Du das Script als Admin laufen lässt, aber die UAC macht Dir dennoch einen Strich durch die Rechnung, weil der Admin nicht alles darf.

Es muss mit erhöhten Rechten laufen.

Gruß
bdmvg
149569
149569 13.12.2021 aktualisiert um 10:55:45 Uhr
Goto Top
Zitat von @PeterleB:
Also warum hat das Script in Systemverzeichnissen keine Berechtigung, eine Datei (hier *.exe, ist in der Registry als Kontextmenü verlinkt) umzubenennen?
Weil elevated Kontextmenü Extensions mit einem speziellen Admin-Flag in der Registry versehen werden sollten.
"HasLUAShield"
https://winaero.com/add-run-as-administrator-context-menu-item-to-msi-fi ...
Dann entfällt auch das elevieren im Skript selbst, weil das von Windows forciert wird.

folgender VBS-Code zum Umbenennen einer EXE-Datei funktioniert tadellos,
Übrigens hat dein Skript einen gravierenden logischen Fehler und x redundante Objektedeklarationen ...Mal wieder ein copy & paste Opfer face-big-smile. Einfach nochmal grundlegend durchlesen dann sollte es dir hoffentlich selbst auffallen.
PeterleB
PeterleB 13.12.2021 um 12:07:34 Uhr
Goto Top
Hallo,
vielen Dank für den Link.
Ich verstehe davon programmtechnisch nicht jedes Detail, aber werde es ausprobieren.

Gruß
Peter
PeterleB
PeterleB 13.12.2021 um 22:27:17 Uhr
Goto Top
@149569
Danke für die Hinweise.
Den "HasLUAShield" Eintrag hatte ich schon probiert - ohne Erfolg.

Bemühe mich.

Gruß
Peter
PeterleB
PeterleB 14.12.2021 um 07:47:14 Uhr
Goto Top
Hallo,

die Methode mit runas / "HasLUAShield" würde ja generell für all vbs-Scripte gelten.
Das ist gar nicht nötig.

Nur dieses Script im Kontextmenü von Programmdateien (*.exe) soll mit ausreichenden Rechten starten.

image1

Gruß
Peter
149569
149569 14.12.2021 aktualisiert um 07:58:04 Uhr
Goto Top
Zitat von @PeterleB:

Hallo,

die Methode mit runas / "HasLUAShield" würde ja generell für all vbs-Scripte gelten.
Nein, Blödsinn! Das Setting muss natürlich nur im Reg-Zweig für deinen Kontextmenü-Eintrag gesetzt werden und im Skript kann dann das elevieren entfallen!
PeterleB
PeterleB 14.12.2021 aktualisiert um 08:19:16 Uhr
Goto Top
Habe im Script noch einiges umgeschrieben (redundante Deklarationen, Abfrage Produktversion), aber den "grundlegend logischen Fehler" entdecke ich nicht.

'rename_with_version.vbs  
'  
'ApplicationName (Program Name) {F29F85E0-4FF9-1068-AB91-08002B27B3D9}, 18  
'Comment {F29F85E0-4FF9-1068-AB91-08002B27B3D9}, 6  
'Company {D5CDD502-2E9C-101B-9397-08002B2CF9AE}, 15  
'File Description {0CEF7D53-FA64-11D1-A203-0000F81FEDEE}, 3  
'File Version {0CEF7D53-FA64-11D1-A203-0000F81FEDEE}, 4  
'Date Last Used {841E4F90-FF59-4D16-8947-E81BBFFAB36D}, 16  
'Product Name {0CEF7D53-FA64-11D1-A203-0000F81FEDEE}, 7  
'Product Version {0CEF7D53-FA64-11D1-A203-0000F81FEDEE}, 8  
'Version {D5CDD502-2E9C-101B-9397-08002B2CF9AE}, 29  
'Copyright {64440492-4C8B-11D1-8B70-080036B11A03}, 11  

Set WshShell = WScript.CreateObject("WScript.Shell")  
If WScript.Arguments.Length = 0 Then
  Set OShell = CreateObject("Shell.Application")  
  OShell.ShellExecute "wscript.exe", """" & WScript.ScriptFullName & """ RunAsAdministrator", , "runas", 1  
  WScript.Quit
End if

Dim arg, folder, fso, objShell, bname, ext, destination, fileversion, productversion
Set fso = CreateObject("Scripting.FileSystemObject")  
Set objShell = CreateObject("Shell.Application")  

If WScript.Arguments.Count > 0 Then
	arg = WScript.Arguments(0)
Else
	MsgBox "Keine Datei übergeben!",vbExclamation  
	WScript.Quit 1
End If

If fso.FileExists(arg) Then
	folder = fso.GetParentFolderName(arg)
	bname = fso.GetBaseName(arg)
	ext = fso.GetExtensionName(arg)
	fileversion = objShell.NameSpace(folder).ParseName(fso.GetFileName(arg)).ExtendedProperty("{0CEF7D53-FA64-11D1-A203-0000F81FEDEE} 4")  
	productversion = objShell.NameSpace(folder).ParseName(fso.GetFileName(arg)).ExtendedProperty("{0CEF7D53-FA64-11D1-A203-0000F81FEDEE} 8")  
	If fileversion <> "" Then  
		If fileversion <> "0.0.0.0" then  
			destination = folder & "\" & bname & "." & fileversion & "." & ext  
		Else
			If productversion <> "" Then  
				destination = folder & "\" & bname & "." & productversion & "." & ext  
			End If
		End If
		fso.MoveFile arg, destination
	Else
		MsgBox "Versions- und Produktinfo ist leer!",vbExclamation  
	End If
Else
	MsgBox "Datei '" & arg & "' existiert nicht.", vbExclamation  
	WScript.Quit 1
End If

Das reg-file sieht so aus:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\exefile\shell\RenameWithVersion]
"Icon"="imageres.dll,89"  
@="Version in Name übernehmen"  

[HKEY_CLASSES_ROOT\exefile\shell\RenameWithVersion\command]
@="wscript //NOLOGO \"C:\\Scripts\\rename_with_version.vbs\" \"%1\""  

Gruß
Peter
149569
149569 14.12.2021 aktualisiert um 08:18:29 Uhr
Goto Top
Zitat von @PeterleB:

Habe im Script noch einiges umgeschrieben (redundante Deklarationen, Abfrage Produktversion), aber den "grundlegend logischen Fehler" entdecke ich nicht.
Na "RunAsAdministrator" ist ja wohl kaum ein vollqualifizierter Pfad, kann also niemals funktionieren eben weil du dieses Argument an "arg" übergibst.
Des weiteren sagte ich ja oben, das elevieren ist dann überflüssig wenn man den Luashield Eintrag für den Kontextmenü Eintrag setzt..
PeterleB
PeterleB 14.12.2021 um 08:28:48 Uhr
Goto Top
Das "RunAsAdministrator" ist aus dem Link von @beidermachtvongreyscull.
Ich probiere jetzt nochmal den Luashield Eintrag und kommentiere den runas-Abschnitt aus.

Gruß
Peter
PeterleB
PeterleB 14.12.2021 um 08:49:28 Uhr
Goto Top
Nach meinen Recherchen legt "HasLUAShield" nur das Kontextmenü-Icon fest, wenn kein anderes angegeben ist, wirkt sich also nicht auf die Ausführung mit erhöhten Rechten aus.

Gruß
Peter
149569
149569 14.12.2021 aktualisiert um 09:18:44 Uhr
Goto Top
Zitat von @PeterleB:

Nach meinen Recherchen legt "HasLUAShield" nur das Kontextmenü-Icon fest, wenn kein anderes angegeben ist, wirkt sich also nicht auf die Ausführung mit erhöhten Rechten aus.

Ließ den Beitrag oben genauer, der Command ist im "runas" Zweig abgelegt und das wird per Default elevated ausgeführt. Der LuaShield ist natürlich nur das Icon. Alter liest hier denn keiner mehr vernünftig Artikel die man postet?? Ist ja wie im Kindergarten hier.

Außerdem wird in deinem Skript (Zeile 25) ebenfalls der Elevation Abschnitt durch die If Abfrage sowieso niemals erreicht weil du dem Skript ja immer ein Argument übergibst! Das ist der eigentliche logische Fehler hier.
PeterleB
PeterleB 14.12.2021 um 11:59:49 Uhr
Goto Top
Du hast irgendwie Recht.

Der Gedanke der Schöpfer war wohl ein erneuter Selbstaufruf des Scriptes als Admin.
Ist demnach nicht für ein Kontextmenü geeignet, wo ja ein Parameter übergeben werden muss.
Dann funktioniert auch der letzte Post in
stackoverflow.com/questions/17466681/how-to-run-vbs-as-administrator-from-vbs
nicht.
Muss den Artikel nochmal genau studieren.
Wenn ich den runas-Zweig für exe Dateien auf mein Script umbiege, fehlt ja dann der Standard "Als Admin ausführen".
Oder bin ich jetzt ganz auf dem Holzweg?

Gruß
Peter