Речь сисадмина к девушке, пришедшей регистрироваться на сервере:
- С точки зрения сетевой безопасности вы представляете собой потенциальную дырку.
{
From the MS-DOS prompt, you can enumerate the network
connections (drives) by using the following command:
net use
Programmatically, you would call WNetOpenEnum() to start
the enumeration of connected resources and
WNetEnumResources() to continue the enumeration.
The following sample code enumerates the network connections:
}procedure TForm1.Button1Click(Sender: TObject);
var
i, dwResult: DWORD;
hEnum: THandle;
lpnrDrv: PNETRESOURCE;
s: string;
const
cbBuffer: DWORD = 16384;
cEntries: DWORD = $FFFFFFFF;
begin
dwResult := WNetOpenEnum(RESOURCE_CONNECTED,
RESOURCETYPE_ANY,
0,
nil,
hEnum);
if (dwResult <> NO_ERROR) thenbegin
ShowMessage('Cannot enumerate network drives.');
Exit;
end;
s := '';
repeat
lpnrDrv := PNETRESOURCE(GlobalAlloc(GPTR, cbBuffer));
dwResult := WNetEnumResource(hEnum, cEntries, lpnrDrv, cbBuffer);
if (dwResult = NO_ERROR) thenbegin
s := 'Network drives:'#13#10;
for i := 0 to cEntries - 1 dobeginif lpnrDrv^.lpLocalName <> nilthen
s := s + lpnrDrv^.lpLocalName + #9 + lpnrDrv^.lpRemoteName;
Inc(lpnrDrv);
end;
endelseif dwResult <> ERROR_NO_MORE_ITEMS thenbegin
s := s + 'Cannot complete network drive enumeration';
GlobalFree(HGLOBAL(lpnrDrv));
break;
end;
GlobalFree(HGLOBAL(lpnrDrv));
until (dwResult = ERROR_NO_MORE_ITEMS);
WNetCloseEnum(hEnum);
if s = '' then s := 'No network connections.';
ShowMessage(s);
end;
{***********************************************************************
FindComp Unit from
Fatih Olcer
fatiholcer@altavista.com
***********************************************************************}unit FindComp;
interfaceuses
Windows, Classes;
function FindComputers: DWORD;
var
Computers: TStringList;
implementationuses
SysUtils;
const
MaxEntries = 250;
function FindComputers: DWORD;
var
EnumWorkGroupHandle, EnumComputerHandle: THandle;
EnumError: DWORD;
Network: TNetResource;
WorkGroupEntries, ComputerEntries: DWORD;
EnumWorkGroupBuffer, EnumComputerBuffer: array[1..MaxEntries] of TNetResource;
EnumBufferLength: DWORD;
I, J: DWORD;
begin
Computers.Clear;
FillChar(Network, SizeOf(Network), 0);
with Network dobegin
dwScope := RESOURCE_GLOBALNET;
dwType := RESOURCETYPE_ANY;
dwUsage := RESOURCEUSAGE_CONTAINER;
end;
EnumError := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0,
@Network, EnumWorkGroupHandle);
if EnumError = NO_ERROR thenbegin
WorkGroupEntries := MaxEntries;
EnumBufferLength := SizeOf(EnumWorkGroupBuffer);
EnumError := WNetEnumResource(EnumWorkGroupHandle, WorkGroupEntries,
@EnumWorkGroupBuffer, EnumBufferLength);
if EnumError = NO_ERROR thenbeginfor I := 1 to WorkGroupEntries dobegin
EnumError := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0,
@EnumWorkGroupBuffer[I], EnumComputerHandle);
if EnumError = NO_ERROR thenbegin
ComputerEntries := MaxEntries;
EnumBufferLength := SizeOf(EnumComputerBuffer);
EnumError := WNetEnumResource(EnumComputerHandle, ComputerEntries,
@EnumComputerBuffer, EnumBufferLength);
if EnumError = NO_ERROR thenfor J := 1 to ComputerEntries do
Computers.Add(Copy(EnumComputerBuffer[J].lpRemoteName,
3, Length(EnumComputerBuffer[J].lpRemoteName) - 2));
WNetCloseEnum(EnumComputerHandle);
end;
end;
end;
WNetCloseEnum(EnumWorkGroupHandle);
end;
if EnumError = ERROR_NO_MORE_ITEMS then
EnumError := NO_ERROR;
Result := EnumError;
end;
initialization
Computers := TStringList.Create;
finalization
Computers.Free;
end.
Here is a translation of the provided text into Russian:
Код, который вы предоставили, это комбинация двух процедур:
Button1Click: эта процедура перечисляет сетевые подключения (диски) на системе и отображает их в сообщении.
FindComputers: функция находит компьютеры на сети с помощью функций WNetOpenEnum() и WNetEnumResource(). Она возвращает код ошибки, если перечисление не удалось.
Вот, как можно модифицировать эти процедуры для отображения всех сетевых подключений:
functionFindComputers:DWORD;varEnumWorkGroupHandle,EnumComputerHandle:THandle;EnumError:DWORD;Network:TNetResource;WorkGroupEntries,ComputerEntries:DWORD;EnumWorkGroupBuffer,EnumComputerBuffer:array[1..MaxEntries]ofTNetResource;EnumBufferLength:DWORD;I,J:DWORD;begin// Initialize TStringList for computer namesComputers.Clear;FillChar(Network,SizeOf(Network),0);withNetworkdobegindwScope:=RESOURCE_GLOBALNET;dwType:=RESOURCETYPE_ANY;dwUsage:=RESOURCEUSAGE_CONTAINER;end;EnumError:=WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,0,@Network,EnumWorkGroupHandle);ifEnumError=NO_ERRORthenbeginWorkGroupEntries:=MaxEntries;EnumBufferLength:=SizeOf(EnumWorkGroupBuffer);EnumError:=WNetEnumResource(EnumWorkGroupHandle,WorkGroupEntries,@EnumWorkGroupBuffer,EnumBufferLength);ifEnumError=NO_ERRORthenbeginforI:=1toWorkGroupEntriesdobeginEnumError:=WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,0,@EnumWorkGroupBuffer[I],EnumComputerHandle);ifEnumError=NO_ERRORthenbeginComputerEntries:=MaxEntries;EnumBufferLength:=SizeOf(EnumComputerBuffer);EnumError:=WNetEnumResource(EnumComputerHandle,ComputerEntries,@EnumComputerBuffer,EnumBufferLength);ifEnumError=NO_ERRORthenforJ:=1toComputerEntriesdoComputers.Add(Copy(EnumComputerBuffer[J].lpRemoteName,3,Length(EnumComputerBuffer[J].lpRemoteName)-2));WNetCloseEnum(EnumComputerHandle);end;end;end;WNetCloseEnum(EnumWorkGroupHandle);end;ifEnumError=ERROR_NO_MORE_ITEMSthenEnumError:=NO_ERROR;Result:=EnumError;end;
Эти процедуры можно использовать для отображения всех сетевых подключений и имен компьютеров на системе.
В статье перечислены сетевые соединения, описаны функции и процедуры для программной enumerations network connections в MS-DOS и Windows.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.