Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.02.06;
Скачать: [xml.tar.bz2];

Вниз

Команда 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.02.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.031 c
14-16745
Rauf
2004-01-15 23:01
2004.02.06
Что за процесс cisvc.exe???


1-16482
X-file_
2004-01-22 07:03
2004.02.06
надстройки Word


3-16196
jack128
2004-01-13 13:39
2004.02.06
Пример работы с курсором


1-16214
Stalker13
2004-01-28 19:57
2004.02.06
Динамич. массивы


14-16673
blackwbeer
2004-01-17 17:12
2004.02.06
Как отчистить ВОСК с одежды?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский