Можно получить список как своих ресурсов, так и любого компьютера в сети. В том числе админ ресурсов С$, D$ ...
1 2 3 4 5 6 7 8 9 10 11 12 13 |
var lst: TStringlist; servName: string; showAdminRes: Boolean; begin lst:= TStringlist.Create; servName:= 'localhost'; showAdminRes:= True; enumServerShares(servName, showAdminRes, lst); ShowMessage(lst.Text); FreeAndNil(lst); end; |
Параметры
servName - имя компьютера в формате: compName или \\compName. Для получения своих ресурсов, можно использовать 'localhost'.
showAdminRes - выводить или нет в список админ ресурсы С$, D$ ...
Результат
Переменная lst будет содержать список ресурсов или пустую строку в случае неудачи.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
function enumServerShares (serverName : string; ScanAdminShares : Boolean; Shares : TStringList) : Boolean; const SHARECOUNT = 1000; type TNetShareEnum = function (servername: LPWSTR; level: DWORD; var bufptr: Pointer; prefmaxlen: DWORD; var entriesread: DWORD; var totalentries: DWORD; var resume_handle: DWORD): DWORD; stdcall; TNetApiBufferFree = function (buffer: Pointer): DWORD; stdcall; SHARE1 = packed record shi1_netname : LPWSTR; shi1_type : DWORD; shi1_remark : LPWSTR; end; PShare1Array = ^Share1Array; Share1Array = array [0..SHARECOUNT - 1] of SHARE1; var i, j: integer; sr: TSearchRec; Buf: PShare1Array; pServerName : PWideChar; NetShareEnum: TNetShareEnum; NetApiBufferFree: TNetApiBufferFree; EntriesRead, TotalEntries, ResHandle, DLLHandle, ResValue: DWORD; aShareName : string; begin Result := False; ResHandle := 0; DLLHandle := LoadLibrary('netapi32.dll'); if DLLHandle <> 0 then begin try @NetShareEnum := GetProcAddress(DLLHandle, 'NetShareEnum'); @NetApiBufferFree := GetProcAddress(DLLHandle, 'NetApiBufferFree'); if @NetShareEnum = nil then Exit; Result := True; EntriesRead := 0; TotalEntries := 0; Shares.BeginUpdate; try GetMem(pServerName, (Length(ServerName) + 1)* 2); try pServerName := StringToWideChar(ServerName, pServerName, Length(ServerName) + 1); ResValue := NetShareEnum (pServerName, 1, Pointer(Buf), sizeof(Share1Array), EntriesRead, TotalEntries, ResHandle); finally FreeMem(pServerName, (Length(ServerName) + 1)* 2); end; if (ResValue = ERROR_SUCCESS) or (ResValue = ERROR_MORE_DATA) then begin for j := 0 to EntriesRead - 1 do begin aShareName := WideCharToString(Buf[j].shi1_netname); if (Buf[j].shi1_type = 0) or (ScanAdminShares and (Buf[j].shi1_type = 2147483648)) then Shares.Add (aShareName); end; if (@NetApiBufferFree <> nil) then NetApiBufferFree(Pointer(Buf)); end; finally Shares.EndUpdate; end; finally FreeLibrary(DLLHandle); end; end; end; |