Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.09.2015, 13:54   #1
garuna
Форумчанин
 
Аватар для garuna
 
Регистрация: 13.04.2013
Сообщений: 180
Вопрос Как получить список учетных записей компьютера?

Добрый день!

Стоит задача - получить список учеток компьютера. Нижеприведенный код хоть и работает, но выводит много лишнего. Например у меня одна учетка на компе "Olga", а он выводит:
Цитата:
Olga
Администратор
Гость
Помогите пожалуйста понять что не так и исправить этот код, чтобы отображались только те учетки, которые показываются на экране во время приветствия при включении компьютера.

Код:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

const
  FILTER_TEMP_DUPLICATE_ACCOUNT       = $0001;
  FILTER_NORMAL_ACCOUNT               = $0002;
  FILTER_PROXY_ACCOUNT                = $0004;
  FILTER_INTERDOMAIN_TRUST_ACCOUNT    = $0008;
  FILTER_WORKSTATION_TRUST_ACCOUNT    = $0010;
  FILTER_SERVER_TRUST_ACCOUNT         = $0020;
  MAX_PREFERRED_LENGTH   = -1;
  NERR_Success           = 0;       // Success

type
  TForm2 = class(TForm)
    memo1: TMemo;
    button1: TButton;
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


type
  TUserAccountType = (
    fltrDuplicate,        // Enumerates local user account data on a domain controller.
    fltrNormal,           // Enumerates global user account data on a computer.
    fltrProxy,            // ???
    fltrInterdomainTrust, // Enumerates domain trust account data on a domain controller.
    fltrWorkstationTrust, // Enumerates workstation or member server account data on a domain controller.
    fltrServerTrust       // Enumerates domain controller account data on a domain controller.
  );
  TUserAccountFilter = set of TUserAccountType;
  USER_INFO_0 = record
    usri0_name : PWideChar;
  end;
   PUSER_INFO_0 = ^USER_INFO_0;
  NetAPIStatus = Integer;

  function NetUserEnum (serverName : PWideChar; level, filter : Integer; var buffer : Pointer; prefmaxlen : Integer; 
    var entriesRead, totalEntries, resumeHandle : Integer) : NetAPIStatus; stdcall;
      function NetApiBufferFree (buffer : Pointer) : NetAPIStatus; stdcall;

var
  Form2: TForm2;
  NIL_HANDLE : Integer = 0;

implementation

{$R *.dfm}

 function NetUserEnum;                   external 'NETAPI32.DLL';
function NetApiBufferFree;              external 'NETAPI32.dLL';

function UserAccountFilterToDWORD (filter : TUserAccountFilter) : DWORD;
begin
  result := 0;
  if fltrDuplicate in filter then result := result or FILTER_TEMP_DUPLICATE_ACCOUNT;
  if fltrNormal in filter then result := result or FILTER_NORMAL_ACCOUNT;
  if fltrProxy in filter then result := result or FILTER_PROXY_ACCOUNT;
  if fltrInterdomainTrust in filter then result := result or FILTER_INTERDOMAIN_TRUST_ACCOUNT;
  if fltrWorkstationTrust in filter then result := result or FILTER_WORKSTATION_TRUST_ACCOUNT;
  if fltrServerTrust in filter then result := result or FILTER_SERVER_TRUST_ACCOUNT
end;

function GetComputerName: string;
var
  buffer: array[0..MAX_COMPUTERNAME_LENGTH + 1] of Char;
  Size: Cardinal;
begin
  Size := MAX_COMPUTERNAME_LENGTH + 1;
  Windows.GetComputerName(@buffer, Size);
  Result := StrPas(buffer);
end;

procedure TForm2.button1Click(Sender: TObject);
var
  wServerName : WideString;
  rv : NetAPIStatus;
  buffer : pointer;
  i, entriesRead, totalEntries : Integer;
  p : PUSER_INFO_0;
begin
  memo1.lines.Clear;
  wServerName:=GetComputerName;
  rv := NetUserEnum (PWideChar (wServerName), 0, UserAccountFilterToDWORD ([fltrNormal]), buffer, MAX_PREFERRED_LENGTH,
                     entriesRead, totalEntries, NIL_HANDLE);
  if rv = NERR_Success then
    try
      p := PUSER_INFO_0 (buffer);
      for i := 0 to entriesRead - 1 do
      begin
        memo1.lines.Add (p^.usri0_name);
        Inc (p)
      end
    finally
      NetAPIBufferFree (buffer)
    end
  else
    ShowMessage('Error');
end;

end.

Последний раз редактировалось Stilet; 18.09.2015 в 14:44.
garuna вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как получить имя компьютера? Адилич Visual C++ 9 09.03.2015 12:04
Скрипт на JScript для массового изменения учетных записей электронной почты в Outlook Express Sauron_zombie Windows 0 28.02.2014 13:09
Как получить уникальный номер компьютера? paravoz1k Общие вопросы Delphi 11 03.08.2011 17:01
Список с заглавным звеном, из текстового файла получить список из записей и по нему уже сделать задание Zigfried Помощь студентам 2 04.10.2010 20:29
Экспорт учетных записей windows server 2003 ru3000 Безопасность, Шифрование 1 27.07.2009 16:30