| 
| 
 | Вопрос # 1 058/ вопрос открыт / | 
 |  Здравствуйте, эксперты! Необходимо что бы программа запускалась под учеткой администратора. подскажите как это сделать 
|  |   Вопрос задал: VajRuzZ (статус: Посетитель)Вопрос отправлен: 30 октября 2007, 20:05
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: Feniks Здравствуйте, VajRuzZ!Вот Вам несколько примеров в Приложении на данную тему, а так же смежных тем:
 Пример №1 - Запуск процесса в контексте другого пользователя.
 Пример №2 - Как проверить, имеем ли мы административные привилегии в системе ?
 Пример №3 - Изменение привилегий.
 Пример №4 - Как вывести список привилегий?
 Пример №5 - Проверить запущена ли программа от System account ?
 Пример №6 - Получение пользователя и домена, под которым работает текущий процесс.
 Приложение:Переключить в обычный режим   uses  //... procedure TForm1.Button1Click(Sender: TObject);var si: STARTUPINFOW; pif: PROCESS_INFORMATION; res: Bool;s: string;begin//set StartUpInfoW firstsi.cb := SizeOf(startupinfow);si.dwFlags  := STARTF_USESHOWWINDOW;si.wShowWindow := SW_SHOWDEFAULT;si.lpReserved := nil;si.lpDesktop := nil;si.lpTitle := 'Konsole';// run CreateProcessWithLogonW...res := CreateProcessWithLogonW('Security', 'ArViCor', 'test', LOGON_WITH_PROFILE,   'c:win2kassystem32regedt32.exe', nil   , CREATE_DEFAULT_ERROR_MODE, nil, nil, si, pif);if booltostr(res) = '0' then begin    //if an error occures, show the error-code   //this code can be 'translated' with 'net helpmsg ' on command-prompt   str(GetLastError, s);   ShowMessage('CreateProcessWithLogonResult: ' + booltostr(res) + #10 +     'GetLastError: ' + s);end;end; //===============================================================  typePTOKEN_GROUPS = TOKEN_GROUPS^; function RunningAsAdministrator(): Boolean;varSystemSidAuthority: SID_IDENTIFIER_AUTHORITY = SECURITY_NT_AUTHORITY;psidAdmin: PSID;ptg: PTOKEN_GROUPS = nil;htkThread: Integer; { HANDLE }cbTokenGroups: Longint; { DWORD }iGroup: Longint; { DWORD }bAdmin: Boolean;beginResult := false;if not OpenThreadToken(GetCurrentThread(), // get security token   TOKEN_QUERY, FALSE, htkThread) then   if GetLastError() = ERROR_NO_TOKEN then   begin     if not OpenProcessToken(GetCurrentProcess(),       TOKEN_QUERY, htkThread) then       Exit;   end   else     Exit; if GetTokenInformation(htkThread, // get #of groups   TokenGroups, nil, 0, cbTokenGroups) then   Exit; if GetLastError() <> ERROR_INSUFFICIENT_BUFFER then   Exit; ptg := PTOKEN_GROUPS(getmem(cbTokenGroups));if not Assigned(ptg) then   Exit; if not GetTokenInformation(htkThread, // get groups   TokenGroups, ptg, cbTokenGroups, cbTokenGroups) then   Exit; if not AllocateAndInitializeSid(SystemSidAuthority,   2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS,   0, 0, 0, 0, 0, 0, psidAdmin) then   Exit; iGroup := 0;while iGroup < ptg^.GroupCount do // check administrator groupbegin   if EqualSid(ptg^.Groups[iGroup].Sid, psidAdmin) then   begin     Result := TRUE;     break;   end;   Inc(iGroup);end;FreeSid(psidAdmin);end; //===============================================================  {For some functions you need to get the right privilegeson a Windows NT machine.(e.g: To shut down or restart windows with ExitWindowsEx orto change the system time)The following code provides a procedure to adjust the privileges.The AdjustTokenPrivileges() function enables or disables privilegesin the specified access token.} // NT Defined Privileges from winnt.h constSE_CREATE_TOKEN_NAME = 'SeCreateTokenPrivilege';SE_ASSIGNPRIMARYTOKEN_NAME = 'SeAssignPrimaryTokenPrivilege';SE_LOCK_MEMORY_NAME = 'SeLockMemoryPrivilege';SE_INCREASE_QUOTA_NAME = 'SeIncreaseQuotaPrivilege';SE_UNSOLICITED_INPUT_NAME = 'SeUnsolicitedInputPrivilege';SE_MACHINE_ACCOUNT_NAME = 'SeMachineAccountPrivilege';SE_TCB_NAME = 'SeTcbPrivilege';SE_SECURITY_NAME = 'SeSecurityPrivilege';SE_TAKE_OWNERSHIP_NAME = 'SeTakeOwnershipPrivilege';SE_LOAD_DRIVER_NAME = 'SeLoadDriverPrivilege';SE_SYSTEM_PROFILE_NAME = 'SeSystemProfilePrivilege';SE_SYSTEMTIME_NAME = 'SeSystemtimePrivilege';SE_PROF_SINGLE_PROCESS_NAME = 'SeProfileSingleProcessPrivilege';SE_INC_BASE_PRIORITY_NAME = 'SeIncreaseBasePriorityPrivilege';SE_CREATE_PAGEFILE_NAME = 'SeCreatePagefilePrivilege';SE_CREATE_PERMANENT_NAME = 'SeCreatePermanentPrivilege';SE_BACKUP_NAME = 'SeBackupPrivilege';SE_RESTORE_NAME = 'SeRestorePrivilege';SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';SE_DEBUG_NAME = 'SeDebugPrivilege';SE_AUDIT_NAME = 'SeAuditPrivilege';SE_SYSTEM_ENVIRONMENT_NAME = 'SeSystemEnvironmentPrivilege';SE_CHANGE_NOTIFY_NAME = 'SeChangeNotifyPrivilege';SE_REMOTE_SHUTDOWN_NAME = 'SeRemoteShutdownPrivilege';SE_UNDOCK_NAME = 'SeUndockPrivilege';SE_SYNC_AGENT_NAME = 'SeSyncAgentPrivilege';SE_ENABLE_DELEGATION_NAME = 'SeEnableDelegationPrivilege';SE_MANAGE_VOLUME_NAME = 'SeManageVolumePrivilege'; // Enables or disables privileges debending on the bEnabled// Aktiviert oder deaktiviert Privilegien, abhangig von bEnabled function NTSetPrivilege(sPrivilege: string; bEnabled: Boolean): Boolean;varhToken: THandle;TokenPriv: TOKEN_PRIVILEGES;PrevTokenPriv: TOKEN_PRIVILEGES;ReturnLength: Cardinal;beginResult := True;// Only for Windows NT/2000/XP and later.if not (Win32Platform = VER_PLATFORM_WIN32_NT) then Exit;Result := False; // obtain the processes tokenif OpenProcessToken(GetCurrentProcess(),   TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) thenbegin   try     // Get the locally unique identifier (LUID) .     if LookupPrivilegeValue(nil, PChar(sPrivilege),       TokenPriv.Privileges[0].Luid) then     begin       TokenPriv.PrivilegeCount := 1; // one privilege to set        case bEnabled of         True: TokenPriv.Privileges[0].Attributes  := SE_PRIVILEGE_ENABLED;         False: TokenPriv.Privileges[0].Attributes := 0;       end;        ReturnLength := 0; // replaces a var parameter       PrevTokenPriv := TokenPriv;        // enable or disable the privilege        AdjustTokenPrivileges(hToken, False, TokenPriv, SizeOf(PrevTokenPriv),         PrevTokenPriv, ReturnLength);     end;   finally     CloseHandle(hToken);   end;end;// test the return value of AdjustTokenPrivileges.Result := GetLastError = ERROR_SUCCESS;if not Result then   raise Exception.Create(SysErrorMessage(GetLastError));end; //===============================================================  procedure TForm1.Button1Click(Sender: TObject);constTokenSize = 800; //  (SizeOf(Pointer)=4 *200)varhToken: THandle;pTokenInfo: PTOKENPRIVILEGES;ReturnLen: Cardinal;i: Integer;PrivName: PChar;DisplayName: PChar;NameSize: Cardinal;DisplSize: Cardinal;LangId: Cardinal;beginGetMem(pTokenInfo, TokenSize);if not OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,   hToken) then ShowMessage('OpenProcessToken error');if not GetTokenInformation(hToken, TokenPrivileges, pTokenInfo, TokenSize, ReturnLen) then   ShowMessage('GetTokenInformation error');GetMem(PrivName, 255);GetMem(DisplayName, 255);for i := 0 to pTokenInfo.PrivilegeCount - 1 dobegin   DisplSize := 255;   NameSize  := 255;   LookupPrivilegeName(nil, pTokenInfo.Privileges[i].Luid, PrivName, Namesize);   LookupPrivilegeDisplayName(nil, PrivName, DisplayName, DisplSize, LangId);   ListBox1.Items.Add(PrivName +^I + DisplayName);end;FreeMem(PrivName);FreeMem(DisplayName);FreeMem(pTokenInfo);end; //===============================================================  function OnSystemAccount(): Boolean;constcnMaxNameLen = 254;varsName: string;dwNameLen: DWORD;begindwNameLen := cnMaxNameLen - 1;SetLength(sName, cnMaxNameLen);GetUserName(PChar(sName), dwNameLen);SetLength(sName, dwNameLen);if UpperCase(Trim(sName)) = 'SYSTEM' then Result := True else    Result := False;end; //===============================================================    typePTOKEN_USER = ^TOKEN_USER;_TOKEN_USER = record  User : TSidAndAttributes;end;TOKEN_USER = _TOKEN_USER; function GetCurrentUserAndDomain (     szUser : PChar; var chUser: DWORD; szDomain :PChar; var chDomain : DWORD):Boolean;varhToken : THandle;cbBuf  : Cardinal;ptiUser : PTOKEN_USER;snu    : SID_NAME_USE;beginResult:=false; if not OpenThreadToken(GetCurrentThread(),TOKEN_QUERY,true,hToken)then begin  if GetLastError()< > ERROR_NO_TOKEN then exit;   if not OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY,hToken)   then exit;end;  if not GetTokenInformation(hToken, TokenUser, nil, 0, cbBuf)then if GetLastError()< > ERROR_INSUFFICIENT_BUFFER  then begin   CloseHandle(hToken);    exit;  end; if cbBuf = 0 then exit;  GetMem(ptiUser,cbBuf);  if GetTokenInformation(hToken,TokenUser,ptiUser,cbBuf,cbBuf)then begin   if LookupAccountSid(nil,ptiUser.User.Sid,szUser,chUser,szDomain,chDomain,snu)   then Result:=true;end;  CloseHandle(hToken);FreeMem(ptiUser);end;  varDomain, User : array [0..50] of Char;chDomain,chUser : Cardinal;beginchDomain:=50;chUser :=50;if GetCurrentUserAndDomain(User,chuser,Domain,chDomain)then ...end;      
|  | Ответ отправил: Feniks (статус: Бакалавр)Время отправки: 31 октября 2007, 10:56
 Оценка за ответ: 5
 |  
 Мини-форум вопросаВсего сообщений: 1; последнее сообщение — 31 октября 2007, 11:02; участников в обсуждении: 1. 
|   | Feniks (статус: Бакалавр), 31 октября 2007, 11:02 [#1]:Или же можно еще использовать программу в Винде runas.exe, которая и запускает нужную программу от имени другого пользователя. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |