You can get a list of both your resources and any computer on the network. Including admin resources C$, 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; |
Options
servName - computer name in the format: compName or \\compName. To get your own resources, you can use 'localhost'.
showAdminRes - whether or not to list admin resources С$, D$ ...
Result
The variable lst will contain a list of resources or an empty string if unsuccessful.
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; |