Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi UPNP / Portscan (https://www.delphipraxis.net/75512-upnp-portscan.html)

c.kauer 20. Aug 2006 17:38


UPNP / Portscan
 
Hallo,

Ich möchte folgendes hinbekommen:
Alle UPNP Devices finden, nach offenen Ports scannen und selbst Ports öffnen und schließen:

Zunächst habv ich die UPNP Dll in Delphi importiert. Mit den dann zur Verfügung stehenden Interfaces kann ich die Geräte auch finden:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  UPnPDeviceFinder : IUPnPDeviceFinder;
  UPnpDevices : IUPnpDevices;
  EnumVariant, EnumVariant2 : IEnumVariant;
  rgvar, rgvar2 : OleVariant;
  celtFetched, celtFetched2 : Cardinal;
  UPnpDevice : IUPnpDevice;
  Counter, Counter2 : Integer;
  Erg : HResult;
  UPnpService : IUPnpService;
begin
  Memo1.Lines.Clear;
  Counter := 0;
  UPnPDeviceFinder := CoUPnPDeviceFinder.Create;
  UPnpDevices := UPnPDeviceFinder.FindByType('upnp:rootdevice', 0);
  Memo1.Lines.Add('Number of UPnP devices: ' + IntToStr(UPnpDevices.Count));
  lblDisplay.Caption := IntToStr(UPnpDevices.Count) + ' UPnp-Geräte gefunden';
  try
    EnumVariant := IEnumVariant(UPnpDevices._NewEnum);
    while (EnumVariant.Next(1, rgvar, celtFetched) = S_OK) do
    begin
      UPnpDevice := IUPnpDevice(IUnknown(rgvar));
      Inc(Counter);
      Memo1.Lines.Add('Device: ' + IntToStr(Counter));
      Memo1.Lines.Add(UPnpDevice.FriendlyName);
      Memo1.Lines.Add(UPnpDevice.UniqueDeviceName);
      Memo1.Lines.Add('Services: ' + IntToStr(UPnpDevice.Services.Count));
      Memo1.Lines.Add('');
      Memo1.Lines.Add(UPnpDevice.PresentationURL);
//      UPnpDevice.Services.Item[].
      EnumVariant2 := IEnumVariant(UPnpDevice.Services._NewEnum);
      Erg := EnumVariant2.Next(1, rgvar2, celtFetched2);
      Counter2 := 0;
      while (Erg = S_OK) do
      begin
        UPnpService := IUPnPService(IDispatch(rgvar2));
        Inc(Counter2);
        Memo1.Lines.Add('Service: ' + IntToStr(Counter2));
        Memo1.Lines.Add('ServiceID: ' + UPnpService.Id);
        Erg := EnumVariant2.Next(1, rgvar2, celtFetched2);
      end;
    end;
  except
  end;
end;

An dem Rest der Aufgabe bin ich leider am verzweifeln.

Vielen Dank im Voraus,

mit freundlichen Grüßen
Christian Kauer

Der_Unwissende 20. Aug 2006 18:03

Re: UPNP / Portscan
 
Hi
und Willkommen in der DP! :dp:

Fragen die sich auf Arbeiten beziehen sind immer sehr ungern gesehen (da schon in den AGBs die du bei der Anmeldung bekommen hast steht, dass dies kein Forum ist, in dem solche Aufgaben gelöst werden).

Was deinen Code angeht, so würde ich dir empfehlen, dass du den etwas mehr strukturierst. Nicht falsch verstehen, der ist natürlich strukturiert, aber ein paar Leerzeilen und mehr als eine Methode machen den leichter lesbar. An sich solltest du in einer Methode immer nur eine Sache machen. In deinem Fall kannst du z.B. leicht die Anzeige (Eintragen ins Memo) von dem Finden der UPNPs trennen. Je kleiner eine Methode, desto übersichtlicher (weniger Fehler, leichter wiederverwendbar/austauschbar).

Was deine ausstehenden Probleme angeht, so ist es halt so eine Sache, dir einfach eine Lösung zu posten. Wiederspricht irgendwie dem wofür ein Forum gut ist. Deshalb mal die Frage, wie weit ist es mit deinem Wissen her?
Hast du irgendeinen Ansatz? Kennst du schon bestimmte Komponenten, die sich eventuell eignen würden? Und andere wissen was du für Komponenten hast, wäre auch die Delphi Version hier interessant.

Gruß Der Unwissende

RobertP 20. Aug 2006 20:51

Re: UPNP / Portscan
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin!
An etwas ähnlichem arbeite ich zurzeit auch gerade. Ich wär dir deshalb sehr dankbar wenn du mir den Code, mit dem du die DLL einbunden hast schicken könntest. Zu deinem Problem: Ich weiß nicht wie die Funktion das bisher darstellt, aber wenn du das so ähnlich darstellen lässt wie es das Intel Device Spy Tool und anschließend in dieser Liste z.B. nach "AddPortMapping" oder "DeletePortMapping" suchst, kannst du auch aus dem jeweils übergeordneten Listenelement die URL rauslesen an die du den Befehl schicken musst. So is zumindest mein Plan wenn jemand ne bessere Idee hat -> bitte posten :-D

Grüße,
MrPayne

JonnyGuitar 21. Aug 2006 08:53

Re: UPNP / Portscan
 
moin zusammen,

ich plage mich zur zeit auch mit dem thema upnp herum. aufgelistet kriege ich die geräte auch schon aber danach hört es bei mir auch auf. es muss doch leute geben die da durchblicken :) .

