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-Key: 1611958285

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

Printed on: July 27, 2024 at 12:07 o'clock

Member: beidermachtvongreyscull
beidermachtvongreyscull Dec 12, 2021 at 18:15:58 (UTC)
Goto Top
Dir ist bewusst, dass Du keine Frage gestellt hast?
Member: PeterleB
PeterleB Dec 12, 2021 updated at 21:04:26 (UTC)
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
Member: beidermachtvongreyscull
beidermachtvongreyscull Dec 13, 2021 at 04:03:16 (UTC)
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
Mitglied: 149569
149569 Dec 13, 2021 updated at 09:55:45 (UTC)
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.
Member: PeterleB
PeterleB Dec 13, 2021 at 11:07:34 (UTC)
Goto Top
Hallo,
vielen Dank für den Link.
Ich verstehe davon programmtechnisch nicht jedes Detail, aber werde es ausprobieren.

Gruß
Peter
Member: PeterleB
PeterleB Dec 13, 2021 at 21:27:17 (UTC)
Goto Top
@149569
Danke für die Hinweise.
Den "HasLUAShield" Eintrag hatte ich schon probiert - ohne Erfolg.

Bemühe mich.

Gruß
Peter
Member: PeterleB
PeterleB Dec 14, 2021 at 06:47:14 (UTC)
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
Mitglied: 149569
149569 Dec 14, 2021 updated at 06:58:04 (UTC)
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!
Member: PeterleB
PeterleB Dec 14, 2021 updated at 07:19:16 (UTC)
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
Mitglied: 149569
149569 Dec 14, 2021 updated at 07:18:29 (UTC)
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..
Member: PeterleB
PeterleB Dec 14, 2021 at 07:28:48 (UTC)
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
Member: PeterleB
PeterleB Dec 14, 2021 at 07:49:28 (UTC)
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
Mitglied: 149569
149569 Dec 14, 2021 updated at 08:18:44 (UTC)
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.
Member: PeterleB
PeterleB Dec 14, 2021 at 10:59:49 (UTC)
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