|
Вопрос # 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;
-
- implementation
- uses
- 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;
-
- initialization
- finalization
- if DllHandle <> 0 then
- FreeLibrary(DllHandle);
- end.
-
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 18 января 2008, 13:05
|
Ответ #2. Отвечает эксперт: Feniks
Здравствуйте, videoparad!
В вопрос #1058 данная тема уже подымалась. Я там выкладывал несколько примеров. Посмотрите их пожалуйсто.
 |
Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 18 января 2008, 15:05
|
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|