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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.08.2008, 09:46   #1
NikLik
Форумчанин
 
Аватар для NikLik
 
Регистрация: 22.11.2007
Сообщений: 224
По умолчанию Учётные записи Windows

Каким образом можно просмотреть имена существующих групп, имена пользователей по группам(а также имена всех пользователей, не по группам)?
Результаты требуется выводить в TMemo либо подобную вещь.
NikLik вне форума Ответить с цитированием
Старый 20.08.2008, 10:18   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
а также имена всех пользователей, не по группам
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
    {$H+}
  PNetRes = ^TNetRes;
  TNetRes = record
    dwScope : Integer;
    dwType : Integer;
    dwDisplayType : Integer;
    dwUsage : Integer;
    LocalName : string;
    RemoteName : string;
    Comment : string;
    Provider : string;
  end;
   PNetResourceArr=array[0..512] of pNetRes;
  {H-}
 function GetContainerList(ListRoot:PNetResource):TList;
var
  Form1: TForm1;

implementation

{$R *.dfm}


function GetContainerList(ListRoot:PNetResource):TList;
{возвращает список сетевых имён с подуровня ListRoot, каждый
элемент списка TList - это PNetRec, где поле RemoteName определяет
соответственно сетевое имя элемента списка. Если ListRoot=nil, то
возвращается самый верхний уровень типа:
1. Microsoft Windows Network
2. Novell Netware Network
Чтобы получить список доменов сети Microsoft, нужно вызвать эту
функцию второй раз, передав ей в качестве параметра,
соответствующий элемент списка, полученного при первом её вызове.
Чтобы получить список компьютеров домена - вызвать третий раз...}
var
  TempRec : PNetRes;
  Buf : Pointer;
  Count,
  BufSize,
  Res : DWORD;
  lphEnum : THandle;
  p : PNetResourceArr;
  i : SmallInt;
  NetworkList : TList;
begin
  NetworkList := TList.Create;
  Result:=nil;
  BufSize := 8192;
  GetMem(Buf, BufSize);
  try
    Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
    RESOURCEUSAGE_CONTAINER{0}, ListRoot,lphEnum);
    {в результате получаем ссылку lphEnum}
    if Res <> 0 then
      raise Exception(Res);
    Count := $FFFFFFFF; {требуем выдать столько записей в список, сколько есть}
    Res := WNetEnumResource(lphEnum, Count, Buf, BufSize);
    {в буфере Buf - списочек в виде массива указателей на структуры
    типа TNetResourceArr, а в Count - число этих структур}
    if Res = ERROR_NO_MORE_ITEMS then
      Exit;
    if (Res <> 0) then
      raise Exception(Res);
    P := PNetResourceArr(Buf);
    for I := 0 to Count - 1 do
    begin
      // Требуется копирование из буфера, так как он
      // действителен только до следующего вызова функций группы WNet
      New(TempRec);
      TempRec^.dwScope := P^.dwScope;
      TempRec^.dwType := P^.dwType ;
      TempRec^.dwDisplayType := P^.dwDisplayType ;
      TempRec^.dwUsage := P^.dwUsage ;
      {имеются ввиду вот эти указатели}
      TempRec^.LocalName := StrPas(P^.lpLocalName);
      {в смысле - строки PChar}
      TempRec^.RemoteName := StrPas(P^.lpRemoteName);
      TempRec^.Comment := StrPas(P^.lpComment);
      TempRec^.Provider := StrPas(P^.lpProvider);
      NetworkList.Add(TempRec);
      Inc(P);
    end;
    Res := WNetCloseEnum(lphEnum);
    {а следующий вызов - вот он!}
    if Res <> 0 then
      raise Exception(Res);
    Result:=NetWorkList;
  finally
    FreeMem(Buf);
  end;
end;


procedure TForm1.FormCreate(Sender: TObject);
var p:PNetResource;
begin

ListBox1.Items:=GetContainerList(p);
end;

