Текущий архив: 2004.10.24;
Скачать: CL | DM;
ВнизЛокальная сеть Найти похожие ветки
← →
Duka (2004-08-17 09:16) [0]Как получить список рабочих групп?
← →
Rouse_ © (2004-08-17 09:31) [1]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
end;
_GROUP_INFO_0 = record
grpi0_name: LPWSTR;
end;
TGroupInfo0 = _GROUP_INFO_0;
TGrounInfo0Array = array of TGroupInfo0;
function NetGroupEnum(servername: LPCWSTR; level: DWORD; var bufptr: Pointer;
prefmaxlen: DWORD; var entriesread: DWORD; var totalentries: DWORD;
resume_handle: PDWORD): DWORD; stdcall; external "NetApi32.dll";
function NetApiBufferFree(Buffer: Pointer): DWORD; stdcall; external "NetApi32.dll";
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
GroupInfo: Pointer;
entriesread, totalentries: DWORD;
I: integer;
begin
if NetGroupEnum("\\имя компьютера", 0, GroupInfo, DWORD(-1), entriesread, totalentries, nil) = NO_ERROR then
try
Memo1.Lines.Clear;
for I := 0 to entriesread - 1 do
Memo1.Lines.Add(TGrounInfo0Array(@(GroupInfo^))[I].grpi0_name);
finally
NetApiBufferFree(GroupInfo);
end;
end;
end.
← →
Дмитрий Ботвин (2004-08-17 09:54) [2]Можно более универсально, для любого количества рабочих групп
и серверов:
procedure TForm1.FindGroups();
const MaxWG=100;
var
I: integer;
Entries,EnumError,EnumBufferLength: DWORD;
NetName: string;
EnumHandle: THandle;
Network: TNetResource;
EnumBuffer: array[1..MaxWG] of TNetResource;
begin
Groups.Clear;
NetName:="Сеть Microsoft Windows"+#0;
FillChar(Network, SizeOf(Network),0);
with Network do
begin
dwScope := 2;
dwType := 3;
dwDisplayType := 1;
dwUsage := 2;
lpProvider := @NetName[1];
end;
EnumError := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, 0, @Network, EnumHandle);
if EnumError = NO_ERROR then
begin
Entries := MaxWG;
EnumBufferLength := SizeOf(EnumBuffer);
EnumError := WNetEnumResource(EnumHandle, Entries, @EnumBuffer, EnumBufferLength);
if EnumError = NO_ERROR then
for I := 1 to Entries do
begin
Groups.Items.Add(Trim(EnumBuffer[I].lpRemoteName));
StatusBar1.Panels[2].Text:=IntToStr(I);
end;
WNetCloseEnum(EnumHandle);
end;
end;
← →
Дмитрий Ботвин (2004-08-17 10:09) [3]Рука дрогнула и не то стёр. Замени строку:
StatusBar1.Panels[2].Text:=IntToStr(I)
на Application.ProcessMessages;
← →
Rouse_ © (2004-08-17 10:11) [4]> NetName:="Сеть Microsoft Windows"+#0;
Вот так лучше не делать, а получить это значение вот таким образом:function GetProvider:String;
var
Buffer: array [0..255] of Char;
Size: DWORD;
begin
Size := SizeOf(Buffer);
if WNetGetProviderName(WNNC_NET_LANMAN, @Buffer, Size) <> NO_ERROR then
Result := RES_COM_NO
else
Result := String(Buffer);
end;
К примеру у меня это не "Сеть Microsoft Windows" а "Microsoft Windows Network"
← →
Дмитрий Ботвин (2004-08-17 10:16) [5]Согласен, Rouse_ а про параметр WNNC_NET_LANMAN где нарыл???
← →
Rouse_ © (2004-08-17 10:21) [6]> [5] Дмитрий Ботвин (17.08.04 10:16)
MSDN
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wnet/wnet/wnetgetprovidername.asp
там есть строка:
You can find a complete list of network types in the header file Winnetwk.h.
просмотрел его, поискал эти типы опять же на MSDN и вышел на их описание:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/secauthn/security/npgetcaps.asp
:)
← →
Дмитрий Ботвин (2004-08-17 10:29) [7]Век живи - век учись!!!! :-)))
Страницы: 1 вся ветка
Текущий архив: 2004.10.24;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.039 c