20.01.2010 yahe administration code legacy windows
Hannes hat letztens das Tool CPAU vorgestellt, das im Grunde genauso funktioniert, wie das Windows-interne runas-Programm. Wer dessen Funktionalität nicht kennt: Es ist dazu da, um eine Anwendung mit den Rechten eines anderen Benutzers ausführen zu können.
Nun ist bei ihm das Problem aufgetreten, dass es ihm nicht möglich war, MSP-Dateien auszuführen. Grund hierfür ist, dass es sich bei MSP-Dateien nicht um echte, ausführbare Dateien handelt, sondern um Dokumente, also im Grunde wie Bilddateien.
Wenn ihr sehen wollt, was Windows im Hintergrund macht, wenn ihr ein Dokument doppelt anklickt, könnt ihr folgendes machen:
Für diejenigen unter euch, die gerne experimentieren: Lasst die Finger von dem Knoten "exefile"! Wenn ihr diesen unbedarft ändert, zerschießt ihr euch das ganze System. Um das dann wieder gerade zu biegen, müsst ihr remote den entsprechenden Registry-Hive mounten und den Registry-Eintrag reparieren.)
Nach diesem kleinen Exkurs kommen wir nun zurück zum Thema: Das Problem, weshalb die runas-Programme diese MSP-Datei nicht öffnen können, liegt darin, dass sie versuchen, die Datei direkt auszuführen. Dabei müssten sie stattdessen erst nachgucken, mit welchem Programm die Datei geöffnet werden muss. Hierfür habe ich ein kleines Testprogramm mit dem Namen "execute" geschrieben: Es macht nicht viel, sondern öffnet eine angegebene Datei einfach anhand des Befehls, der dort in der Registry hinterlegt ist. Dabei ist es egal, ob es sich um ein Programm, ein Bild oder etwas anderes handelt.
program execute;
uses
Windows,
SysUtils,
ShellAPI,
ActiveX;
var
VCOMCode : HRESULT;
VIndex : Integer;
VParameters : String;
VReturnCode : Cardinal;
begin
ExitCode := 0; // application terminated successfully
if (ParamCount > 0) then
begin
VParameters := '';
for VIndex := 2 to ParamCount do
VParameters := VParameters + '"' + ParamStr(VIndex) + '" ';
Delete(VParameters, Length(VParameters), 1); // trim last space character
VCOMCode := CoInitializeEx(nil, COINIT_APARTMENTTHREADED or COINIT_DISABLE_OLE1DDE);
if ((VCOMCode = S_OK) or (VCOMCode = S_FALSE)) then
begin
try
VReturnCode := ShellExecute(0, // hwnd,
'open', // lpOperation,
PAnsiChar(ParamStr(1)), // lpFile,
PAnsiChar(VParameters), // lpParameters,
PAnsiChar(ExtractFilePath(ParamStr(1))), // lpDirectory,
SW_SHOWNORMAL // nShowCmd
);
if (VReturnCode <= 32) then
ExitCode := 100 + VReturnCode; // file could not be executed
finally
CoUninitialize();
end;
end
else
ExitCode := 2; // COM could not be initialized
end
else
ExitCode := 1; // file was not provided
end.
Die Verwendung der Anwendung ist super einfach: Ihr ruft das Programm einfach mit dem Pfad der auszuführenden Datei als ersten Parameter auf, alle weiteren Parameter werden an die Datei als weitere Parameter übergeben. Im folgenden Beispiel wird z.B. die Kommandozeile mit den Rechten des Administrators aufgerufen, Google angepingt und die Kommandozeile danach offen gehalten. Bitte beachtet, dass der gesamte Aufruf mit allen Parametern für das aufgerufene Dokument in einem Parameter an "runas" übergeben werden muss:
runas /user:Administrator "execute cmd /K ping \"google.de\""