Code:

program getpass;

........

type

...

ListBox: TListBox;

procedure getpasswords;

.......

end;

 

const Count: Integer = 0;

 

function WNetEnumCachedPasswords(lp: lpStr; w: Word; b: Byte; PC: PChar; dw: DWord): Word; stdcall;

 

implementation

 

{$R *.DFM}

 

function WNetEnumCachedPasswords(lp: lpStr; w: Word; b: Byte; PC: PChar; dw: DWord): Word; external mpr name 'WNetEnumCachedPasswords';

type

PWinPassword = ^TWinPassword;

TWinPassword = record

  EntrySize: Word;

  ResourceSize: Word;

  PasswordSize: Word;

  EntryIndex: Byte;

  EntryType: Byte;

  PasswordC: Char;

end;

var

WinPassword: TWinPassword;

 

function AddPassword(WinPassword: PWinPassword; dw: DWord): LongBool; stdcall;

var

Password: String;

PC: Array[0..$FF] of Char;

begin

inc(Count);

 

Move(WinPassword.PasswordC, PC, WinPassword.ResourceSize);

PC[WinPassword.ResourceSize] := #0;

CharToOem(PC, PC);

Password := StrPas(PC);

 

Move(WinPassword.PasswordC, PC, WinPassword.PasswordSize + WinPassword.ResourceSize);

Move(PC[WinPassword.ResourceSize], PC, WinPassword.PasswordSize);

PC[WinPassword.PasswordSize] := #0;

CharToOem(PC, PC);

Password := Password + ': ' + StrPas(PC);

 

Form1.ListBox.Items.Add(Password);

Result := True;

end;

 

procedure tform1.getpasswords;

var error: string;

begin

if WNetEnumCachedPasswords(nil, 0, $FF, @AddPassword, 0) <> 0 then

   begin

     error := 'Can not load passwords: User is not loged on.';

   end

else if Count = 0 then

   error := 'No passwords found...'

end;

 

  

Code:

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;

 

 

GetLocalUserList - возвращает список пользователей (Windows NT, Windows 2000)

 

Наверно так: хотя классов может быть больше

Code:

procedure TForm1.Timer1Timer(Sender: TObject);

{©Drkb v.3}

 

var

Wnd : HWND;

lpClassName: array [0..$FF] of Char;

begin

Wnd := WindowFromPoint(Mouse.CursorPos);

GetClassName (Wnd, lpClassName, $FF);

if ((strpas(lpClassName) = 'TEdit') or (strpas(lpClassName) = 'EDIT')) then

PostMessage (Wnd, EM_SETPASSWORDCHAR, 0, 0);

end;

 

Автор ответа: Baa

 

Здесь проблема: если страница памяти защищена, то её нельзя прочитать таким способом, но можно заменить PasswordChar(пример: поле ввода пароля в удаленном соединении)

 

Автор ответа: Mikel

 

Code:

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;

 

 

Code:

function GetUserFromWindows: string;

var

UserName : string;

UserNameLen : Dword;

begin

UserNameLen := 255;

SetLength(userName, UserNameLen);

if GetUserName(PChar(UserName), UserNameLen) then

   Result := Copy(UserName,1,UserNameLen - 1)

else

   Result := '';

end;

 

 

Code:

unit Unit1;

{©Drkb v.3}

 

interface

 

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;

 

type

TForm1 = class(TForm)

   Button1: TButton;

   procedure Button1Click(Sender: TObject);

private

   { Private declarations }

public

   { Public declarations }

end;

 

LPUSER_INFO_2 = ^USER_INFO_2;

{$EXTERNALSYM LPUSER_INFO_2}

PUSER_INFO_2 = ^USER_INFO_2;

{$EXTERNALSYM PUSER_INFO_2}

_USER_INFO_2 = record

   usri2_name: LPWSTR;

   usri2_password: LPWSTR;

   usri2_password_age: DWORD;

   usri2_priv: DWORD;

   usri2_home_dir: LPWSTR;

   usri2_comment: LPWSTR;

   usri2_flags: DWORD;

   usri2_script_path: LPWSTR;

   usri2_auth_flags: DWORD;

   usri2_full_name: LPWSTR;

   usri2_usr_comment: LPWSTR;

   usri2_parms: LPWSTR;

   usri2_workstations: LPWSTR;

   usri2_last_logon: DWORD;

   usri2_last_logoff: DWORD;

   usri2_acct_expires: DWORD;

   usri2_max_storage: DWORD;

   usri2_units_per_week: DWORD;

   usri2_logon_hours: PBYTE;

   usri2_bad_pw_count: DWORD;

   usri2_num_logons: DWORD;

   usri2_logon_server: LPWSTR;

   usri2_country_code: DWORD;

   usri2_code_page: DWORD;

end;

{$EXTERNALSYM _USER_INFO_2}

USER_INFO_2 = _USER_INFO_2;

{$EXTERNALSYM USER_INFO_2}

TUserInfo2 = USER_INFO_2;

PUserInfo2 = puser_info_2

 

function NetUserAdd(ServerName: LPCWSTR; Level: DWORD;

   Buff: PByte; var Parm_Err: DWORD): DWORD; stdcall;

   external 'netapi32.dll';

 

var

Form1: TForm1;

 

implementation

 

{$R *.dfm}

 

procedure TForm1.Button1Click(Sender: TObject);

const

NERR_Success = 0;

USER_PRIV_USER  = 1;

UF_SCRIPT = $0001;

UF_DONT_EXPIRE_PASSWD = $10000;

var

UserInfo: TUserInfo2;

Parm_Err: DWORD;

begin

ZeroMemory(@UserInfo, SizeOf(TUserInfo2));

UserInfo.usri2_name := 'TestUser';

UserInfo.usri2_password := '123';

UserInfo.usri2_priv := USER_PRIV_USER;

UserInfo.usri2_flags := UF_SCRIPT or UF_DONT_EXPIRE_PASSWD;

if NetUserAdd(nil, 2, @UserInfo, Parm_Err) <> NERR_Success then

   RaiseLastOSError

else

   ShowMessage('Пользователь TestUser с паролем 123 успешно добавлен.');

end;

 

end.

SID-это структура данных переменной длины, которая идентифицирует пользователя, группу, и учетные записи компьютеров.

Каждой учетной записи в сети выдается уникальный идентификатор безопасности при первом создании учетной записи.

 

Часто требуется организовать задержку в выполнении кода, но что бы при этому приложение не зависало, могло реагировать на сообщения Windows, в часности могло перерисовываться..

 Пример получения имени пользователя и домена под которым работает текущий поток или процесс.

 Если вам необходимо получить только имя пользователя - используйте GetUserName. Данный пример можно использовать и для определения - запущен ли процесс

системой или пользователем.  Учетной записи Localsystem соответствует имя пользователя - SYSTEM и домен NT AUTORITY (лучше проверить на практике).

 

 

 

Вывод текста является одной из основных задач, которую приходится решать в программе при организации вывода данных. Речь пойдет о выводе текста с использованием Windows API функций. Данная статья, безусловно не претендует на полноту обзора этой тематики, но о некоторых "подводных камнях" я все же расскажу.

 

Функции, которые позволяют это выполнять, весьма разнообразны, и использовать их, как Вы уже поняли, можно в разных ситуациях и случаях, и собственно говоря, именно Вам и решать, какие использовать. Кроме функций, которые непосредственно выводят текст, также существует внушительный список "подсобных" функций.