Avatar billede dj Nybegynder
12. marts 2001 - 20:54 Der er 14 kommentarer og
2 løsninger

Workgroup - netværk

Hej

Dette spørgsmål relaterer meget til:

http://www.eksperten.dk/spm/52688

Problemet med den funktion som borrisholt gav mig er at på store Netværk (300 maskiner) tager det en evighed. Dette er selvfølgelig ikke borrisholt\'s skyld men derimod Windows der generelt ikke har ret gode ydelser over Windows netværket.

Derfor har jeg besluttet at jeg vil give mulighed for at  indskrænke netværket lidt ved at man istedet specificerer en Workroup i funktionen, og den så lister computere og shares herunder.

Men for at gøre dette er det nødvendigt at man i funktionen (http://www.eksperten.dk/spm/52688) kan indtaste en workgroup som listningen skal foregå under og at den ikke også lister alle andre workgroups på netværket (da det er dette der er tidsslugeren på store netværk)..

Håber der er noget der kan lade sig gøre, for jeg har ingen anelse om hvordan :)

mvh. _DJ_
Avatar billede wisen Nybegynder
13. marts 2001 - 09:42 #1
Avatar billede dj Nybegynder
13. marts 2001 - 15:56 #2
Den ser umiddelbart ud til at kan bruges til at finde computerne under en bestemt workgroup, men desværre ikke sharenames (delte mapper)..
Avatar billede wisen Nybegynder
14. marts 2001 - 07:54 #3
Hmm....
Avatar billede wisen Nybegynder
14. marts 2001 - 09:54 #4
Prøv at kikke lidt her : http://www.mvps.org/win32/ Det er godt nok C++, men da det meste er API kald, skulle det nok være til at \"oversætte\" til Delphi. Efter hvad jeg kan se, så er der noget der hedder \"NetShareEnum\"; Det er måske dét du leder efter ?

/wisen
Avatar billede dj Nybegynder
14. marts 2001 - 10:05 #5
uhm.. der er en del ting jeg ikke har helt styr på i den kode (har aldrig arbejdet med C++), ville det være muligt om du evt. kunne oversætte den for mig og se om den virker?
Avatar billede wisen Nybegynder
14. marts 2001 - 10:22 #6
Jeg har ikke lige Delphi til rådighed, men jeg kan da lige prøve at kikke på det...
Avatar billede wisen Nybegynder
14. marts 2001 - 10:42 #7
Prøv at slå \"NetShareEnum\" på i Win32.hlp filen. Jeg har et fungerende eksempel på at få shares på en bestemt server. Men det er C++; og jeg kan ikke lige oversætte...
Avatar billede wisen Nybegynder
14. marts 2001 - 10:51 #8
Jeg har fundet det her, måske det kan bruges : www.aldyn.ru/demos/0023/wnet.zip
Det er allerede oversat :)
Avatar billede wisen Nybegynder
14. marts 2001 - 10:52 #9
Det ligner i hvertfald det du efterlyser :)
Avatar billede borrisholt Novice
15. marts 2001 - 12:39 #10
prøv det her .. det skulle være halv vejen :

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    procedure Hest(ServerName:pwchar);
  public
    { Public declarations }
  end;

_SHARE_INFO_502 = record
        shi502_netname: LPWSTR;
        shi502_type: DWORD;
        shi502_remark: LPWSTR;
        shi502_permissions: DWORD;
        shi502_max_uses: DWORD;
        shi502_current_uses: DWORD;
        shi502_path: LPWSTR;
        shi502_passwd: LPWSTR;
        shi502_reserved: DWORD;
        shi502_security_descriptor: PSECURITY_DESCRIPTOR;
end;

CShareInfo502 = _SHARE_INFO_502;
SHARE_INFO_502 = _SHARE_INFO_502;
PShareInfo502 = ^CShareInfo502;
LPBYTE = Pointer;
NET_API_STATUS = DWORD;
LPVOID = Pointer;


var
  Form1: TForm1;




  function NetShareEnum(const pszServer: LPWSTR; sLevel: longint;  var p:PShareInfo502 ;var cbBuffer: longint; var pcEntriesRead: longint;  var pcTotalAvail:longint;var hEnum:HWND): NET_API_STATUS; stdcall;


implementation

{$R *.DFM}


const
  NetApi32=\'NetApi32.dll\';

function NetShareEnum; external NetApi32 name \'NetShareEnum\';


procedure TForm1.Hest(ServerName:pwchar);
var
  cbBuffer,EntriesRead, TotalAvail: longint;
  i:integer;
  c:NET_API_STATUS;
  hEnum:HWND;
  p:pShareInfo502;
  ss:String;
