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

Вниз

запуск программы от имени другого пользователя   Найти похожие ветки 

 
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 вся ветка

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

Наверх





Память: 0.48 MB
Время: 0.051 c
14-1099551491
SPeller
2004-11-04 09:58
2004.11.21
Проблема с диспетчером задач


1-1099462739
hgd
2004-11-03 09:18
2004.11.21
Как можно зашить в программу dll?


14-1099555858
bizonwar
2004-11-04 11:10
2004.11.21
Статья "Программирование математических приложений"


3-1098178436
mavor
2004-10-19 13:33
2004.11.21
Поиск в базе


3-1098259269
NewDelpher
2004-10-20 12:01
2004.11.21
Автоматическое создание пустой базы данных





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский