Laden...

Dial-up Verbindung auflisten

Erstellt von knopper vor 18 Jahren Letzter Beitrag vor 18 Jahren 4.539 Views
K
knopper Themenstarter:in
40 Beiträge seit 2005
vor 18 Jahren
Dial-up Verbindung auflisten

Hallo,

Wie kann ich mit C# alle PPP-Verbindungen auf meinem Windows-Rechner auflisten ?
Angenommen ich bin mit Internet über Modem verbunden. Wie erkenne ich dass Modemverbidung an ist.
Wo nach soll ich schauen, WMI vielleicht ? Gibt es fertige C++libs für C# ?

Gruss

S
125 Beiträge seit 2005
vor 18 Jahren

Über WMI sollte das gehen, da es dir (z.B.) für eine Netzwerkkarte auch diese Dinge ausgeben kann. Sollte beim Modem ähnlich sein.

Probiers mal hiermit

Win32_POTSModem

oder mit

Win32_NetworkAdapter

Mfg SGT_BOB

*************************
Ich bin root, ich darf das... 😜
root>_
*************************

D
343 Beiträge seit 2005
vor 18 Jahren

Hi knopper,

es gibt auch ein Komando in cmd welches du in c# ausführen kannst.

-> "rasdial.exe"

nicht das schönste Beispiel, aber es geht.


public int DialCheck()
		{
			Process ras = new Process();
			ras.StartInfo.FileName = "rasdial.exe";
			
			ras.StartInfo.UseShellExecute = false;
			ras.StartInfo.RedirectStandardOutput = true;
			ras.Start();

			StreamReader strR = ras.StandardOutput;
			string rasStr = strR.ReadLine();
			ras.Close();
			if(rasStr.Trim() != "Keine Verbindungen")
				return 1; //Verbindung da
			else
				return 0; //keine Verbindung
		}