end.
Группы и прочее можно получить той же функой
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.08.2008, 10:33   #3
NikLik
Форумчанин
 
Аватар для NikLik
 
Регистрация: 22.11.2007
Сообщений: 224
По умолчанию

Строка 163 invalid typecast;
Строки 175-185 ошибка Poinbter type recuired;
Строка 231: Incompatible types: 'TListBox' and 'TList'
NikLik вне форума Ответить с цитированием
Старый 20.08.2008, 11:00   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Вот из Delphi World:
Код:
unit Unit1;

interface

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

type
   THostInfo = record
     username: PWideChar;
     logon_domain: PWideChar;
     other_domains: PWideChar;
     logon_server: PWideChar;
   end;

   WKSTA_USER_INFO_0 = packed record
     wkui0_username: PWideChar;
   end;
   PWKSTA_USER_INFO_0 = ^WKSTA_USER_INFO_0;


  TForm1 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
   function NetWkstaUserEnum(servername: PWideChar;
   // Pointer to a string that specifies the DNS or NetBIOS name of the 
  // remote server on which the function is to execute. 
  // If this parameter is nil, the local computer is used. 
  level: DWORD;
   // Level = 0 : Return the names of users currently logged on to the workstation. 
  var bufptr: Pointer;   // Pointer to the buffer that receives the data 
  prefmaxlen: DWORD;
   // Specifies the preferred maximum length of returned data, in bytes. 
  var entriesread: PDWord;
   // Pointer to a value that receives the count of elements actually enumerated. 
  var totalentries: PDWord;  // total number of entries 
  var resumehandle: PDWord)
   // contains a resume handle which is used to continue an existing search 
  : Longint;
   stdcall; external 'netapi32.dll' Name 'NetWkstaUserEnum';


 function EnumNetUsers(HostName: WideString {; Users: TStrings}): THostInfo;
 const
   STR_ERROR_ACCESS_DENIED = 'The user does not have access to the requested information.';
   STR_ERROR_MORE_DATA = 'Specify a large enough buffer to receive all entries.';
   STR_ERROR_INVALID_LEVEL = 'The level parameter is invalid.';
 var
   Info: Pointer;
   ElTotal: PDWord;
   ElCount: PDWord;
   Resume: PDWord;
   Error: Longint;
   // UI : PWKSTA_USER_INFO_0; 
  // i : Integer; 
begin
   Resume := 0;
   NetWkstaUserEnum(PWideChar(HostName),
     1,
     Info,
     0,
     ElCount,
     ElTotal,
     Resume);

   Error := NetWkstaUserEnum(PWideChar(HostName),
     1,
     Info,
     256 * Integer(ElTotal),
     ElCount,
     ElTotal,
     Resume);

   case Error of
     ERROR_ACCESS_DENIED: Result.UserName := STR_ERROR_ACCESS_DENIED;
     ERROR_MORE_DATA: Result.UserName     := STR_ERROR_MORE_DATA;
     ERROR_INVALID_LEVEL: Result.UserName := STR_ERROR_INVALID_LEVEL
       else
         if Info <> nil then
         begin
           Result := THostInfo(info^);
         end
         else
           begin
             Result.UserName      := 'N/A';
             Result.logon_domain  := 'N/A';
             Result.other_domains := 'N/A';
             Result.logon_server  := 'N/A';
           end;
   end;
 end;


procedure TForm1.Button1Click(Sender: TObject);
 var
   HostInfo: THostInfo;
 begin
   // Specify target machine as argument (with or without preceding \\) 
  HostInfo := EnumNetUsers('servernt');
   with HostInfo do
   begin
     ListBox1.Items.Add(username + #13#10+
      logon_domain + #13#10+
      other_domains + #13#10+
      logon_server);
   end;

end;
end.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.08.2008, 12:12   #5
Ozerich
Студент 1 курса
Форумчанин Подтвердите свой е-майл
 
Аватар для Ozerich
 
Регистрация: 27.06.2008
Сообщений: 959
По умолчанию

вот код который получает все учетные записи
Код:
procedure Tform1.GetuserList(list:tstrings);
var
moredata:boolean;
S : TLMWidechar;
error:dword;
readEntries:cardinal;
buffer:pointer;
I:integer;
begin
moredata:=true;
While Moredata do
if Netapi then
begin
    if (Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion < 5) then
    server:='//'+server else server:=server;
    s.Value:=nil;
    try
      CvtToWideChar(server,s);
      error:=NetQueryDisplayInformation(s.Value,1,0,Dword(-1),Dword(-1),readentries,buffer);
      if ((Error = 0) or (Error = ERROR_MORE_DATA)) then begin
        try
        if readentries>0 then
        for i:=0 to readentries-1 do
        list.Add(TNetDisplayUserArray(buffer^)[i].usri1_name);
        MoreData := (Error = ERROR_MORE_DATA);
        finally
        NetApiBufferFree(buffer);
        end;
        end;
    finally
      freemem(s.Value,s.Length);
    end;
end;
end;
C++(STL, QT, WinInet) / DHTML(CSS) / JavaScript / PHP Developer
Ozerich вне форума Ответить с цитированием
Старый 20.08.2008, 12:47   #6
NikLik
Форумчанин
 
Аватар для NikLik
 
Регистрация: 22.11.2007
Сообщений: 224
По умолчанию

Цитата:
Сообщение от Ozerich Посмотреть сообщение
вот код который получает все учетные записи
Хм...куча неизвестных переменных, вероятно, требуется какой-то модуль?
NikLik вне форума Ответить с цитированием
Старый 20.08.2008, 19:09   #7
Ozerich
Студент 1 курса
Форумчанин Подтвердите свой е-майл
 
Аватар для Ozerich
 
Регистрация: 27.06.2008
Сообщений: 959
По умолчанию

Код:
type
  TLMWideChar = record
    Value : PWideChar;
    Length: DWord;
  end;

    PNET_DISPLAY_USER = ^TNET_DISPLAY_USER;
  TNET_DISPLAY_USER = record
    usri1_name : LPWSTR;
    usri1_comment : LPWSTR;
    usri1_flags : DWord;
    usri1_full_name : LPWSTR;
    usri1_user_id : DWord;
    usri1_next_index : DWord;
  end;

function NetQueryDisplayInformation(ServerName: LPCWSTR; Level, Index, EntriesRequested, PrefMaxLen: DWord; var ReturnedCount: DWord; var Buffer: Pointer): dword; stdcall;external 'netapi32.dll' name 'NetQueryDisplayInformation';

function NetApiBufferFree(Buffer: Pointer): dword; stdcall;external 'netapi32.dll' name 'NetApiBufferFree';


TNetDisplayUserArray = array[0..(MaxInt div SizeOf(TNET_DISPLAY_USER))-1] of TNET_DISPLAY_USER;



var
  server:string;


procedure tform1.CvtToWideChar(const S: string; var WS: TLMWideChar);
var s1:string;
begin
if ws.Value<>nil then
Freemem(ws.Value,ws.Length);
s1:=trim(s);
if length(s1)>0 then begin
  ws.Length:=((length(s1)+1)*2);
  getmem(ws.Value,ws.Length);
  stringtowidechar(s1,ws.Value,ws.Length);
end else   begin
  ws.Value:=nil;
  ws.Length:=0;
end;
end;
C++(STL, QT, WinInet) / DHTML(CSS) / JavaScript / PHP Developer
Ozerich вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как загрузить Windows-приложение без Windows alexray Компоненты Delphi 4 30.04.2010 14:38
Работа программы с БД с ограниченной учетной записью пользователя Windows Стас БД в Delphi 3 11.12.2009 14:35
Записи Rio309 Помощь студентам 1 15.03.2008 22:23
Записи Xeon332 Помощь студентам 5 12.01.2008 23:17
удалить из Windows XP sp2 Windows Movie Maker ZOMBIE Софт 1 03.10.2007 08:27