Avatar billede speedy Nybegynder
15. december 1999 - 19:44 Der er 18 kommentarer og
2 løsninger

Brugere på netværk.

Hejsa, hvordan kan man få at vide, hvem der er logget på et netværk. Kan man både få IP adresse, og Brugernavn ??
Avatar billede chris Nybegynder
15. december 1999 - 21:01 #1
er dette et Delfi spørgsmål ?  eller?
Avatar billede speedy Nybegynder
15. december 1999 - 21:29 #2
Jeps, Kan man få det at vide i Delphi ??
Avatar billede sjensen Nybegynder
16. december 1999 - 13:24 #3
Ikke umiddelbart i Delphi, men via Windows API kald kan det lade sig gøre.

Det er dog en besværlig måde hvis du vil have alle oplysningerne, men hvis du kan nøjees med brugernavnene er det ikke så svært.

Slå op i Win32.hlp (under Program files\Common files\Borland shared\help) og læs beskrivelserne vedr.:

Connection_Info_1,
WNetEnumInfo og
WNetEnumResource

Endeligt mener jeg at jeg har set en shareware komponent på DSP der kan fortælle dig hvilke brugere der er logget på, fra hvilke maskiner, m.m.

sjensen
Avatar billede speedy Nybegynder
16. december 1999 - 15:48 #4
sjensen>> Tak, men problemet er bare, at jeg ikke ved hvordan man bruger det. Jeg slog op i win32.hlp, og fandt det du skrev, men jeg ved ikke hvad jeg skal gøre med de ting der står. Jeg har tit hørt om Win API men har ikke vidst hvad det var, og hvordan det skal bruges. Håber du gider at svare mig med et eksempel, eller en instruktion i hvordan man bruger alle de der API funktioner.
Avatar billede delphi Nybegynder
16. december 1999 - 17:11 #5
Vedr. IP addresse se: http://www.eksperten.dk/spm.asp?id=7852

For at få navnet på brugeren der er logget på benyttes (logisk nok): GetUserName  (Et Win API kald).

NiP


Avatar billede sjensen Nybegynder
16. december 1999 - 17:47 #6
Ok, jeg skal finde nogle eks.

Du hører fra mig senere

sjensen
Avatar billede delphi Nybegynder
16. december 1999 - 19:17 #7
Vedr. brugen af Win API funktioner.
Du har ganske ret i, at det kan være en noget skræmmende oplevelse for en uøvet Delphi programmør at skulle gå igang med programmering Win API'et.
Heldigvis skjuler Delphi selv langt de fleste Win API funktioner og variable - hvor tit har man fx. brug for at arbejde direkte med et Window handle.
Næh dengang med "Borland Pascal for Windows v. 1.0"....

Selvom Win32.Hlp kan virke noget uforstålig så er den en ganske udemærket kilde, når man skal søge efter hvilke muligheder man har via Windows. Man skal ved en sådan søgning være klar over, at man tit skal sætte ordene Get eller Set foran det man søger.  Fx. vil en søgning i Win32.Hlp på 'GetUser..' hurtigt give en henvisning til:

BOOL GetUserName(
    LPTSTR lpBuffer,    // address of name buffer
    LPDWORD nSize     // address of size of name buffer
  );

Og hvad er så det? - det er ihvertfald ikke Pascal!
En erfaren programmør vil se at det der er C-syntax.  Ikke så underligt, for Windows er skrevet i C og Win32.HLP er en helpfile skrevet af Microsoft til Windows programmøre, dvs. C-programmøre.
I det aktuelle tilfælde vil man kunne se, at GetUserName er en funktion, der returnere en Boolean og tager to parametre: en pointer til en streng (null-terminated) og en 32 bit integer konstant.
Hvad så med dem der ikke kan C og hvad med Delphi, der ikke kender den slags data typer - ihvertfald ikke med de samme navne?
Her er svaret, at Borland har implementeret alle Win32API kald, datatyper og standard konstanter i Delphi. Langt de fleste er deklareret i Windows.Pas uniten.  Hvordan finder man så ud af det?
Nemt nok!.  Man skriver først navnet på den pågældende funktion i Delphi editoren.  Derefter Venstre-trykker man så med musen på navnet, mens man holder CTRL på tastaturet nede.  Delphi vil nu springe til det sted i kildekoden hvor funktionen er erklæret, altså som regel til Windows.Pas.  Her finder man linien:

function GetUserName; external advapi32 name 'GetUserNameA';

Denne linie fortæller at GetUserName ligger i et bibliotek kaldet AdvAPI32.DLL. Desuden er GetUserName et alias og at funktionens rigtige navn i biblioteket er GetUserNameA.  I Windows.Pas søger man nu efter GetUserNameA.  Dette resulterer i linien:

