|
Вопрос # 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 first
- si.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;
-
- //===============================================================
-
-
- type
- PTOKEN_GROUPS = TOKEN_GROUPS^;
-
- function RunningAsAdministrator(): Boolean;
- var
- SystemSidAuthority: SID_IDENTIFIER_AUTHORITY = SECURITY_NT_AUTHORITY;
- psidAdmin: PSID;
- ptg: PTOKEN_GROUPS = nil;
- htkThread: Integer; { HANDLE }
- cbTokenGroups: Longint; { DWORD }
- iGroup: Longint; { DWORD }
- bAdmin: Boolean;
- begin
- Result := 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 group
- begin
- 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 privileges
- on a Windows NT machine.
- (e.g: To shut down or restart windows with ExitWindowsEx or
- to change the system time)
- The following code provides a procedure to adjust the privileges.
- The AdjustTokenPrivileges() function enables or disables privileges
- in the specified access token.
- }
-
- // NT Defined Privileges from winnt.h
-
- const
- SE_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;
- var
- hToken: THandle;
- TokenPriv: TOKEN_PRIVILEGES;
- PrevTokenPriv: TOKEN_PRIVILEGES;
- ReturnLength: Cardinal;
- begin
- Result := True;
- // Only for Windows NT/2000/XP and later.
- if not (Win32Platform = VER_PLATFORM_WIN32_NT) then Exit;
- Result := False;
-
- // obtain the processes token
- if OpenProcessToken(GetCurrentProcess(),
- TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
- begin
- 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);
- const
- TokenSize = 800; // (SizeOf(Pointer)=4 *200)
- var
- hToken: THandle;
- pTokenInfo: PTOKENPRIVILEGES;
- ReturnLen: Cardinal;
- i: Integer;
- PrivName: PChar;
- DisplayName: PChar;
- NameSize: Cardinal;
- DisplSize: Cardinal;
- LangId: Cardinal;
- begin
- GetMem(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 do
- begin
- 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;
- const
- cnMaxNameLen = 254;
- var
- sName: string;
- dwNameLen: DWORD;
- begin
- dwNameLen := cnMaxNameLen - 1;
- SetLength(sName, cnMaxNameLen);
- GetUserName(PChar(sName), dwNameLen);
- SetLength(sName, dwNameLen);
- if UpperCase(Trim(sName)) = 'SYSTEM' then Result := True
- else
- Result := False;
- end;
-
- //===============================================================
-
-
-
-
- type
- PTOKEN_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;
- var
- hToken : THandle;
- cbBuf : Cardinal;
- ptiUser : PTOKEN_USER;
- snu : SID_NAME_USE;
- begin
- Result:=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;
-
-
- var
- Domain, User : array [0..50] of Char;
- chDomain,chUser : Cardinal;
- begin
- chDomain:=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, которая и запускает нужную программу от имени другого пользователя.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|