Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.06;
Скачать: CL | DM;

Вниз

Команда RunAs...   Найти похожие ветки 

 
Bers   (2003-11-28 12:40) [0]

Доброго времени суток!
Уважаемые Мастера, подскажите:
Как программно реализовать команду типа RunAs в проводнике т.е. запустить приложение на машине пользователя с моими (администраторскими) правами?

Заранее благодарен.
С Уважением, Андрей.
ICQ:192538327

P.S.
Это не написание вирусов... чесное слово :)
Нужно для облегчения работы администратору.


 
Игорь Шевченко ©   (2003-11-28 13:54) [1]

unit main;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TfMain = class(TForm)
Button: TButton;
procedure ButtonClick(Sender: TObject);
end;

var
fMain: TfMain;

implementation
uses
HSAdvApi;

{$R *.dfm}

procedure TfMain.ButtonClick(Sender: TObject);
begin
MyCreateProcess();
end;

procedure TfMain.MyCreateProcess;
const
UserName : WideString = "TESTUSER";
Password : WideString = "testuser";
ConstCommandLine : String = "CMD.EXE";
Title : WideString = "Test process";
Domain : WideString = "WORKGROUP";
var
MyStartupInfo : STARTUPINFO;
ProcessInfo : PROCESS_INFORMATION;
CommandLine : array[0..512] of WideChar;
begin
FillChar(MyStartupInfo, SizeOf(MyStartupInfo), 0);
MyStartupInfo.cb := SizeOf(MyStartupInfo);
StringToWideChar(ConstCommandLine, CommandLine,
Sizeof(CommandLine) div SizeOf(WideChar));
MyStartupInfo.lpTitle := PWideChar(Title);
if not CreateProcessWithLogonW (PWideChar(UserName), PWideChar(Domain),
PWideChar(Password), LOGON_WITH_PROFILE, nil,
CommandLine, 0, nil, nil, @MyStartupInfo, @ProcessInfo) then
RaiseLastWin32Error()
else begin
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
end;
end;

end.


И в кладовке лежит программа :)


 
Bers   (2003-11-28 15:10) [2]

Спасибо за подробную подсказку :)
С Уважением, Андрей.


 
Bers   (2003-11-28 16:51) [3]

Еще раз добрый... вечер.
Сделал свой вариант, а функция LogonUser возвращает FALSE и если указываю LOGON32_LOGON_NETWORK и при LOGON32_LOGON_BATCH:

function RunProgramAs(AppName:string):Boolean;
var IDUser:THandle;
// i:LongBool;
si:STARTUPINFO;
pi:PROCESS_INFORMATION;
begin
if NOT LogonUser("testuser","testuser","MYDOMAIN",LOGON32_LOGON_NETWORK,
LOGON32_PROVIDER_DEFAULT,IDUser)
then
begin
MessageBox(0,"ОШИБКА ИНИЦИАЛИЗАЦИИ ПОЛЬЗОВАТЕЛЯ.","ОШИБКА ПРИЛОЖЕНИЯ",MB_OK);
result:=false;
Exit;
end;

ZeroMemory(@si,sizeof(si));
si.cb:=SizeOf(si);

result:=CreateProcessAsUser(IDUser,nil,PChar(AppName),nil,nil,False,0,nil,nil,si,pi);
end;


Если кто знает, подскажите почему?
С Уважением, Андрей.


 
Bers   (2003-11-28 16:55) [4]

ПОПРАВКА: Вторым параметром LogonUser идет домен, а уж третьим пароль. Это я здесь ошибся, а в программе все как надо, тем не менее все равно FALSE.

С Уважением, Андрей.


 
clickmaker ©   (2003-11-28 17:05) [5]

Очевидно, нет прав на соответствующий вход. Попробуй LOGON32_LOGON_SERVICE или LOGON32_LOGON_INTERACTIVE


 
Bers   (2003-11-28 17:19) [6]

Нет дело не в этом в Help-е нарыл что:
The process that calls LogonUser must have the SE_TCB_NAME privilege.
Мой процесс данной привелегии не имеет(проверил), а вот как ее установить...?

С Уважением, Андрей.


 
clickmaker ©   (2003-11-28 17:29) [7]

hToken: THandle;
tkp: TOKEN_PRIVILEGES;
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken);
LookupPrivilegeValue(nil, SE_TCB_NAME, tkp.Privileges[0].Luid);
tkp.PrivilegeCount := 1;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, false, tkp, 0, nil, 0);


 
Bers   (2003-11-28 18:09) [8]

А почему на строку:
AdjustTokenPrivileges(hToken, false, tkp, 0, nil, 0);
она при компиляции ругается:
[Error] myclass.pas(158): There is no overloaded version of "AdjustTokenPrivileges" that can be called with these arguments

С Уважением, Андрей.


 
Reindeer Moss Eater ©   (2003-11-28 18:17) [9]

потому что перечень аргументов не тот что надо


 
Игорь Шевченко ©   (2003-11-28 20:26) [10]

clickmaker © (28.11.03 17:29)