begin
  memo1.lines.Clear;
  cbBuffer:=0;
  hEnum:=0;
  c:= NetShareEnum(ServerName, 502, p, cbBuffer, EntriesRead, TotalAvail,hEnum);

  if (c<>0) and (c<>234) then
    exit;

  if EntriesRead>0 then
  begin
    for i:=0 to EntriesRead-1 do
    begin
      memo1.lines.Add(string(p^.shi502_netname)+\'/\'+
                        string(p^.shi502_remark)+\'/\'+
                        intToStr(p^.shi502_max_uses)+\'/\'+
                        intToStr(p^.shi502_current_uses)+\'/\'+
                        string(p^.shi502_path) );
      inc(p);
    end;
  end;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  hest(\'GOOFY\');
end;

end.


Jens B
Avatar billede dj Nybegynder
16. marts 2001 - 06:56 #11
ahh.. det lyder jo ikke helt som noget hest :)

Jeg tester det lige senere når jeg får tid, tak for det begge 2 :)

Mvh. _DJ_
Avatar billede dj Nybegynder
16. marts 2001 - 16:40 #12
Borrisholt>> uhm.. når jeg kører programmet får jeg en besked der siger:

Linked to missing Export NETAPI32.DLL:NetShareEnum

det er tilsyneladende denne linje det er galt med:

function NetShareEnum; external NetApi32 name \'NetShareEnum\';

Har du nogen ide om hvad der er galt eller er du måske bare kommet til at lave en lille tastefejl :)
Avatar billede dj Nybegynder
16. marts 2001 - 18:10 #13
Jeg har lige snakket med en og han siger at man ikke skal kalde DLL\'en direkte(pga. kaldene er forskellige fra NT til 9x, bruger selv 9x så det er nok derfor det ikke virker), men istedet bruge WNetOpenEnum og WNetEnumResource.

Jeg ved dog ikke om det siger dig så meget (jeg har ikke selv arbejdet med WNETXXXX så det siger nemlig ikke mig ret meget :))

Håber du kan hjælpe.
Avatar billede dj Nybegynder
18. marts 2001 - 11:46 #14
nåh.. jeg har selv fundet en måde og fixe problemet på håber jeg, jeg kan dog ikke teste det før i morgen ..
Avatar billede borrisholt Novice
19. marts 2001 - 06:34 #15
SNOWBALL >> Her er et lille program det kan fortælle dig hvilken slags Netværks resourse du har fat i .. Hvis den så er \"forkert\" kan du jo blot stoppe rekusionen ....

unit fmMain;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls;

type
  TMainForm = class(TForm)
    TV: TTreeView;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

implementation

{$R *.DFM}


const InitialSize = $1;  // Any positive value is acceptable.

type
    TNetEnumThread = class(TThread)
        ChildNode: String;
        TreeNode: TTreeNode;
        procedure AddChildNode;
        procedure Execute; override;
        procedure LoadNetNode(NetNode: PNetResourceA);
    end;

procedure TNetEnumThread.Execute;
begin
    TreeNode:=nil;
    LoadNetNode(nil);
end;

procedure TNetEnumThread.AddChildNode;
begin
    TreeNode:=MainForm.TV.Items.AddChild(TreeNode,ChildNode);
end;

procedure TNetEnumThread.LoadNetNode(NetNode: PNetResourceA);
var hEnum : THandle;
    Count,BufSize, Usage: DWORD;
    NR,Buf: PNetResourceA;
    R: Integer;
    CurrentNode: TTreeNode;