function GetUserNameA(lpBuffer: PAnsiChar; var nSize: DWORD): BOOL; stdcall;

Nu er vi endeligt ved noget der er mere alm. Delphi/pascal syntax.
Funktionen har to parametre:
lpBuffer er en PAnsiChar.  Det er en anden måde at sige PChar, hvilket er en
null-termineret string.  Dette er i praksis det samme som addressen på en variabel
der er erklæret som Array[0..x] Of Char;
Delphi tilader desuden typecasts mellem String og PChar (Se i nedenstående eksempel).

Den anden parameter, nSize, er et DWORD.  Venstre Click på dette ord (med CTRL nede), og man vil med det samme se, at en DWord er det samme som et LongWord, der er en standard Delphi type.

Tilsvarende kan man finde hvad BOOL egentligt er for en størrelse.

Nu hvor både funktionsnavnet og parameter typerne er på plads, kan vi lave et lille test program:

procedure TForm1.Button1Click(Sender: TObject);
var
  nSize : LongWord;
  Buf  : Array[0..50] Of Char;
begin
  nSize := 50;                                // Sæt max-længde af buffer
  If GetUserName(@Buf, nSize) Then            // Læs UserNavne via WinAPI og..
    Label1.Caption := 'User: ' + String(Buf);  // ..skriv det i Label1.
end;

Simpelt og elegant.

NiP
Avatar billede speedy Nybegynder
17. december 1999 - 10:34 #8
delphi >> Tak, men mit spørgsmål var egentligt ikke om jeg kunne få mit eget at vide, men istedet de andre computere som er med i netværket.

Men ellers tak for en GRUNDIG beskrivelse.
Avatar billede delphi Nybegynder
19. december 1999 - 21:37 #9
Selv tak.

Hvis du, som jeg, hovedsagelgt arbejder under NT, så downloadede jeg engang nogle komponenter.  Jeg kan ikke huske om jeg nogensinde fik brugt dem til et engentligt projekt, men de ser rimeligt imponerende ud.  Sættet som jeg har hedder NTSet106_D4.  Der er masser af eksempler og source kode med i sættet.  Følgende er et udklip fra Help filen.

<Inset>

Contact information

TNTService, TNTEventLog, TNTUserMan, TNTShare, TNTFileSecurity, TNTRegSecurity are first in a row of components designed to use specific features of Windows NT™. This is the shareware version. Full version with source code is available for registered users.

E-mail        contact@risq.belcaf.minsk.by
Visit us at     http://www.belcaf.com

</Inset>

NiP
Avatar billede speedy Nybegynder
20. december 1999 - 13:30 #10
Jeg kører ikke med NT :-(

Men kan man bruge Source-koden alligevel ??
Avatar billede delphi Nybegynder
20. december 1999 - 16:01 #11
Det ved jeg faktisk ikke - men jeg tvivler.  Koden gør uden tvivl brug af nogle af NT's udvidede faciliteter, så som remote user administration etc.

NiP
Avatar billede speedy Nybegynder
21. december 1999 - 10:45 #12
sjensen >> Du skrev at det var en besværlig måde at få IP adressen, men ved du hvordan man gør, så vil jeg gerne høre... Det må du selvfølgelig også Delphi ;-)

SpEeDy
Avatar billede sjensen Nybegynder
21. december 1999 - 12:29 #13
Hej Speedy,

Her er lige indholdet af en FAQ fra Inprise, der vedr. hvordan man finder IP-adressen på den maskine man arbejder på:

Question:

How do I get the local internet machine name and IP address?

Answer:

Getting the local machine name and IP address is a straight
forward process that is most easily accomplished using the TCP
component. Simply drop a TCP component from the internet page
of the component palette on to a form, and access the following
members of the TCP component:

  Memo1.Lines.Add(TCP1.LocalHostName);
  Memo1.Lines.Add(TCP1.LocalIp);

If you prefer not to use the TCP component, here is an example
that interfaces directly with your winsock layer:

uses Winsock;

procedure TForm1.FormCreate(Sender: TObject);
var
  wVersionRequested : WORD;
  wsaData : TWSAData;
begin
  {Start up WinSock}
  wVersionRequested := MAKEWORD(1, 1);
  WSAStartup(wVersionRequested, wsaData);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  p : PHostEnt;
  s : array[0..128] of char;
  p2 : pchar;
begin
  {Get the computer name}
  GetHostName(@s, 128);
  p := GetHostByName(@s);
  Memo1.Lines.Add(p^.h_Name);
  {Get the IpAddress}
  p2 := iNet_ntoa(PInAddr(p^.h_addr_list^)^);
  Memo1.Lines.Add(p2);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  {Shut down WinSock}
  WSACleanup;
end;

Det var noget af det.

Samtidig ved jeg at der findes TCP/IP sniffer programmer der viser de pakker der transporteres på netværket. Ved at nalysere dem kan man se hvilke ip-adresser der er aktive. Men jeg kan ikke huske hvor jeg har set det. Jeg kigger lidt mere og du hører fra mig senere.

sjensen
Avatar billede sjensen Nybegynder
21. december 1999 - 12:38 #14
Prøv i øvrigt at se hjælpeteksten SOCK2.HLP som du finder i Programmer, Fælles filer, Bormand fælles, MSHelp

sjensen
Avatar billede delphi Nybegynder
21. december 1999 - 13:46 #15
SJensen> Hvis du kigger længere op, så vil du se, at:
1: Det svar allerede var givet en gang før og
2:  Speedy ønsker at vide hvem der ellers er på nettet og deres IP addresser.

I øvrigt har jeg ladet mig fortælle, at Internet VCL komponenterne ikke altid er akurate.  I et miljø med dynamisk tildeling af adresser, kan man tilsyneladende risikere, at den adresse komponenterne fortæller man har ikke er aktuel, men er den forrige adresse.  Først hvis man sender/modtager med sin komponent, vil den opdatere sig selv og dermed vise den korrekte adresse.

NiP
Avatar billede sjensen Nybegynder
21. december 1999 - 14:02 #16
Delphi> Du har ret med 1. Min fejl !!

Vedr. 2 så er jeg opmærksom på det og jeg prøver p.t. at huske hvor jeg har set det.

Det med at adrs. ikke altid er korrekte er der nok noget om, men når man får info. fra serveren bør de være korrekte.

Med winsock kan man lave et lille server program der kan vise alle forbundne IP-adresser, men det skal jo så køre på serveren og det har jeg ikke indtryk af at Speedy ønsker.

sjensen
Avatar billede delphi Nybegynder
21. december 1999 - 14:53 #17
Det er jo muligt med små forskellige utility-programmer, hvor man kan sende en kort message af pop-up typen til en eller flere andre brugere på nettet, at se hvem der er logget på.  Hvis disse programmer kan se hvem der er på nettet, så må det selvsagt også være muligt selv at få de tilsvarende oplyninger.  Jeg ved at det er rimeligt nemt i et Novel net, men jeg har aldrig selv foretaget noget tilsvarende i NT-verdenen og jeg har desværre ikke tid til lige at rode med det her og nu.

NiP
Avatar billede delphi Nybegynder
21. december 1999 - 15:12 #18
Tog iøvrigt lige tid til et hurtigt kig. 

Funktionen NetQueryDisplayInformation vil kunne give en liste over en masse ting, bl.a. brugere på nettet.  Rutinen kræver, som de fleste andre Net-rutiner, adgang til NetAPI32.Dll, hvilket er ensbetydende med WinNT, og administrator rettigheder.

Andre interessante rutiner er
NetGetAnyDCName // Find Server/domain name information.
NetWkstaUserEnum  // Info vedr. brugere på specifik workstations
NetUserEnum  // Få et hav af oplysninger om brugere på en server.

Umiddelbart er der ikke de store muligheder under Win95 med de alm. Win API kald.  Der findes muligvis nogle rutiner på Delphi Superbase mv.

Delphi/NiP
Avatar billede speedy Nybegynder
22. december 1999 - 12:05 #19
Tak for hjælpen igen, men nu accepterer jeg jer lige, for i gjorde hvad i kunne! Tak endnu engang!

Selvfølgelig må i gerne hvis i finder ud af noget skrive det herinde, men ellers er der ikke noget at gøre ved det.

Jeg synes bare det var smart hvis man kunne. Det er fordi jeg er ved at lave sænke slagskibe over netværk, og der ville det jo være rart for brugerne at de kunne se navnene på dem de kunne spille imod, i stedet for at de selv skal indtaste IP adressen på den de vil spille mod.

MVH

Speedy ;-)
Avatar billede delphi Nybegynder
22. december 1999 - 13:28 #20
Se det kunne du jo bare ha' sagt.  I såfald er løsningen bare at bruge en MailSlot component.  Martin Djernæs har en på hans hjemmeside.  Den har jeg omtalt i et tidligere svar (http://www.eksperten.dk/spm.asp?id=8120).  Med en sådan komponent, kan har alle pc'ere i nettet, der køre samme application/mailslot, mulighed for at have et fælles 'kontakt punkt'.  Det er så bare et spørgsmål for dig om at lave din application, således at de benytter en fælles protokol.  Fx.: Programmet skal kunne placere en forespørgelse i mailsloten om at alle andre maskiner skal give sig tilkende.  De andre programmer vil se denne besked og svare med deres lokale IP-addresse/bruger navn.  Disse oplysninger benytter du så vidre i dit program...

NiP
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