Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 271

/ вопрос открыт /

Добрый день.

У меня есть примерно следующая проблема. Необходимо убрать права у пользователя Windows XP, но при это сохранить работоспособность некоторой программы, для которой необходимы права админа. Могу ли я вызвать из своего приложения (я пишу на Delphi) ту самую внешнюю программу от имени другого пользователя windows, у которого есть права администратора на компьютер? Подскажите, если знаете, может быть даже с небольшим примерчиком для новичков...

Заранее спасибо.

videoparad Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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;

Похоже, это то, что надо.
В приложении - вся статья.

Приложение:
  1.  
  2. --------------------------------------------------------------------------------
  3.  
  4.  
  5.  
  6.  
  7. unit HSAdvApi;
  8.  
  9. interface
  10.  
  11. uses
  12. Windows;
  13. procedure MyCreateProcess(ConstCommandLine: string);
  14. function CreateProcessWithLogonW(const lpUsername: PWideChar;
  15. const lpDomain: PWideChar; const lpPassword: PWideChar;
  16. dwLogonFlags: DWORD; const lpApplicationName: PWideChar;
  17. lpCommandLine: PWideChar; dwCreationFlags: DWORD;
  18. lpEnvironment: Pointer; const lpCurrentDirectory: PWideChar;
  19. lpStartupInfo: PStartupInfo;
  20. lpProcessInfo: PProcessInformation): Boolean; stdcall;
  21.  
  22. const
  23. LOGON_WITH_PROFILE = $00000001;
  24. LOGON_NETCREDENTIALS_ONLY = $00000002;
  25. LOGON_ZERO_PASSWORD_BUFFER = $80000000;
  26.  
  27. implementation
  28. uses
  29. SysUtils;
  30. {$WARN SYMBOL_DEPRECATED OFF}
  31. { ADVAPI32.DLL functions }
  32. type
  33. TCreateProcessWithLogonW =
  34. function(const lpUsername: PWideChar;
  35. const lpDomain: PWideChar; const lpPassword: PWideChar;
  36. dwLogonFlags: DWORD; const lpApplicationName: PWideChar;
  37. lpCommandLine: PWideChar; dwCreationFlags: DWORD;
  38. lpEnvironment: Pointer; const lpCurrentDirectory: PWideChar;
  39. lpStartupInfo: PStartupInfo;
  40. lpProcessInfo: PProcessInformation): Boolean; stdcall;
  41.  
  42. const
  43. DllName = 'advapi32.dll';
  44.  
  45. var
  46. DllHandle: THandle;
  47. _CreateProcessWithLogonW: TCreateProcessWithLogonW;
  48.  
  49. function InitLib: Boolean;
  50. begin
  51. if DllHandle = 0 then
  52. if Win32Platform = VER_PLATFORM_WIN32_NT then
  53. begin
  54. DllHandle := LoadLibrary(DllName);
  55. if DllHandle <> 0 then
  56. begin
  57. @_CreateProcessWithLogonW := GetProcAddress(DllHandle,
  58. 'CreateProcessWithLogonW');
  59. end;
  60. end;
  61. Result := (DllHandle <> 0);
  62. end;
  63.  
  64. function NotImplementedBool: Boolean;
  65. begin
  66. SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
  67. Result := false;
  68. end;
  69.  
  70. function CreateProcessWithLogonW(const lpUsername: PWideChar;
  71. const lpDomain: PWideChar; const lpPassword: PWideChar;
  72. dwLogonFlags: DWORD; const lpApplicationName: PWideChar;
  73. lpCommandLine: PWideChar; dwCreationFlags: DWORD;
  74. lpEnvironment: Pointer; const lpCurrentDirectory: PWideChar;
  75. lpStartupInfo: PStartupInfo;
  76. lpProcessInfo: PProcessInformation): Boolean; stdcall;
  77. begin
  78. if InitLib and Assigned(_CreateProcessWithLogonW) then
  79. Result := _CreateProcessWithLogonW(lpUsername, lpDomain, lpPassword,
  80. dwLogonFlags, lpApplicationName, lpCommandLine, dwCreationFlags,
  81. lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInfo)
  82. else
  83. Result := NotImplementedBool;
  84. end;
  85.  
  86. procedure MyCreateProcess(ConstCommandLine: string);
  87. const
  88. UserName: WideString = 'ADMIN';
  89. Password: WideString = 'creyc';
  90. //ConstCommandLine : String = 'MONIC_S.EXE ';
  91. Title: WideString = 'SERVISE';
  92. Domain: WideString = 'SOKAL';
  93. var
  94. MyStartupInfo: STARTUPINFO;
  95. ProcessInfo: PROCESS_INFORMATION;
  96. CommandLine: array[0..512] of WideChar;
  97. begin
  98. FillChar(MyStartupInfo, SizeOf(MyStartupInfo), 0);
  99. MyStartupInfo.cb := SizeOf(MyStartupInfo);
  100. StringToWideChar(ConstCommandLine, CommandLine,
  101. Sizeof(CommandLine) div SizeOf(WideChar));
  102. MyStartupInfo.lpTitle := PWideChar(Title);
  103. if not CreateProcessWithLogonW(PWideChar(UserName), PWideChar(Domain),
  104. PWideChar(Password), LOGON_WITH_PROFILE, nil,
  105. CommandLine, 0, nil, nil, @MyStartupInfo, @ProcessInfo) then
  106. RaiseLastWin32Error()
  107. else
  108. begin
  109. CloseHandle(ProcessInfo.hProcess);
  110. CloseHandle(ProcessInfo.hThread);
  111. end;
  112. end;
  113.  
  114. initialization
  115. finalization
  116. if DllHandle <> 0 then
  117. FreeLibrary(DllHandle);
  118. end.
  119.  


Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 18 января 2008, 13:05

Ответ #2. Отвечает эксперт: Feniks

Здравствуйте, videoparad!
В вопрос #1058 данная тема уже подымалась. Я там выкладывал несколько примеров. Посмотрите их пожалуйсто.

Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 18 января 2008, 15:05


Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:53
Выполнено за 0.03 сек.