Ну-ну. Посмотрел бы я на того "не администратора", который имеет привилегию SE_TCB_NAME ;)


 
clickmaker ©   (2003-11-29 00:34) [11]


> Игорь Шевченко © (28.11.03 20:26) [10]

Наше дело предложить... ;)


 
Bers   (2003-12-02 11:53) [12]

Доброго времени суток.
> Игорь Шевченко
Ну-ну. Посмотрел бы я на того "не администратора", который имеет привилегию SE_TCB_NAME ;)

Если я правильно понял (из help-ов и данной ветки форума), то функция LookupPrivilegeValue ищет привелегию у текущего пользователя, а т.к. это системная привелегия, то у обычного пользователя её быть не может? А как следствие не будет работать LogonUser... и как тогда быть?

> И в кладовке лежит программа :)
Я ее что-то не нашел... можно ссылочку?

С Уважением, Андрей.


 
Игорь Шевченко ©   (2003-12-02 16:45) [13]

Bers (02.12.03 11:53)

А не надо LogonUser, надо CreateProcessWithLogonW


 
Bers   (2003-12-03 12:43) [14]

Еще раз здравствуйте!

>>Игорь Шевченко ©
>>А не надо LogonUser, надо CreateProcessWithLogonW


Если я правильно понял, то функция CreateProcessWithLogonW из модуля HSAdvApi, а где его взять? У себя на винте я его не нашел...

С Уважением, Андрей.


 
Игорь Шевченко ©   (2003-12-03 13:24) [15]

unit HSAdvApi;

interface
uses
Windows;

function CreateProcessWithLogonW (const lpUsername : PWideChar;
const lpDomain : PWideChar; const lpPassword : PWideChar;
dwLogonFlags : DWORD; const lpApplicationName : PWideChar;
lpCommandLine : PWideChar; dwCreationFlags : DWORD;
lpEnvironment : Pointer; const lpCurrentDirectory : PWideChar;
lpStartupInfo : PStartupInfo;
lpProcessInfo : PProcessInformation) : Boolean; stdcall;

const
LOGON_WITH_PROFILE = $00000001;
LOGON_NETCREDENTIALS_ONLY = $00000002;
LOGON_ZERO_PASSWORD_BUFFER = $80000000;

implementation
uses
SysUtils;

{ ADVAPI32.DLL functions }
type
TCreateProcessWithLogonW =
function (const lpUsername : PWideChar;
const lpDomain : PWideChar; const lpPassword : PWideChar;
dwLogonFlags : DWORD; const lpApplicationName : PWideChar;
lpCommandLine : PWideChar; dwCreationFlags : DWORD;
lpEnvironment : Pointer; const lpCurrentDirectory : PWideChar;
lpStartupInfo : PStartupInfo;
lpProcessInfo : PProcessInformation) : Boolean; stdcall;

const
DllName = "advapi32.dll";

var
DllHandle : THandle;
_CreateProcessWithLogonW : TCreateProcessWithLogonW;

function InitLib : Boolean;
begin
if DllHandle = 0 then
if Win32Platform = VER_PLATFORM_WIN32_NT then begin
DllHandle := LoadLibrary(DllName);
if DllHandle <> 0 then begin
@_CreateProcessWithLogonW := GetProcAddress(DllHandle,
"CreateProcessWithLogonW");
end;
end;
Result := (DllHandle <> 0);
end;

function NotImplementedBool : Boolean;
begin
SetLastError (ERROR_CALL_NOT_IMPLEMENTED);
Result := false;
end;

function CreateProcessWithLogonW (const lpUsername : PWideChar;
const lpDomain : PWideChar; const lpPassword : PWideChar;
dwLogonFlags : DWORD; const lpApplicationName : PWideChar;
lpCommandLine : PWideChar; dwCreationFlags : DWORD;
lpEnvironment : Pointer; const lpCurrentDirectory : PWideChar;
lpStartupInfo : PStartupInfo;
lpProcessInfo : PProcessInformation) : Boolean; stdcall;
begin
if InitLib and Assigned(_CreateProcessWithLogonW) then
Result := _CreateProcessWithLogonW(lpUsername, lpDomain, lpPassword,
dwLogonFlags, lpApplicationName, lpCommandLine, dwCreationFlags,
lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInfo)
else
Result := NotImplementedBool;
end;

initialization
finalization
if DllHandle <> 0 then
FreeLibrary(DllHandle);
end.


 
Bers   (2003-12-03 14:05) [16]

Спасибо!
С Уважением, Андрей.



Страницы: 1 вся ветка

Текущий архив: 2004.02.06;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.029 c
1-16349
Vitalik
2004-01-24 15:59
2004.02.06
Классы


3-16128
Karlson
2004-01-15 15:37
2004.02.06
значения Null


1-16484
Oleg
2004-01-27 16:13
2004.02.06
Сохранение рисунков в dll


4-16795
A.M.D.F.
2003-11-29 18:14
2004.02.06
Недра NTFS


7-16765
Zheks
2003-11-17 11:18
2004.02.06
Есть ли компонент для программирования портов?