Текущий архив: 2004.11.21;
Скачать: CL | DM;
Вниззапуск программы от имени другого пользователя Найти похожие ветки
← →
atom © (2004-10-13 09:05) [0]Доброго времени суток.
Как можно запустить приложение от имени другого пользователя (программа меняем реестр) если известны логин и пароль?
← →
Дмитрий Ботвин (2004-10-13 09:07) [1]RunAs /?
← →
atom © (2004-10-13 09:21) [2]В этом случае он спросит пароль, а надо чтобы программа выполнялась незаметно (чтобы ничего не надобыло вводить)
← →
Cobalt © (2004-10-13 09:35) [3]CreateProcessAsUser+F1+поиск по форуму WinAPI
← →
BiN © (2004-10-13 10:20) [4]Cobalt © (13.10.04 09:35) [3]
в дополнение:
Для этого нужна TCB-привилегии - кот. по-хорошему дается только процессам системной учетной записи (например сервисам, winlogon-у и некот. др.). Другими словами запустить процесс от лица произвольного пользователя могут только системные приложения.
Также существует функция CreateProcessWithLogonW, которая передает параметры создания процесса службе Runas. Если вышеуказ. служба остановлена, функция вернет ошибку.
Эту функцию и использует программа (не служба) Runas из поста [1]
← →
Karbazol (2004-10-13 10:34) [5]LogonUser + ImpersonateLoggedOnUser + CreateProcess + RevertToSelf
Как сказано в SDK, в таком случае никаких особых привелегий не требуется.
← →
BiN © (2004-10-13 10:38) [6]Karbazol (13.10.04 10:34) [5]
LogonUser + ImpersonateLoggedOnUser + CreateProcess + RevertToSelf
Как сказано в SDK, в таком случае никаких особых привелегий не требуется.
Ой ли? так прям и сказано?
Выдержка из описания функции LogonUser (секция Renark):
In Windows 2000, the process calling LogonUser requires the SE_TCB_NAME privilege. The privilege does not need to be enabled. The LogonUser function enables the privilege as necessary. If the calling process does not have this privilege, LogonUser fails and GetLastError returns ERROR_PRIVILEGE_NOT_HELD. Beginning with Windows XP, this privilege is no longer required.
← →
BiN © (2004-10-13 10:39) [7]да в XP эта привилегия уже не нужно, но вот в W2k, а именно эту ОС указал автор ветки, без нее работать LogonUser не будет
← →
Дмитрий Ботвин (2004-10-13 10:39) [8]Karbazol, ты не прав! Для выполнения LogonUser + ImpersonateLoggedOnUser + CreateProcess + RevertToSelf требуется
право "Работа в режиме операционной системы", которое по-умолчанию не стоит даже у администратора. Его надо вручную ставить. Это я знаю точно, потому что у меня самого есть прога,
которая выполняет эти действия. И в Win2k мне пришлось дать самому себе это право вручную. А так всё верно это тоже вариант!
← →
Игорь Шевченко © (2004-10-13 10:42) [9]
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.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.
← →
Karbazol (2004-10-13 10:54) [10]Упс. Действительно, для W2K эта привилегия нужна, но она есть не только у SYSTEM, но и у администраторов.
Так что, если ось - ХР или если текущий пользователь - админ, или процесс запущен как сервис, под учетной записью Local System, то все сработает.
Страницы: 1 вся ветка
Текущий архив: 2004.11.21;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.04 c