begin
    R:=WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,0{RESOURCEUSAGE_CONTAINER},NetNode,hEnum);
    if R <> NO_ERROR then exit;

    BufSize:=InitialSize; GetMem(Buf,BufSize);
    try
        while True do
        begin
            Count:=$FFFFFFFF; // I wish to read ALL items
            R:=WNetEnumResource(hEnum,Count, Buf, BufSize);

            if R = ERROR_MORE_DATA then // Oops ! The InitialSize is too small !
            begin
                Count:=$FFFFFFFF; // I wish to read ALL items
                FreeMem(Buf); GetMem(Buf,BufSize);
                R:=WNetEnumResource(hEnum,Count, Buf, BufSize);
            end;

            if R = ERROR_NO_MORE_ITEMS then Break; // All items are processed
            if R <> NO_ERROR then Abort; // R is the error code. Process it!

            NR:=Buf;
            while Count > 0 do
            begin
                CurrentNode:=TreeNode; // Remember current position

                if NR.lpRemoteName <> nil then
                    ChildNode:=StrPas(NR.lpRemoteName)
                else
                    ChildNode:=\'\';

                // Gather node information and display it in textual form
                ChildNode:=ChildNode+\'  DisplayType=\';
                case NR.dwDisplayType of
                    RESOURCEDISPLAYTYPE_DOMAIN: ChildNode:=ChildNode+\'Domain\';
                    RESOURCEDISPLAYTYPE_GENERIC: ChildNode:=ChildNode+\'Generic\';
                    RESOURCEDISPLAYTYPE_SERVER: ChildNode:=ChildNode+\'Server\';
                    RESOURCEDISPLAYTYPE_SHARE: ChildNode:=ChildNode+\'Share\';
                    RESOURCEDISPLAYTYPE_GROUP: ChildNode:=ChildNode+\'Group\';
                    RESOURCEDISPLAYTYPE_NETWORK: ChildNode:=ChildNode+\'Network\';
                    RESOURCEDISPLAYTYPE_ROOT: ChildNode:=ChildNode+\'Root\';
                    RESOURCEDISPLAYTYPE_SHAREADMIN: ChildNode:=ChildNode+\'ShareAdmin\';
                    RESOURCEDISPLAYTYPE_DIRECTORY: ChildNode:=ChildNode+\'Directory\';
                    RESOURCEDISPLAYTYPE_TREE: ChildNode:=ChildNode+\'Tree\';
                    RESOURCEDISPLAYTYPE_NDSCONTAINER: ChildNode:=ChildNode+\'NDS Container\';
                else
                    ChildNode:=ChildNode+\'? (\'+IntToStr(NR.dwDisplayType)+\')\';
                end;

                if NR.dwScope = RESOURCE_GLOBALNET then // dwUsage member is usable in this case only
                begin
                    ChildNode:=ChildNode+\'  Usage=\';

                    Usage:=NR.dwUsage;
                    if (Usage and RESOURCEUSAGE_CONNECTABLE) <> 0 then ChildNode:=ChildNode+\'Connectable;\';
                    Usage:=Usage and not RESOURCEUSAGE_CONNECTABLE;

                    if (Usage and RESOURCEUSAGE_CONTAINER) <> 0 then ChildNode:=ChildNode+\'Container;\';
                    Usage:=Usage and not RESOURCEUSAGE_CONTAINER;

                    if (Usage and RESOURCEUSAGE_NOLOCALDEVICE) <> 0 then ChildNode:=ChildNode+\'NoLocalDevice\';
                    Usage:=Usage and not RESOURCEUSAGE_NOLOCALDEVICE;

                    if (Usage and RESOURCEUSAGE_SIBLING) <> 0 then ChildNode:=ChildNode+\'Sibling\';
                    Usage:=Usage and not RESOURCEUSAGE_SIBLING;

                    if (Usage and RESOURCEUSAGE_ATTACHED) <> 0 then ChildNode:=ChildNode+\'Attached\';
                    Usage:=Usage and not RESOURCEUSAGE_ATTACHED;

                    if (Usage and RESOURCEUSAGE_RESERVED) <> 0 then ChildNode:=ChildNode+\'Reserved\';
                    Usage:=Usage and not RESOURCEUSAGE_RESERVED;

                    if Usage <> 0 then ChildNode:=ChildNode+\'? (\'+IntToHex(Usage,8)+\')\';
                end;

                // Check for dwType value
                ChildNode:=ChildNode+\'  Type=\';
                case NR.dwType of
                    RESOURCETYPE_ANY: ChildNode:=ChildNode+\'Any\';
                    RESOURCETYPE_DISK: ChildNode:=ChildNode+\'Disk\';
                    RESOURCETYPE_PRINT: ChildNode:=ChildNode+\'Print\';
                else
                    ChildNode:=ChildNode+\'?\';
                end;

                // Analyze dwScope member
                ChildNode:=ChildNode+\'  Scope=\';
                case NR.dwScope of
                    RESOURCE_CONNECTED: ChildNode:=ChildNode+\'Connected\';
                    RESOURCE_GLOBALNET: ChildNode:=ChildNode+\'Globalnet\';
                    RESOURCE_REMEMBERED: ChildNode:=ChildNode+\'Remembered\';
                else
                    ChildNode:=ChildNode+\'?\';
                end;

                // Add new node to the tree view - and do it in the main thread
                Synchronize(AddChildNode);

                // Process subnodes
                LoadNetNode(NR);

                TreeNode:=CurrentNode; // restore current position
                                      // after modification

                // Go to the next record
                INC(NR);
                DEC(Count);
            end;
        end;
    finally
        WNetCloseEnum(hEnum); // Close handle
        FreeMem(Buf); // Free memory1
    end;
end;


procedure TMainForm.FormCreate(Sender: TObject);
begin
    TNetEnumThread.Create(False);
end;

end.

Jens B
Avatar billede dj Nybegynder
19. marts 2001 - 09:23 #16
hehe Snowball ? :)

Men det var faktisk noget lignende det jeg selv var kommet frem til :)

Nåh.. jeg lukker spørgsmålet

Tak for hjælpen

Mvh. _DJ_
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester