Örnek programın ekran görüntüsü Dört yıl kadar önce üzerinde bazı değişiklikler yaptığım ağ paylaşımlarını listeleyen bir kod. Tüm işletim sistemlerinde düzgünce çalışıyor. Bunu özellikle söyledim çünkü bu kod 98 den XP ye geçişte oldukça zamanımı aldı, o zamanlarda delphi ile daha yeni çalışmaya başlamıştım. 98 den XP ye geçişte kodda bazı değişiklikller yapmak gerekti.

XP tasarımında windows ağ ağacına “Microfost Terminal Hizmetleri”, “Web Cliet Network” bileşenlerinin bulunduğu yeni bir düğüm eklenmiş. (Bakınız Şekil:A)

Windows ağı
Bu düğümün yerinde daha önceden (95 ve 98 de) “çalışma ağı” yer alıyordu. Eski kodun bundan haberi olmadığı için istenen sonucu verememesi şaşırtıcı değil :) Sözünü ettiğim değişiklikler yukarıdaki resimde kırmızı ile işaretlenmiş düğümle ilgili. Kaynak koda işletim sistemini tespit eden bir prosedür ve ayrıca fazladan bir düğüm daha derine inmesini sağlayan bir döngü yerleştirdim. Kaynak kodun son durumu şöyle:

function GetOSType:string;
var
OSVersion: TOSVersionInfo;
FPlatformID: DWord;
begin
OSVersion.dwOSVersionInfoSize := SizeOf(OSVersion);

if GetVersionEx(OSVersion) then
begin
result := Format(‘%d.%d (%d.%s)‘,[OSVersion.dwMajorVersion, OSVersion.dwMinorVersion,
(OSVersion.dwBuildNumber and $FFFF), OSVersion.szCSDVersion]);
FPlatformID:= OSVersion.dwPlatformID;
case OSVersion.dwPlatformID of
VER_PLATFORM_WIN32s: result := ‘Windows 3.1‘;
VER_PLATFORM_WIN32_WINDOWS: result := ‘Windows 95‘;
VER_PLATFORM_WIN32_NT: result := ‘Windows NT‘;
else result := ‘Bilinmiyor‘;
end;
end;
end;

function GetNetbios:TStringList;

function GetWinNet: String;
var Registry: TRegistry;
begin
Registry:=TRegistry.Create;
Registry.RootKey:=HKEY_LOCAL_MACHINE;
Registry.OpenKey(‘SYSTEM\ControlSet001\Services\lanmanworkstation\NetworkProvider‘,True);
result := Registry.ReadString(‘Name‘);
Registry.Free;
end;

label
SkipExtraNode;
const
MaxEntries = 1024;
var
EnumError: DWORD;
Network, Network2: TNetResource;
NetworkEntries,WorkGroupEntries,ComputerEntries,ShareEntries: DWORD;
NetworkBufferLength, ExtraBufferLength, ComputerBufferLength, ShareBufferLength: DWORD;
EnumNetworkBuffer, EnumWorkGroupBuffer, EnumComputerBuffer, EnumShareBuffer: array[1..MaxEntries] of
TNetResource;
EnumNetworkHandle, EnumExtraHandle, EnumWorkGroupHandle, EnumComputerHandle: THandle;
N, W, C, S: Integer;
TmpList: TStringList;
notNT: Boolean;

begin
TmpList := TStringList.Create;

FillChar(Network, SizeOf(Network), 0);
FillChar(Network2, SizeOf(Network), 0);
with Network do
begin
dwScope := RESOURCE_GLOBALNET;
dwType := RESOURCETYPE_ANY;
dwUsage := RESOURCEUSAGE_CONTAINER;
end;
with Network2 do
begin
dwScope := RESOURCE_GLOBALNET;
dwType := RESOURCETYPE_ANY;
dwUsage := RESOURCEUSAGE_CONTAINER;
end;

if GetOSType <> ‘Windows NTthen
notNT := True
else
notNT := False;
if notNT then
goto SkipExtraNode;

EnumError := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @Network, EnumNetworkHandle);
if EnumError = NO_ERROR then
begin
NetworkEntries := MaxEntries;
NetworkBufferLength := SizeOf(EnumNetworkBuffer);
EnumError := WNetEnumResource(EnumNetworkHandle, NetworkEntries, @EnumNetworkBuffer, NetworkBufferLength);
for N := 1 to NetworkEntries do
begin

{ EXTRA NODE }
if EnumNetworkBuffer[N].lpRemoteName = GetWinNet then
begin
EnumError := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @EnumNetworkBuffer[N],
EnumExtraHandle);

SkipExtraNode:

{ Sistem NT türevi değilse çalışma grubunu enumerate }
if notNT then
EnumError := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @Network2, EnumExtraHandle);

if EnumError = NO_ERROR then
begin
WorkGroupEntries := MaxEntries;
ExtraBufferLength := SizeOf(EnumWorkGroupBuffer);
EnumError := WNetEnumResource(EnumExtraHandle, WorkGroupEntries, @EnumWorkGroupBuffer,
ExtraBufferLength);
if EnumError = NO_ERROR then
begin
for W := 1 to WorkGroupEntries do
begin
EnumError := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @EnumWorkGroupBuffer[W],
EnumWorkGroupHandle);
if EnumError = NO_ERROR then
begin
ComputerEntries := MaxEntries;
ComputerBufferLength := SizeOf(EnumComputerBuffer);
EnumError := WNetEnumResource(EnumWorkGroupHandle, ComputerEntries, @EnumComputerBuffer,
ComputerBufferLength);
if EnumError = NO_ERROR then
begin
for C := 1 to ComputerEntries do
begin
EnumError := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @EnumComputerBuffer
[C], EnumComputerHandle);
if EnumError = NO_ERROR then
begin
ShareEntries := MaxEntries;
ShareBufferLength := SizeOf(EnumShareBuffer);
EnumError := WNetEnumResource(EnumComputerHandle, ShareEntries, @EnumShareBuffer,
ShareBufferLength);
if EnumError = NO_ERROR then
for S := 1 to ShareEntries do
TmpList.Add(EnumShareBuffer[S].lpRemoteName);

WNetCloseEnum(EnumComputerHandle);
end;
end;
end;
WNetCloseEnum(EnumWorkGroupHandle);
end;
end;
end;
WNetCloseEnum(EnumExtraHandle);
end;
if notNT then Break;
end; { Microsoft Windows Ağı }
end;
WNetCloseEnum(EnumNetworkHandle);
end;

result := TmpList;
end;

Fonksiyon çalıştığı bilgisayarın üye olduğu ve erişebildiği (şifre ile korunmuşlar hariç) tüm çalışma gruplarındaki bilgisayarları ve ağ paylaşımlarını tarar ve bulduğu paylaşımların ağ patikalarını TStrinList tipinde geri döndürür. Bilgisayar adı ve paylaşım adından oluşan patikanın görünüşü söyle \\Bilgisayarin_Adi\Paylasimin_Adi .

Fonsiyonda yapılan değişiklikleri incelemek isterseniz SkipExtraNode etiketini takip edin.

Örnek programın ekran görüntüsü
Fonksiyonun kullanıldığı örnek programın delphi kaynak kodlarını buradan indirebilirsiniz.

Tankado

CEVAP VER