aber wie gesagt, ist nicht die schönste art der programmierung 😦(((

Grüßle
David

Programming is like sex: One mistake and
you have to support it your lifetime

K
knopper Themenstarter:in
40 Beiträge seit 2005
vor 18 Jahren

Hallo,

Danke Euch für die Hinweise:

Ich habe es probiert:

		ManagementObjectSearcher moSearchModem = new ManagementObjectSearcher("Select * from Win32_POTSModem"  
			 + " WHERE StatusInfo = 3" );  
		ManagementObjectCollection moSCollection = moSearchModem.Get();  

		foreach(ManagementObject Maobj in moSCollection)  
		{  
			string Description = (string) Maobj["Description"];  
			Console.WriteLine(Description);  
			Console.WriteLine((string) Maobj["AttachedTo"]); // COM -Port number  

			Console.WriteLine((UInt16) Maobj["Availability"]);  


			Console.WriteLine();  

		}  

		ManagementObjectSearcher moSearch =   
			new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration"  
			+ " WHERE IPEnabled = 'TRUE'");	  
		ManagementObjectCollection moCollection = moSearch.Get();  
		foreach(ManagementObject objMO in moCollection)  
		{  
			Console.WriteLine((string) objMO["Description"]);  
			Console.WriteLine((string) objMO["SettingID"]);  
			Console.WriteLine((string) objMO["MACAddress"]);  
			Console.WriteLine((UInt32) objMO["Index"]);  
			Console.WriteLine();  
		}  

Es funktioniert zwar, aber die bekomme Fehlermeldung in der Zeile:

Console.WriteLine((UInt16) Maobj["Availability"]);

keine Ahnung warum ????

mit Win32_NetworkAdapterConfiguration weiss ich ob Modem connected oder nicht ,aber es zeigt kein Name an, weiss nicht welcher Modem ist das.

Weiss jemand wie es weitergehen soll ?

Andere Frage: Wie bekomme ein Event von WMI ( oder was anderes) , wenn Netzwerkadapter oder Modem connected/disconnected ?

Gruss

S
125 Beiträge seit 2005
vor 18 Jahren

Hallo Knopper.

Da ich mich selber erst seit 4 Tagen mit WMI beschäftige, bin ich damit auch noch nicht so vertraut.

Es funktioniert zwar, aber die bekomme Fehlermeldung in der Zeile:

Console.WriteLine((UInt16) Maobj["Availability"]);

keine Ahnung warum ????

Ähm... welche Fehlermeldung ??? 8)
Könnte sein das für dein Modem dieser Wert nicht geliefert werden kann. Hatte ich z.B. beim MotherBoard oder der CPU (glaub ich).

Andere Frage: Wie bekomme ein Event von WMI ( oder was anderes) , wenn Netzwerkadapter oder Modem connected/disconnected ?

Du könntest in regelmäßigen Abständen überprüfen, ob die Verbindung noch besteht. Falls nicht, ... connecten.
Sollte so schwer nicht sein. Nur nicht klein kriegen lassen. 😉

Poste wie gesagt mal deine Fehlermeldung, ist schon spät und ich kann auf den 1. und 2. ( 😁 ) Blick, keinen Fehler entdecken.

Mfg SGT_BOB

*************************
Ich bin root, ich darf das... 😜
root>_
*************************

H
63 Beiträge seit 2005
vor 18 Jahren

Ansonsten ist der direkte Weg der Weg über die RAS API.


    [DllImport("Rasapi32.dll", EntryPoint="RasEnumConnectionsA", SetLastError=true)]
    internal static extern int RasEnumConnections (
      ref RASCONN lprasconn, // buffer to receive connections data
      ref int lpcb,          // size in bytes of buffer
      ref int lpcConnections // number of connections written to buffer
      );
    [DllImport("rasapi32.dll",CharSet=CharSet.Auto)]
    internal static extern uint RasGetConnectionStatistics (
      IntPtr hRasConn,        // handle to the connection
      [In,Out]RasStats lpStatistics  // buffer to receive statistics
      );

//brauchst Du auch:
	[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Auto)]
	internal struct RASCONN 
	{ 
		public int     dwSize; 
		public IntPtr  hrasconn; 
		[MarshalAs(UnmanagedType.ByValTStr,SizeConst=(int)RasFieldSizeConstants.RAS_MaxEntryName+1)]
		public string  szEntryName; 
		[MarshalAs(UnmanagedType.ByValTStr,SizeConst=(int)RasFieldSizeConstants.RAS_MaxDeviceType+1)]
		public string  szDeviceType; 
		[MarshalAs(UnmanagedType.ByValTStr,SizeConst=(int)RasFieldSizeConstants.RAS_MaxDeviceName+1)]
		public string  szDeviceName; 
		[MarshalAs(UnmanagedType.ByValTStr,SizeConst=260)]//MAX_PAPTH=260
		public string  szPhonebook;
		public int		 dwSubEntry;
		public GUID		 guidEntry;
		#if (WINVER501)
		 int           dwFlags;
		 public LUID   luid;
		#endif
	}



Zwei WinAPI Funktionen. Mit der ersten bekomme ich eine Liste aller Verbindungen und mit der zweiten kann ich mir dann erweiterte Informationen zun den Verbindungen anzeigen lassen.


			RASCONN lprasConn = new RASCONN();			
			lprasConn.dwSize = Marshal.SizeOf(typeof(RASCONN));
			lprasConn.hrasconn = IntPtr.Zero;
			
			int lpcb = 0;
			int lpcConnections = 0;
			int nRet = 0;
			lpcb = Marshal.SizeOf(typeof(RASCONN));
	
      //die aktiven RAS Verbindungen einlesen
			nRet = RasEnumConnections(ref lprasConn, ref lpcb, ref lpcConnections);			
			
			if(nRet != 0)
			{
				m_connected = false;
				return;
			}
...

Viel Spass,

Warum so einfach, wenn's auch kompliziert geht !

K
knopper Themenstarter:in
40 Beiträge seit 2005
vor 18 Jahren

Hallo SGT_BOB,

In der Zeile:

Console.WriteLine((UInt16) Maobj["Availability"]);

bekomme ich :

An unhandled exception of type 'System.NullReferenceException' occurred in windaimip.exe

Additional information: Object reference not set to an instance of an object.

Availability uint16
Read-only

