WinXP i hasło administratora

0

Jak wywołać przy starcie programu w winXP okno logowania?
chodzi mi o to że niektóre programy pod winXP wymagają hasła administratora, i ja bym chciał wywołać właśnie takie okienko logowania.

0

Prawym na plik *.exe, a następnie "uruchom jako"...

0

nie o to mi biega...
Ja chce żeby mojego programu mugł używać tylko administrator komputera.

0

no to ustaw mu atrybuty! nie wiem po co kombinować w kodzie programu..

0

W BcComps unit BcNT jest funkcja IsAdministrator: Boolean//active user
Można jej używać bo jest to opensource:

unit BcNT;

interface

uses Windows;

{ Parts from "Windows Types API interface Unit for Object Pascal". Obtain full
headers from http://delphi-jedi.org. }

const
SE_PRIVILEGE_ENABLED_BY_DEFAULT = ($00000001);
{$EXTERNALSYM SE_PRIVILEGE_ENABLED_BY_DEFAULT}
SE_PRIVILEGE_ENABLED = ($00000002);
{$EXTERNALSYM SE_PRIVILEGE_ENABLED}
SE_PRIVILEGE_USED_FOR_ACCESS = DWORD($80000000);
{$EXTERNALSYM SE_PRIVILEGE_USED_FOR_ACCESS}

PRIVILEGE_SET_ALL_NECESSARY = (1);
{$EXTERNALSYM PRIVILEGE_SET_ALL_NECESSARY}

type
PPRIVILEGE_SET = ^PRIVILEGE_SET;
{$EXTERNALSYM PPRIVILEGE_SET}
_PRIVILEGE_SET = record
PrivilegeCount: DWORD;
Control: DWORD;
Privilege: array [0..0] of LUID_AND_ATTRIBUTES;
end;
{$EXTERNALSYM _PRIVILEGE_SET}
PRIVILEGE_SET = _PRIVILEGE_SET;
{$EXTERNALSYM PRIVILEGE_SET}
TPrivilegeSet = PRIVILEGE_SET;
PPrivilegeSet = PPRIVILEGE_SET;

const
SE_CREATE_TOKEN_NAME = 'SeCreateTokenPrivilege';
{$EXTERNALSYM SE_CREATE_TOKEN_NAME}
SE_ASSIGNPRIMARYTOKEN_NAME = 'SeAssignPrimaryTokenPrivilege';
{$EXTERNALSYM SE_ASSIGNPRIMARYTOKEN_NAME}
SE_LOCK_MEMORY_NAME = 'SeLockMemoryPrivilege';
{$EXTERNALSYM SE_LOCK_MEMORY_NAME}
SE_INCREASE_QUOTA_NAME = 'SeIncreaseQuotaPrivilege';
{$EXTERNALSYM SE_INCREASE_QUOTA_NAME}
SE_UNSOLICITED_INPUT_NAME = 'SeUnsolicitedInputPrivilege';
{$EXTERNALSYM SE_UNSOLICITED_INPUT_NAME}
SE_MACHINE_ACCOUNT_NAME = 'SeMachineAccountPrivilege';
{$EXTERNALSYM SE_MACHINE_ACCOUNT_NAME}
SE_TCB_NAME = 'SeTcbPrivilege';
{$EXTERNALSYM SE_TCB_NAME}
SE_SECURITY_NAME = 'SeSecurityPrivilege';
{$EXTERNALSYM SE_SECURITY_NAME}
SE_TAKE_OWNERSHIP_NAME = 'SeTakeOwnershipPrivilege';
{$EXTERNALSYM SE_TAKE_OWNERSHIP_NAME}
SE_LOAD_DRIVER_NAME = 'SeLoadDriverPrivilege';
{$EXTERNALSYM SE_LOAD_DRIVER_NAME}
SE_SYSTEM_PROFILE_NAME = 'SeSystemProfilePrivilege';
{$EXTERNALSYM SE_SYSTEM_PROFILE_NAME}
SE_SYSTEMTIME_NAME = 'SeSystemtimePrivilege';
{$EXTERNALSYM SE_SYSTEMTIME_NAME}
SE_PROF_SINGLE_PROCESS_NAME = 'SeProfileSingleProcessPrivilege';
{$EXTERNALSYM SE_PROF_SINGLE_PROCESS_NAME}
SE_INC_BASE_PRIORITY_NAME = 'SeIncreaseBasePriorityPrivilege';
{$EXTERNALSYM SE_INC_BASE_PRIORITY_NAME}
SE_CREATE_PAGEFILE_NAME = 'SeCreatePagefilePrivilege';
{$EXTERNALSYM SE_CREATE_PAGEFILE_NAME}
SE_CREATE_PERMANENT_NAME = 'SeCreatePermanentPrivilege';
{$EXTERNALSYM SE_CREATE_PERMANENT_NAME}
SE_BACKUP_NAME = 'SeBackupPrivilege';
{$EXTERNALSYM SE_BACKUP_NAME}
SE_RESTORE_NAME = 'SeRestorePrivilege';
{$EXTERNALSYM SE_RESTORE_NAME}
SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
{$EXTERNALSYM SE_SHUTDOWN_NAME}
SE_DEBUG_NAME = 'SeDebugPrivilege';
{$EXTERNALSYM SE_DEBUG_NAME}
SE_AUDIT_NAME = 'SeAuditPrivilege';
{$EXTERNALSYM SE_AUDIT_NAME}
SE_SYSTEM_ENVIRONMENT_NAME = 'SeSystemEnvironmentPrivilege';
{$EXTERNALSYM SE_SYSTEM_ENVIRONMENT_NAME}
SE_CHANGE_NOTIFY_NAME = 'SeChangeNotifyPrivilege';
{$EXTERNALSYM SE_CHANGE_NOTIFY_NAME}
SE_REMOTE_SHUTDOWN_NAME = 'SeRemoteShutdownPrivilege';
{$EXTERNALSYM SE_REMOTE_SHUTDOWN_NAME}
SE_UNDOCK_NAME = 'SeUndockPrivilege';
{$EXTERNALSYM SE_UNDOCK_NAME}
SE_SYNC_AGENT_NAME = 'SeSyncAgentPrivilege';
{$EXTERNALSYM SE_SYNC_AGENT_NAME}
SE_ENABLE_DELEGATION_NAME = 'SeEnableDelegationPrivilege';
{$EXTERNALSYM SE_ENABLE_DELEGATION_NAME}

function IsNT: Boolean;
function IsAdministratorUser: Boolean;

implementation

uses SysUtils;

function IsNT: Boolean;
begin
Result := (Win32Platform = VER_PLATFORM_WIN32_NT);
end;

function IsAdministratorUser: Boolean;
const
SECURITY_NT_AUTHORITY: SID_IDENTIFIER_AUTHORITY = (Value: (0,0,0,0,0,5)); // ntifs
SECURITY_BUILTIN_DOMAIN_RID: DWORD = $00000020;
DOMAIN_ALIAS_RID_ADMINS: DWORD = $00000220;
DOMAIN_ALIAS_RID_USERS : DWORD = $00000221;
DOMAIN_ALIAS_RID_GUESTS: DWORD = $00000222;
DOMAIN_ALIAS_RID_POWER_: DWORD = $00000223;
var
hAccessToken: THandle;
ptgGroups: PTokenGroups;
dwInfoBufferSize: Cardinal;
psidAdministrators: PSID;
I: integer;
bResult: Boolean;
begin
if not IsNT then
begin
Result := True;
Exit;
end;

Result := False;

bResult := OpenThreadToken(GetCurrentThread, TOKEN_QUERY, True, hAccessToken);
if not bResult then
if GetLastError = ERROR_NO_TOKEN then
bResult := OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, hAccessToken);

if bResult then
begin
GetMem(ptgGroups, 1024);
try
bResult := GetTokenInformation(hAccessToken, TokenGroups, ptgGroups, 1024, dwInfoBufferSize);
CloseHandle(hAccessToken);

  if bResult then
  begin
    AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2, SECURITY_BUILTIN_DOMAIN_RID,
      DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, psidAdministrators);

   { Disable range checking for this block because of the special array[0..0] .. }

{$IFOPT D+}
{$R-}
{$ENDIF}
for I := 0 to ptgGroups.GroupCount - 1 do
if EqualSid(psidAdministrators, ptgGroups.Groups[I].Sid) then
begin
Result := True;
Break;
end;
{$IFOPT D+}
{$R+}
{$ENDIF}
FreeSid(psidAdministrators);
end;
finally
FreeMem(ptgGroups);
end;
end;
end;

end.

To [b]NIE[/b] jest mój kodzik, ale sprawdzony i działa

0

!!!
Dzięki Johny_Bit.

1 użytkowników online, w tym zalogowanych: 0, gości: 1