VBscript - WMI - ServerAddress + ConnectionStatus (Windows 7)
Hi zusammen,
ich kann "ServerAddress" + "ConnectionStatus" für eine VPN-Verbindung allein durch ihren Namen (z.B. "Work VPN") unter Windows 8+
problemlos bekommen, in dem ich den Namespace "root\Microsoft\Windows\RemoteAccess\Client" und die Klasse "PS_VpnConnection" benutze.
Der query sieht dann so aus:
SELECT * FROM PS_VpnConnection WHERE Name = "Work VPN"
objItem.ServerAddress + objItem.ConnectionStatus
liefern dann die benötigten Werte.
Mein Problem ist: Unter Windows 7 gibt es diesen Namespace leider nicht, er wurde erst mit Windows 8 eingeführt...
Kann mir jemand sagen, wie ich mit den Namespaces unter Windows 7 an die beiden Werte komme, wenn nur der
Name der VPN-Verbindung "vorhanden" ist?
Danke sehr!
ich kann "ServerAddress" + "ConnectionStatus" für eine VPN-Verbindung allein durch ihren Namen (z.B. "Work VPN") unter Windows 8+
problemlos bekommen, in dem ich den Namespace "root\Microsoft\Windows\RemoteAccess\Client" und die Klasse "PS_VpnConnection" benutze.
Der query sieht dann so aus:
SELECT * FROM PS_VpnConnection WHERE Name = "Work VPN"
objItem.ServerAddress + objItem.ConnectionStatus
liefern dann die benötigten Werte.
Mein Problem ist: Unter Windows 7 gibt es diesen Namespace leider nicht, er wurde erst mit Windows 8 eingeführt...
Kann mir jemand sagen, wie ich mit den Namespaces unter Windows 7 an die beiden Werte komme, wenn nur der
Name der VPN-Verbindung "vorhanden" ist?
Danke sehr!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 312404
Url: https://administrator.de/contentid/312404
Ausgedruckt am: 18.12.2024 um 19:12 Uhr
10 Kommentare
Neuester Kommentar
Hi,
you can use powershell and the DotRAS Library DLL
Output:
Regards
you can use powershell and the DotRAS Library DLL
$conn_name = 'Work VPN'
Add-Type -Path "D:\DotRas.dll"
$conn = [DotRas.RasConnection]::GetActiveConnections() | ?{$_.EntryName -eq $conn_name}
$conn.GetConnectionStatus()
ConnectionState : Connected
ErrorCode : 0
ErrorMessage :
Device : DotRas.RasDevice
PhoneNumber : 192.168.234.11
LocalEndPoint :
RemoteEndPoint : 192.168.234.11
ConnectionSubState : None
@129813 : Wenn man möchte kann man es auch ohne DLL in Powershell machen, ist zwar etwas mehr Code aber dafür ohne Abhängigkeit:
@Highend01 : Eine WMI Klasse für den Status von RAS Verbindungen ist mir für Windows 7 nicht bekannt, so eine gibt es dort nicht (außer für VPN Statistiken, übertragene Pakete etc.). Da wirst du wie hier eine zweite Skriptsprache anwenden müssen (Powershell lässt sich auch über VBS aufrufen wenn man will) oder man schreibt sich eine EXE die die gewünschten Infos zurück gibt.
Grüße Uwe
$connectionname = 'Work VPN'
Add-Type -TypeDefinition @'
using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
namespace VPN
{
public class RAS
{
private int rasConnectionsAmount;
const int MAX_PATH = 260;
const int RAS_MaxDeviceType = 16;
const int RAS_MaxPhoneNumber = 128;
const int RAS_MaxEntryName = 256;
const int RAS_MaxDeviceName = 128;
[DllImport("rasapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern int RasEnumConnections([In, Out] RASCONN lprasconn, ref int lpcb,ref int lpcConnections);
[DllImport("RASAPI32", SetLastError = true, CharSet = CharSet.Auto)]
static extern int RasGetConnectStatus(IntPtr hrasconn, ref RASCONNSTATUS lprasconnstatus);
public enum RASTUNNELENDPOINTTYPE
{
Unknown = 0,
IPv4 = 1,
IPv6 = 2
}
public enum RasConnectionSubState
{
Dormant = 1,
None = 0,
Reconnected = 0x2000,
Reconnecting = 2
}
[StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Auto)]
public struct RASCONN
{
public int dwSize;
public IntPtr hrasconn;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxEntryName + 1)]
public string szEntryName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxDeviceType + 1)]
public string szDeviceType;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxDeviceName + 1)]
public string szDeviceName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH)]
public string szPhonebook;
public int dwSubEntry;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct RASTUNNELENDPOINT
{
public RASTUNNELENDPOINTTYPE dwType;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x10)]
public byte addr;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct RASCONNSTATUS
{
public int dwSize;
public int rasconnstate;
public int dwError;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxDeviceType + 1)]
public string szDeviceType;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxDeviceName + 1)]
public string szDeviceName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxPhoneNumber + 1)]
public string szPhoneNumber;
public RASTUNNELENDPOINT localEndPoint;
public RASTUNNELENDPOINT remoteEndPoint;
public RasConnectionSubState connectionSubState;
}
public RASCONN GetRasConnections()
{
int rasEnumReturn;
RASCONN rasconnStructs = new RASCONN[256];
rasconnStructs.Initialize();
rasconnStructs.dwSize = Marshal.SizeOf(typeof(RASCONN));
int sizeOfRasconnStruct = rasconnStructs.dwSize * rasconnStructs.Length;
rasEnumReturn = RasEnumConnections(rasconnStructs, ref sizeOfRasconnStruct, ref rasConnectionsAmount);
if (rasEnumReturn != 0) {
throw new Win32Exception(rasEnumReturn);
}
return rasconnStructs;
}
public RASCONNSTATUS GetConnectionStatus(IntPtr conn)
{
RASCONNSTATUS rasConnStatus = new RASCONNSTATUS();
rasConnStatus.dwSize = Marshal.SizeOf(typeof(RASCONNSTATUS));
int statusResult = RasGetConnectStatus(conn, ref rasConnStatus);
if (statusResult != 0) throw new Win32Exception(statusResult);
return rasConnStatus;
}
}
}
'@
$vpn = New-Object VPN.RAS
$conn = $vpn.GetRasConnections() | ?{$_.hrasconn -ne 0 -and $_.szEntryName -eq $connectionname}
if ($conn){
$state = $vpn.GetConnectionStatus($conn.hrasconn)
if ($state.rasconnstate -band 0x2000){
"$connectionname is Connected to $(([ipaddress][byte[]]$state.remoteEndPoint.addr[0..3]).IPAddressToString)"
}
}else{
"$connectionname is not connected"
}
@Highend01 : Eine WMI Klasse für den Status von RAS Verbindungen ist mir für Windows 7 nicht bekannt, so eine gibt es dort nicht (außer für VPN Statistiken, übertragene Pakete etc.). Da wirst du wie hier eine zweite Skriptsprache anwenden müssen (Powershell lässt sich auch über VBS aufrufen wenn man will) oder man schreibt sich eine EXE die die gewünschten Infos zurück gibt.
Grüße Uwe
VBS does not support loading WIN32-Code (VBA instead does) so the possibility is very limited.
Take the c# code from colinardo an compile yourself an exe
Take the c# code from colinardo an compile yourself an exe
AutoHotKey verwende ich leider nicht.
Die Ausgabe der Consolen-EXE kannst du ja mit C# unten einfach an deine Bedürfnisse anpassen. ExitCodes geben dir einen Hinweis ob die Verbindung läuft oder nicht etc.
Hier mal auf die Schnelle die C# Konsolenanwendung, via Powershell-Kompilierung, gibt eine get-status.exe im aktuellen Verzeichnis aus von dem du das Skript aufrufst.
Die Exe rufst du dann mit dem Verbindungsnamen als ersten Parameter auf:
Ausgabe
ExitCode: 0 = Connected
ExitCode: 1 = Disconnected
ExitCode: 255 = anderer Fehler
Viel Erfolg, mehr Code gibt's hier von meiner Seite nicht mehr kostenlos
Grüße Uwe
Die Ausgabe der Consolen-EXE kannst du ja mit C# unten einfach an deine Bedürfnisse anpassen. ExitCodes geben dir einen Hinweis ob die Verbindung läuft oder nicht etc.
Hier mal auf die Schnelle die C# Konsolenanwendung, via Powershell-Kompilierung, gibt eine get-status.exe im aktuellen Verzeichnis aus von dem du das Skript aufrufst.
Die Exe rufst du dann mit dem Verbindungsnamen als ersten Parameter auf:
get-status.exe "Work VPN"
Status:Connected
Endpoint:192.168.1.95
ExitCode: 1 = Disconnected
ExitCode: 255 = anderer Fehler
Viel Erfolg, mehr Code gibt's hier von meiner Seite nicht mehr kostenlos
$code = @'
using System;
using System.Net;
using System.ComponentModel;
using System.Runtime.InteropServices;
namespace get_ras_status {
class Program {
static void Main(string args) {
if (args.Length == 1) {
try {
RAS r = new RAS();
RAS.RASCONNSTATUS conn = r.GetConnectionStatusByName(args);
if (conn.rasconnstate == 0x2000) {
byte ip_arr = new byte[4];
Array.Copy(conn.remoteEndPoint.addr, ip_arr, 4);
IPAddress remote_endpoint = new IPAddress(ip_arr);
Console.WriteLine(@"Status:Connected" + Environment.NewLine + "Endpoint:" + remote_endpoint.ToString());
ExitProg(0);
} else {
ExitProg(1,@"Status:Disconnected");
}
} catch (SystemException ex){
ExitProg(255,@"Unbekannter Fehler: " + ex.Message);
}
} else {
ExitProg(255,@"Parameterfehler: Bitte den Namen der VPN-Verbindung als einzigen Parameter angeben!");
}
}
static void ExitProg(int exitcode, string message = "") {
if (message != "") {
if (exitcode > 1) {
Console.Error.WriteLine(message);
} else {
Console.WriteLine(message);
}
}
Environment.Exit(exitcode);
}
}
}
public class RAS {
private int rasConnectionsAmount;
const int MAX_PATH = 260;
const int RAS_MaxDeviceType = 16;
const int RAS_MaxPhoneNumber = 128;
const int RAS_MaxEntryName = 256;
const int RAS_MaxDeviceName = 128;
[DllImport("rasapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern int RasEnumConnections([In, Out] RASCONN lprasconn, ref int lpcb, ref int lpcConnections);
[DllImport("RASAPI32", SetLastError = true, CharSet = CharSet.Auto)]
static extern int RasGetConnectStatus(IntPtr hrasconn, ref RASCONNSTATUS lprasconnstatus);
public enum RASTUNNELENDPOINTTYPE {
Unknown = 0,
IPv4 = 1,
IPv6 = 2
}
public enum RasConnectionSubState {
Dormant = 1,
None = 0,
Reconnected = 0x2000,
Reconnecting = 2
}
[StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Auto)]
public struct RASCONN {
public int dwSize;
public IntPtr hrasconn;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxEntryName + 1)]
public string szEntryName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxDeviceType + 1)]
public string szDeviceType;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxDeviceName + 1)]
public string szDeviceName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH)]
public string szPhonebook;
public int dwSubEntry;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct RASTUNNELENDPOINT {
public RASTUNNELENDPOINTTYPE dwType;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x10)]
public byte addr;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct RASCONNSTATUS {
public int dwSize;
public int rasconnstate;
public int dwError;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxDeviceType + 1)]
public string szDeviceType;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxDeviceName + 1)]
public string szDeviceName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxPhoneNumber + 1)]
public string szPhoneNumber;
public RASTUNNELENDPOINT localEndPoint;
public RASTUNNELENDPOINT remoteEndPoint;
public RasConnectionSubState connectionSubState;
}
public RASCONN GetRasConnections() {
int rasEnumReturn;
RASCONN rasconnStructs = new RASCONN[256];
rasconnStructs.Initialize();
rasconnStructs.dwSize = Marshal.SizeOf(typeof(RASCONN));
int sizeOfRasconnStruct = rasconnStructs.dwSize * rasconnStructs.Length;
rasEnumReturn = RasEnumConnections(rasconnStructs, ref sizeOfRasconnStruct, ref rasConnectionsAmount);
if (rasEnumReturn != 0) {
throw new Win32Exception(rasEnumReturn);
}
return rasconnStructs;
}
public RASCONNSTATUS GetConnectionStatusByName(string connectionName) {
RASCONNSTATUS rasConnStatus = new RASCONNSTATUS();
rasConnStatus.dwSize = Marshal.SizeOf(typeof(RASCONNSTATUS));
RASCONN connections = GetRasConnections();
for (int i = 0; i < connections.Length; i++) {
int statusResult = RasGetConnectStatus(connections[i].hrasconn, ref rasConnStatus);
//if (statusResult != 0) throw new Win32Exception(statusResult);
if (connections[i].szEntryName.ToLower() == connectionName.ToLower()) {
return rasConnStatus;
}
}
return (new RASCONNSTATUS());
}
}
'@
Add-Type -TypeDefinition $code -OutputAssembly "get-status.exe" -OutputType ConsoleApplication -Language CSharp
Keine Ursache, wünsch ich dir ebenfalls.
Grüße Uwe
Grüße Uwe