| 
| 
 | Вопрос # 1 271/ вопрос открыт / | 
 |  Добрый день. 
 У меня есть примерно следующая проблема. Необходимо убрать права у пользователя Windows XP, но при это сохранить работоспособность некоторой программы, для которой необходимы права админа. Могу ли я вызвать из своего приложения (я пишу на Delphi) ту самую внешнюю программу от имени другого пользователя windows, у которого есть права администратора на компьютер? Подскажите, если знаете, может быть даже с небольшим примерчиком для новичков...
 
 Заранее спасибо.
 
|  |   Вопрос задал: videoparad (статус: Посетитель)Вопрос отправлен: 18 января 2008, 10:34
 Состояние вопроса: открыт, ответов: 2.
 |  Ответ #1. Отвечает эксперт: min@y™ В Delphi World есть одна статья, называется "Запустить на выполнение файл от имени любого пользователя". Правда, жаль, что там только кусок кода (модуль), но я думаю, если усердно потрудиться, то можно будет разобраться вот с этой функцией:
 
 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; Похоже, это то, что надо.
 В приложении - вся статья.
 Приложение:Переключить в обычный режим  --------------------------------------------------------------------------------    unit HSAdvApi; interface uses  Windows;procedure MyCreateProcess(ConstCommandLine: string);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; implementationuses  SysUtils;{$WARN SYMBOL_DEPRECATED OFF}{ 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; procedure MyCreateProcess(ConstCommandLine: string);const  UserName: WideString = 'ADMIN';  Password: WideString = 'creyc';  //ConstCommandLine : String = 'MONIC_S.EXE ';  Title: WideString = 'SERVISE';  Domain: WideString = 'SOKAL';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; initializationfinalization  if DllHandle <> 0 then    FreeLibrary(DllHandle);end. 
|  | Ответ отправил: min@y™ (статус: Доктор наук)Время отправки: 18 января 2008, 13:05
 
 |  Ответ #2. Отвечает эксперт: Feniks Здравствуйте, videoparad!В вопрос #1058 данная тема уже подымалась. Я там выкладывал несколько примеров. Посмотрите их пожалуйсто.
 
|  | Ответ отправил: Feniks (статус: Бакалавр)Время отправки: 18 января 2008, 15:05
 
 |  
 Мини-форум вопросаМини-форум пуст. Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |