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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 1 058

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

Здравствуйте, эксперты! Необходимо что бы программа запускалась под учеткой администратора. подскажите как это сделать

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

Вопрос задал: VajRuzZ (статус: Посетитель)
Вопрос отправлен: 30 октября 2007, 20:05
Состояние вопроса: открыт, ответов: 1.

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

Здравствуйте, VajRuzZ!
Вот Вам несколько примеров в Приложении на данную тему, а так же смежных тем:
Пример №1 - Запуск процесса в контексте другого пользователя.
Пример №2 - Как проверить, имеем ли мы административные привилегии в системе ?
Пример №3 - Изменение привилегий.
Пример №4 - Как вывести список привилегий?
Пример №5 - Проверить запущена ли программа от System account ?
Пример №6 - Получение пользователя и домена, под которым работает текущий процесс.

Приложение:
  1.  
  2.  
  3. uses
  4.  
  5.  
  6. //...
  7.  
  8. procedure TForm1.Button1Click(Sender: TObject);
  9. var
  10. si: STARTUPINFOW;
  11. pif: PROCESS_INFORMATION;
  12. res: Bool;
  13. s: string;
  14. begin
  15. //set StartUpInfoW first
  16. si.cb := SizeOf(startupinfow);
  17. si.dwFlags := STARTF_USESHOWWINDOW;
  18. si.wShowWindow := SW_SHOWDEFAULT;
  19. si.lpReserved := nil;
  20. si.lpDesktop := nil;
  21. si.lpTitle := 'Konsole';
  22. // run CreateProcessWithLogonW...
  23. res := CreateProcessWithLogonW('Security', 'ArViCor', 'test', LOGON_WITH_PROFILE,
  24. 'c:win2kassystem32regedt32.exe', nil
  25. , CREATE_DEFAULT_ERROR_MODE, nil, nil, si, pif);
  26. if booltostr(res) = '0' then
  27. begin
  28.  
  29. //if an error occures, show the error-code
  30. //this code can be 'translated' with 'net helpmsg ' on command-prompt
  31. str(GetLastError, s);
  32. ShowMessage('CreateProcessWithLogonResult: ' + booltostr(res) + #10 +
  33. 'GetLastError: ' + s);
  34. end;
  35. end;
  36.  
  37. //===============================================================
  38.  
  39.  
  40. type
  41. PTOKEN_GROUPS = TOKEN_GROUPS^;
  42.  
  43. function RunningAsAdministrator(): Boolean;
  44. var
  45. SystemSidAuthority: SID_IDENTIFIER_AUTHORITY = SECURITY_NT_AUTHORITY;
  46. psidAdmin: PSID;
  47. ptg: PTOKEN_GROUPS = nil;
  48. htkThread: Integer; { HANDLE }
  49. cbTokenGroups: Longint; { DWORD }
  50. iGroup: Longint; { DWORD }
  51. bAdmin: Boolean;
  52. begin
  53. Result := false;
  54. if not OpenThreadToken(GetCurrentThread(), // get security token
  55. TOKEN_QUERY, FALSE, htkThread) then
  56. if GetLastError() = ERROR_NO_TOKEN then
  57. begin
  58. if not OpenProcessToken(GetCurrentProcess(),
  59. TOKEN_QUERY, htkThread) then
  60. Exit;
  61. end
  62. else
  63. Exit;
  64.  
  65. if GetTokenInformation(htkThread, // get #of groups
  66. TokenGroups, nil, 0, cbTokenGroups) then
  67. Exit;
  68.  
  69. if GetLastError() <> ERROR_INSUFFICIENT_BUFFER then
  70. Exit;
  71.  
  72. ptg := PTOKEN_GROUPS(getmem(cbTokenGroups));
  73. if not Assigned(ptg) then
  74. Exit;
  75.  
  76. if not GetTokenInformation(htkThread, // get groups
  77. TokenGroups, ptg, cbTokenGroups, cbTokenGroups) then
  78. Exit;
  79.  
  80. if not AllocateAndInitializeSid(SystemSidAuthority,
  81. 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS,
  82. 0, 0, 0, 0, 0, 0, psidAdmin) then
  83. Exit;
  84.  
  85. iGroup := 0;
  86. while iGroup < ptg^.GroupCount do // check administrator group
  87. begin
  88. if EqualSid(ptg^.Groups[iGroup].Sid, psidAdmin) then
  89. begin
  90. Result := TRUE;
  91. break;
  92. end;
  93. Inc(iGroup);
  94. end;
  95. FreeSid(psidAdmin);
  96. end;
  97.  
  98. //===============================================================
  99.  
  100.  
  101. {
  102. For some functions you need to get the right privileges
  103. on a Windows NT machine.
  104. (e.g: To shut down or restart windows with ExitWindowsEx or
  105. to change the system time)
  106. The following code provides a procedure to adjust the privileges.
  107. The AdjustTokenPrivileges() function enables or disables privileges
  108. in the specified access token.
  109. }
  110.  
  111. // NT Defined Privileges from winnt.h
  112.  
  113. const
  114. SE_CREATE_TOKEN_NAME = 'SeCreateTokenPrivilege';
  115. SE_ASSIGNPRIMARYTOKEN_NAME = 'SeAssignPrimaryTokenPrivilege';
  116. SE_LOCK_MEMORY_NAME = 'SeLockMemoryPrivilege';
  117. SE_INCREASE_QUOTA_NAME = 'SeIncreaseQuotaPrivilege';
  118. SE_UNSOLICITED_INPUT_NAME = 'SeUnsolicitedInputPrivilege';
  119. SE_MACHINE_ACCOUNT_NAME = 'SeMachineAccountPrivilege';
  120. SE_TCB_NAME = 'SeTcbPrivilege';
  121. SE_SECURITY_NAME = 'SeSecurityPrivilege';
  122. SE_TAKE_OWNERSHIP_NAME = 'SeTakeOwnershipPrivilege';
  123. SE_LOAD_DRIVER_NAME = 'SeLoadDriverPrivilege';
  124. SE_SYSTEM_PROFILE_NAME = 'SeSystemProfilePrivilege';
  125. SE_SYSTEMTIME_NAME = 'SeSystemtimePrivilege';
  126. SE_PROF_SINGLE_PROCESS_NAME = 'SeProfileSingleProcessPrivilege';
  127. SE_INC_BASE_PRIORITY_NAME = 'SeIncreaseBasePriorityPrivilege';
  128. SE_CREATE_PAGEFILE_NAME = 'SeCreatePagefilePrivilege';
  129. SE_CREATE_PERMANENT_NAME = 'SeCreatePermanentPrivilege';
  130. SE_BACKUP_NAME = 'SeBackupPrivilege';
  131. SE_RESTORE_NAME = 'SeRestorePrivilege';
  132. SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
  133. SE_DEBUG_NAME = 'SeDebugPrivilege';
  134. SE_AUDIT_NAME = 'SeAuditPrivilege';
  135. SE_SYSTEM_ENVIRONMENT_NAME = 'SeSystemEnvironmentPrivilege';
  136. SE_CHANGE_NOTIFY_NAME = 'SeChangeNotifyPrivilege';
  137. SE_REMOTE_SHUTDOWN_NAME = 'SeRemoteShutdownPrivilege';
  138. SE_UNDOCK_NAME = 'SeUndockPrivilege';
  139. SE_SYNC_AGENT_NAME = 'SeSyncAgentPrivilege';
  140. SE_ENABLE_DELEGATION_NAME = 'SeEnableDelegationPrivilege';
  141. SE_MANAGE_VOLUME_NAME = 'SeManageVolumePrivilege';
  142.  
  143. // Enables or disables privileges debending on the bEnabled
  144. // Aktiviert oder deaktiviert Privilegien, abhangig von bEnabled
  145.  
  146. function NTSetPrivilege(sPrivilege: string; bEnabled: Boolean): Boolean;
  147. var
  148. hToken: THandle;
  149. TokenPriv: TOKEN_PRIVILEGES;
  150. PrevTokenPriv: TOKEN_PRIVILEGES;
  151. ReturnLength: Cardinal;
  152. begin
  153. Result := True;
  154. // Only for Windows NT/2000/XP and later.
  155. if not (Win32Platform = VER_PLATFORM_WIN32_NT) then Exit;
  156. Result := False;
  157.  
  158. // obtain the processes token
  159. if OpenProcessToken(GetCurrentProcess(),
  160. TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
  161. begin
  162. try
  163. // Get the locally unique identifier (LUID) .
  164. if LookupPrivilegeValue(nil, PChar(sPrivilege),
  165. TokenPriv.Privileges[0].Luid) then
  166. begin
  167. TokenPriv.PrivilegeCount := 1; // one privilege to set
  168.  
  169. case bEnabled of
  170. True: TokenPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
  171. False: TokenPriv.Privileges[0].Attributes := 0;
  172. end;
  173.  
  174. ReturnLength := 0; // replaces a var parameter
  175. PrevTokenPriv := TokenPriv;
  176.  
  177. // enable or disable the privilege
  178.  
  179. AdjustTokenPrivileges(hToken, False, TokenPriv, SizeOf(PrevTokenPriv),
  180. PrevTokenPriv, ReturnLength);
  181. end;
  182. finally
  183. CloseHandle(hToken);
  184. end;
  185. end;
  186. // test the return value of AdjustTokenPrivileges.
  187. Result := GetLastError = ERROR_SUCCESS;
  188. if not Result then
  189. raise Exception.Create(SysErrorMessage(GetLastError));
  190. end;
  191.  
  192. //===============================================================
  193.  
  194.  
  195. procedure TForm1.Button1Click(Sender: TObject);
  196. const
  197. TokenSize = 800; // (SizeOf(Pointer)=4 *200)
  198. var
  199. hToken: THandle;
  200. pTokenInfo: PTOKENPRIVILEGES;
  201. ReturnLen: Cardinal;
  202. i: Integer;
  203. PrivName: PChar;
  204. DisplayName: PChar;
  205. NameSize: Cardinal;
  206. DisplSize: Cardinal;
  207. LangId: Cardinal;
  208. begin
  209. GetMem(pTokenInfo, TokenSize);
  210. if not OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
  211. hToken) then ShowMessage('OpenProcessToken error');
  212. if not GetTokenInformation(hToken, TokenPrivileges, pTokenInfo, TokenSize, ReturnLen) then
  213. ShowMessage('GetTokenInformation error');
  214. GetMem(PrivName, 255);
  215. GetMem(DisplayName, 255);
  216. for i := 0 to pTokenInfo.PrivilegeCount - 1 do
  217. begin
  218. DisplSize := 255;
  219. NameSize := 255;
  220. LookupPrivilegeName(nil, pTokenInfo.Privileges[i].Luid, PrivName, Namesize);
  221. LookupPrivilegeDisplayName(nil, PrivName, DisplayName, DisplSize, LangId);
  222. ListBox1.Items.Add(PrivName +^I + DisplayName);
  223. end;
  224. FreeMem(PrivName);
  225. FreeMem(DisplayName);
  226. FreeMem(pTokenInfo);
  227. end;
  228.  
  229. //===============================================================
  230.  
  231.  
  232. function OnSystemAccount(): Boolean;
  233. const
  234. cnMaxNameLen = 254;
  235. var
  236. sName: string;
  237. dwNameLen: DWORD;
  238. begin
  239. dwNameLen := cnMaxNameLen - 1;
  240. SetLength(sName, cnMaxNameLen);
  241. GetUserName(PChar(sName), dwNameLen);
  242. SetLength(sName, dwNameLen);
  243. if UpperCase(Trim(sName)) = 'SYSTEM' then Result := True
  244. else
  245. Result := False;
  246. end;
  247.  
  248. //===============================================================
  249.  
  250.  
  251.  
  252.  
  253. type
  254. PTOKEN_USER = ^TOKEN_USER;
  255. _TOKEN_USER = record
  256. User : TSidAndAttributes;
  257. end;
  258. TOKEN_USER = _TOKEN_USER;
  259.  
  260. function GetCurrentUserAndDomain (
  261. szUser : PChar; var chUser: DWORD; szDomain :PChar; var chDomain : DWORD
  262. ):Boolean;
  263. var
  264. hToken : THandle;
  265. cbBuf : Cardinal;
  266. ptiUser : PTOKEN_USER;
  267. snu : SID_NAME_USE;
  268. begin
  269. Result:=false;
  270.  
  271. if not OpenThreadToken(GetCurrentThread(),TOKEN_QUERY,true,hToken)
  272. then begin
  273. if GetLastError()< > ERROR_NO_TOKEN then exit;
  274.  
  275. if not OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY,hToken)
  276. then exit;
  277. end;
  278.  
  279.  
  280. if not GetTokenInformation(hToken, TokenUser, nil, 0, cbBuf)
  281. then if GetLastError()< > ERROR_INSUFFICIENT_BUFFER
  282. then begin
  283. CloseHandle(hToken);
  284. exit;
  285. end;
  286.  
  287. if cbBuf = 0 then exit;
  288.  
  289.  
  290. GetMem(ptiUser,cbBuf);
  291.  
  292.  
  293. if GetTokenInformation(hToken,TokenUser,ptiUser,cbBuf,cbBuf)
  294. then begin
  295.  
  296. if LookupAccountSid(nil,ptiUser.User.Sid,szUser,chUser,szDomain,chDomain,snu)
  297. then Result:=true;
  298. end;
  299.  
  300.  
  301. CloseHandle(hToken);
  302. FreeMem(ptiUser);
  303. end;
  304.  
  305.  
  306. var
  307. Domain, User : array [0..50] of Char;
  308. chDomain,chUser : Cardinal;
  309. begin
  310. chDomain:=50;
  311. chUser :=50;
  312. if GetCurrentUserAndDomain(User,chuser,Domain,chDomain)
  313. then ...
  314. end;
  315.  
  316.  
  317.  
  318.  
  319.  


Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 31 октября 2007, 10:56
Оценка за ответ: 5


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

Всего сообщений: 1; последнее сообщение — 31 октября 2007, 11:02; участников в обсуждении: 1.
Feniks

Feniks (статус: Бакалавр), 31 октября 2007, 11:02 [#1]:

Или же можно еще использовать программу в Винде runas.exe, которая и запускает нужную программу от имени другого пользователя.

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

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