Availability and status of the device. Power Save - Unknown indicates that the device is known to be in a power save mode, but its exact status is unknown; Power Save - Low Power Mode indicates that the device is in a power save state but still functioning, and may exhibit degraded performance; Power Save - Standby indicates that the device is not functioning but could be brought to full power quickly; and Power Save - Warning indicates that the device is in a warning state, though also in a power save mode.

Values are:
1 = Other
2 = Unknown
3 = Running/Full Power
4 = Warning
5 = In Test
6 = Not Applicable
7 = Power Off
8 = Off Line
9 = Off Duty
10 = Degraded
11 = Not Installed
12 = Install Error
13 = Power Save - Unknown
14 = Power Save - Low Power Mode
15 = Power Save - Standby
16 = Power Cycle
17 = Power Save - Warning

????????

Ich habe den RASAPI-Wrapper von Heron probiert. Es ist sehr hilfreich.
Es zeigt aber nicht szDeviceName und szDevicszDeviceType.

Aufdem Bildschirm zeigt nur "?????0"

				Console.WriteLine(lprasConn.szEntryName);  
				Console.WriteLine(lprasConn.szDeviceType);  

Ich brauche den Name wie bei Win32_POTSModem.

Zeit es bei Dir auch so was an , Heron ?

Gruss

S
125 Beiträge seit 2005
vor 18 Jahren

Jepp, das kenn ich. 😁 Das heißt dann soviel das für dieses Gerät (in deinem Falle das Modem) die "Availability" nicht existiert.
Hab ich auch mit dem BIOS (z.B.).

Dadurch versuchst du "nichts" zu referenzieren, also auf "nichts" zu zeigen. Brauchst du aber auch nicht unbedingt. Lass diese Eigenschaft einfach mal weg.

Ich hab schon mit vielen solchen Dingen zu tun gehabt.

Den Namen solltest du aber auch über WMI herausbekommen.
"Caption" oder "Name", evtl. auch Description. Wirste wohl mal etwas herumprobieren müssen.

Mich würde aber mal interessieren, ob denn alles andere so funktioniert, was du da vorhattest.

Mfg SGT_BOB

*************************
Ich bin root, ich darf das... 😜
root>_
*************************

K
knopper Themenstarter:in
40 Beiträge seit 2005
vor 18 Jahren

Hi SGT_BOB,

Also es lieg bei Bios.
Ich habe den Code hier:
http://www.codeproject.com/aspnet/webdialup.asp

probiert. Aber ich bekomme nicht den Namen der aktiven dfü verbindung.

von dieser Seite geht das aber:

http://www.aspemporium.com/howto.aspx?hid=34

Nun meine andere Frage:

Weisst Du wie ich den aktuellen MAC Adresse von der PPP Verbindung bekomme. Also inkl. Gateway und Modem MAc.
Eigentlich geht das mit WMI, aber das ist nicht richtige MAC ?!

Die Mac Adressen sieht man im Etherreal.

Gruss

S
125 Beiträge seit 2005
vor 18 Jahren

Hallo knopper.

Also was genaues kann ich nicht sagen, wie schon erwähnt, mach ich das auch noch nicht so lange.

Aber die MAC-Adresse könntest/solltest du über Win32_NetworkAdapter --> MACAddress bekommen. Schließlich ist ja auch dein Modem ein Netzwerkgerät. Mit der richtigen MAC-Adresse kann daran liegen das du evtl. noch ein anderes Netzwerkgerät (NW-Karte, oder so) eingebaut hast und dessen MAC bekommst. Bin mir aber nicht sicher.

Den Namen der Verbindung könntest du evtl. mit Win32_NetworkConnection

Es gibt bei MSDN zwei Kategorien von den benutzten Win32-Klassen:

  1. Computer System Hardware Classes (für allgemeine Hardware-Dinge)
  2. Operating System Classes (alles was dein System angeht, in Bezug auf dein OS, also in deinem Fall den Verbindungsnamen)

Wie gesagt bin ich auch erst WMI-Anfänger, aber ich bin mir sicher das wie oben beschrieben funktioniert. Nur nicht kleinkriegen lassen. 😉

Mfg SGT_BOB

*************************
Ich bin root, ich darf das... 😜
root>_
*************************