@mr payne: die dll lässt sich unter projekt/typ bibliothek importieren einbinden. danach hast du unter dem active x reiter diverse komponenten.

mfg jonny guitar

RobertP 21. Aug 2006 17:10

Re: UPNP / Portscan
 
Ah danke für den Tipp!
Aber sucht der bei euch auch so lange nach Geräten (20 sek oder so)?

JonnyGuitar 21. Aug 2006 21:12

Re: UPNP / Portscan
 
ja, 10 - 15 sekunden sucht der bei mir auch.

aber ich hätte noch eine bitte. mir hat ein bekannter ein beispiel python quellcode geschickt:

Delphi-Quellcode:
import win32com.client
from pythoncom import CoInitialize,CoUninitialize

def AddPortMapping(Port,LocalIP):
try:
CoInitialize()
DeviceFinder=win32com.client.Dispatch("UPnP.UPnPDeviceFinder")

Connections=DeviceFinder.FindByType("urn:schemas-upnp-org:service:WANIPConnection:1",0)
Connection=Connections.__getitem__(0)
Service=Connection.Services.__getitem__(0)

Service.InvokeAction("AddPortMapping",["",Port,"TCP",Port,LocalIP,True,"BitTorrent",""],"")
return True
except:
return False



def ReleasePortMapping(Port):
try:
CoInitialize()
DeviceFinder=win32com.client.Dispatch("UPnP.UPnPDeviceFinder")

Connections=DeviceFinder.FindByType("urn:schemas-upnp-org:service:WANIPConnection:1",0)
Connection=Connections.__getitem__(0)
Service=Connection.Services.__getitem__(0)
r=[]
Service.InvokeAction("DeletePortMapping",["",Port,"TCP"],r)
finally:
return
es gibt ja nun auch UPnpService.InvokeAction. kann mir einer das Service.InvokeAction("AddPortMapping",["",Port,"TCP",Port,LocalIP,True,"BitTorrent"," "],"") nach delphi übersetzen?
UPnpService.InvokeAction('AddPortMapping', [0, 1000, 'TCP', 1000, '192.168.0.1', True, 'TEST', 0], '') gibt nur fehler aus

mfg Jonny

TKC 21. Aug 2006 22:37

Re: UPNP / Portscan
 
Eventuell ist ja AddPortMapping nicht erlaubt auf dem Router... bei der FritzBox kann man das z.B. einstellen.

JonnyGuitar 22. Aug 2006 07:07

Re: UPNP / Portscan
 
morgen zusammen,

also upnp ist auf dem router aktiviert. ich denke das sollte funktionieren. aber es kommen ja auch erstmal fehler von delphi:

UPnpService.InvokeAction('AddPortMapping', [0, 1000, 'TCP', 1000, '192.168.0.1', True, 'TEST', 0], '')

bei den beiden Portangaben 1000 kommt "Konstantenausdruck verletzt untere Grenzen"

bei der ip angabe und dem Portnamen 'test' kommt "inkompatible Typen integer und string"


vielleicht weiss ja einer weiter


mfg Jonny

TKC 22. Aug 2006 07:29

Re: UPNP / Portscan
 
bei InvokeAction musst du doch alle Werte als Variant übergeben oder ?

JonnyGuitar 22. Aug 2006 07:40

Re: UPNP / Portscan
 
also die drei parameter sind:

bstrActionName: WideString;
vlnActionArgs: OleVariant;
pvOutActionArgs: OleVariant;

Also demnach ja. Oder wolltest du mich jetzt irgendwo drauf stoßen weil irgendwas dummes gemacht habe? sehe mittlerweile den wald vor lauter bäumen nicht ;)

mfg Jonny


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:43 Uhr.
Seite 1 von 4  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz