Ich versuche gerade einen Client remote über die IP-Adresse zu wecken. Dazu habe ich die Clients aus einer Datenbank abgefragt und dann jeden String in die IP-Adresse auflösungen lassen.
Leider bekomme ich einen Socket Error ConnectionRefused. An was kann dies liegen? Ich versuche über Port 53 ein WakeSignal zu senden. Muss ich den Client eventuell sonst noch irgendwie ansprechen?
Hier die Wake-Up Methode für den /die Clients
foreach (String str in OraList)
{
ips = Dns.GetHostAddresses(str);
foreach (IPAddress ip in ips)
{
Console.Write(ip + "\n");
TcpClient WakeClient = new TcpClient();
WakeClient.Connect(ip, 80);
}
}
}
ich hab den Fehler im Original auch nicht abgefangen, aber den ganzen Code im
if(PostBack) reingeschrieben.
Vorher Code (vorherige Version, ohne Exception Handler)
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Management;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class WMI : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
WMIRequired.Text = "Bitte geben Sie Ihre Suchkriterien ein. Es kann als Hostname auch die IP-Adresse angegeben werden";
if (IsPostBack)
{
string WMIHost;
WMIHost = WMITxt.Text;
ConnectionOptions WMIConnect = new ConnectionOptions();
WMIConnect.Impersonation = System.Management.ImpersonationLevel.Impersonate;
ManagementScope WMIMgmtScope;
WMIMgmtScope = new ManagementScope(new ManagementPath("\\\\" + WMIHost + "\\root\\CIMV2"), WMIConnect);
/* Damit die Daten nicht von einer DB kommen müssen wird eine DataTable im Arbeitsspeicher generiert
* 1. Die DataTable wird initiiert und der Name wird vergeben
* 2. Die Spalten müssen festgelegt werden, im ersten Schritt mit null initiiert und in einem weiteren
* Schritt werden den einzelnen Spalten Überschriften vergeben.
* 3. Die DataRow muss dann auch mit null initiiert werden.
* 4. Damit alle Objekte des ManagementObjectCollection als Row angelegt werden, wird die Wenge
* mit einer foreach-Schleife für die sequentielle Hinzufügung von Rows verwendet.
* 5. Die Rows müssen Namen aufweisen, diese müssen dann im DataView angegeben werden
* 6. Ist die DataTable erstellt so wird sie mit der Default View an ein DataGrid o. ä. gebunden.
* 7. Danach wird das Grid selbst an die Datenbindung gebunden.
*/
ObjectQuery WMIQuery = new ObjectQuery("Select * from Win32_NTLogEvent where SourceName='DCOM'");
ManagementObjectSearcher WMISrch = new ManagementObjectSearcher(WMIMgmtScope, WMIQuery);
ManagementObjectCollection WMIMenge = WMISrch.Get();
DataTable WMIDataTable = new DataTable("WMI Ergebnisse");
DataColumn WMIDataColu = null;
DataRow WMIDataRow = null;
WMIDataColu = WMIDataTable.Columns.Add("Event Code");
WMIDataColu = WMIDataTable.Columns.Add("ComputerNa");
WMIDataColu = WMIDataTable.Columns.Add("Quelle");
WMIDataColu = WMIDataTable.Columns.Add("Message");
foreach (ManagementObject man in WMIMenge)
{
WMIDataRow = WMIDataTable.NewRow();
WMIDataRow["Event Code"] = man["EventCode"];
WMIDataRow["ComputerNa"] = man["ComputerName"];
WMIDataRow["Quelle"] = man["SourceName"];
WMIDataRow["Message"] = man["Message"];
WMIDataTable.Rows.Add(WMIDataRow);
}
GridView1.DataSource = WMIDataTable.DefaultView;
GridView1.DataBind();
}
}
protected void WMIBtn_Click(object sender, EventArgs e)
{
}
}
und hier der Code, welcher eigentlich mit den gleichen Parametern arbeitet, aber in Methoden unterteilt ist.
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Management;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class WMI2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
reqCli.Text = "Bitte geben Sie den Host an (IP oder Hostname)";
reqPass.Text = "Bitte geben Sie ihr Passwort zu ihrem Benutzeraccount an";
reqUser.Text = "Bitte geben Sie ihre Benutzerkennung an";
if (IsPostBack)
{
ManagementDefinitions();
ManagementScopeDefinitions();
Tabellen_Erstellung();
}
}
protected void btnSubmit_Click(object sender, EventArgs e)
{
}
protected ManagementObjectCollection ManagementDefinitions()
{
/* In dieser Methode werden die WMI Abfragen und die Konstruktoren für die Objekt Menge
* festgelegt, sodass sie anderweitig nur per Prozeduraufruf zur Verfügung stehen.
* WMIWarning = WMI-Query welches die Typen gemäss selektierter Checkbox abfragt
* WMIObjSrch = Ein ManagementObjectSearcher der das WMI Repository nach den Query Krietieren
* abfrägt.
* WMITotal = Ista dass Ergebnis aus der WMIObjSrch Routine.
*/
ManagementScope WMIScope = ManagementScopeDefinitions();
WqlObjectQuery WMIWarning = new WqlObjectQuery("Select * from Win32_NTLogEvent where Type=" + "'" + EventLevel + "'");
ManagementObjectSearcher WMIObjSrch = new ManagementObjectSearcher(WMIScope, WMIWarning);
ManagementObjectCollection WMITotal = WMIObjSrch.Get();
/*
* Damit die Variable WMITotal auch in anderen Methoden verwendet werden kann wird sie hier mit einem
* Return Wert versehen, der dann in einer anderen x-belibiegen Mehtode wieder abgeholt, oder besser gesagt
* dessen Wert abgefragt werden kann.
*/
return WMITotal;
}
protected ManagementScope ManagementScopeDefinitions()
{
string WMIHostname = txtCli.Text;
string WMIUsername = txtUserna.Text;
string WMIPassword = txtPass.Text;
ConnectionOptions WMIConnectivity = new ConnectionOptions();
WMIConnectivity.Impersonation = ImpersonationLevel.Impersonate;
//WMIConnectivity.Username = WMIUsername;
//WMIConnectivity.Password = WMIPassword;
ManagementPath WMIPath = new ManagementPath(WMIHostname + "\\root\\CIMV2");
ManagementScope WMIScope = new ManagementScope(WMIPath, WMIConnectivity);
return WMIScope;
}
protected void Tabellen_Erstellung()
{
/* Diese Methode erstellt folgende Elemente:
* 1. Mit der DataTable wird eine neue DatenTabelle mit dem Namen WMITabelle erstellt. Diese heisst
* Eventlog Abfrage.
* 2. Anschliessend werden die Spalten (WMISpalte) erstellt und mit keinem Wert initialisiert.
* 3. Danach werden die Zeilen (WMITabeZeile) erstellt und auch hier werden keine Werte initialisiert.
* 4. Nun werden die einzelnen Spalten der Tabelle, samt Spaltenüberschrift hinzugefügt.
* WMISpalte = WMITabelle.Columns.Add("Ereignis ID");
*/
DataTable WMITabelle = new DataTable("Eventlog Abfrage");
DataColumn WMISpalte = null;
DataRow WMITabeZeile = null;
WMISpalte = WMITabelle.Columns.Add("Ereignis ID");
WMISpalte = WMITabelle.Columns.Add("Computername");
WMISpalte = WMITabelle.Columns.Add("Quelle");
WMISpalte = WMITabelle.Columns.Add("Beschreibung");
/* Die ManagementObjectCollection wird hier referenziert, da diese in der Mehtode ManagementDefinitions()
* als return-Wert angegeben wird. Durch diesen Schrittkann die Variable WMITotal auch in dieser hier
* erstellten Methode verwendet werden.
*/
ManagementObjectCollection WMITotal = ManagementDefinitions();
foreach (ManagementObject ob in WMITotal)
{
WMITabeZeile = WMITabelle.Rows.Add();
WMITabeZeile["Ereignis ID"] = ob["EventID"];
WMITabeZeile["Computername"] = ob["ComputerName"];
WMITabeZeile["Quelle"] = ob["SourceName"];
WMITabeZeile["Beschreibung"] = ob["Message"];
WMITabelle.Rows.Add(WMITabeZeile);
}
WMI2GrdVw.DataSource = WMITabelle.DefaultView;
WMI2GrdVw.DataBind();
}
}
Danke für die Hilfe. Eventuell kann es sein dass die return Werte falsch sind?
Serverfehler in der Anwendung /EventLog.
Ungültiger Namespace
Beschreibung: Unbehandelte Ausnahme beim Ausführen der aktuellen Webanforderung. Überprüfen Sie die Stapelüberwachung, um weitere Informationen über diesen Fehler anzuzeigen und festzustellen, wo der Fehler im Code verursacht wurde.
Ich habe meinen Code, so hoffe ich, ein wenig optmiert und versucht für einzelne Schritte auch Methoden zu schreiben. Bis der WMISearcher die Enumeration der Objekte erledigen soll klappt alles, aber dann sagt er mir Namespace nicht gefunden... Kann mir bitte jemand weiterhelfen? Danke schon im Voraus für eure Mühe. Hier noch mein Code...
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Management;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class WMI2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
reqCli.Text = "Bitte geben Sie den Host an (IP oder Hostname)";
reqPass.Text = "Bitte geben Sie ihr Passwort zu ihrem Benutzeraccount an";
reqUser.Text = "Bitte geben Sie ihre Benutzerkennung an";
if (IsPostBack)
{
ManagementScopeDefinitions();
ManagementDefinitions();
Tabellen_Erstellung();
}
}
protected void btnSubmit_Click(object sender, EventArgs e)
{
}
protected ManagementObjectCollection ManagementDefinitions()
{
/* In dieser Methode werden die WMI Abfragen und die Konstruktoren für die Objekt Menge
* festgelegt, sodass sie anderweitig nur per Prozeduraufruf zur Verfügung stehen.
* WMIWarning = WMI-Query welches die Typen gemäss selektierter Checkbox abfragt
* WMIObjSrch = Ein ManagementObjectSearcher der das WMI Repository nach den Query Krietieren
* abfrägt.
* WMITotal = Ista dass Ergebnis aus der WMIObjSrch Routine.
*/
string EventLevel = drpWerte.SelectedItem.ToString();
Response.Write(EventLevel);
ManagementScope WMIScope = ManagementScopeDefinitions();
WqlObjectQuery WMIWarning = new WqlObjectQuery("Select * from Win32_NTLogEvent where Type=" + "'" + EventLevel + "'");
ManagementObjectSearcher WMIObjSrch = new ManagementObjectSearcher(WMIScope, WMIWarning);
ManagementObjectCollection WMITotal = WMIObjSrch.Get();
/*
* Damit die Variable WMITotal auch in anderen Methoden verwendet werden kann wird sie hier mit einem
* Return Wert versehen, der dann in einer anderen x-belibiegen Mehtode wieder abgeholt, oder besser gesagt
* dessen Wert abgefragt werden kann.
*/
return WMITotal;
}
protected ManagementScope ManagementScopeDefinitions()
{
string WMIHostname = txtCli.Text;
string WMIUsername = txtUserna.Text;
string WMIPassword = txtPass.Text;
ConnectionOptions WMIConnectivity = new ConnectionOptions();
//WMIConnectivity.Username = WMIUsername;
//WMIConnectivity.Password = WMIPassword;
ManagementPath WMIPath = new ManagementPath(WMIHostname + "\\root\\CIMV2");
WMIConnectivity.Impersonation = ImpersonationLevel.Impersonate;
ManagementScope WMIScope = new ManagementScope(WMIPath, WMIConnectivity);
return WMIScope;
}
protected void Tabellen_Erstellung()
{
/* Diese Methode erstellt folgende Elemente:
* 1. Mit der DataTable wird eine neue DatenTabelle mit dem Namen WMITabelle erstellt. Diese heisst
* Eventlog Abfrage.
* 2. Anschliessend werden die Spalten (WMISpalte) erstellt und mit keinem Wert initialisiert.
* 3. Danach werden die Zeilen (WMITabeZeile) erstellt und auch hier werden keine Werte initialisiert.
* 4. Nun werden die einzelnen Spalten der Tabelle, samt Spaltenüberschrift hinzugefügt.
* WMISpalte = WMITabelle.Columns.Add("Ereignis ID");
*/
DataTable WMITabelle = new DataTable("Eventlog Abfrage");
DataColumn WMISpalte = null;
DataRow WMITabeZeile = null;
WMISpalte = WMITabelle.Columns.Add("Ereignis ID");
WMISpalte = WMITabelle.Columns.Add("Computername");
WMISpalte = WMITabelle.Columns.Add("Quelle");
WMISpalte = WMITabelle.Columns.Add("Beschreibung");
/* Die ManagementObjectCollection wird hier referenziert, da diese in der Mehtode ManagementDefinitions()
* als return-Wert angegeben wird. Durch diesen Schrittkann die Variable WMITotal auch in dieser hier
* erstellten Methode verwendet werden.
*/
ManagementObjectCollection WMITotal = ManagementDefinitions();
foreach (ManagementObject ob in WMITotal)
{
WMITabeZeile = WMITabelle.Rows.Add();
WMITabeZeile["Ereignis ID"] = ob["EventID"];
WMITabeZeile["Computername"] = ob["ComputerName"];
WMITabeZeile["Quelle"] = ob["SourceName"];
WMITabeZeile["Beschreibung"] = ob["Message"];
WMITabelle.Rows.Add(WMITabeZeile);
}
WMI2GrdVw.DataSource = WMITabelle.DefaultView;
WMI2GrdVw.DataBind();
}
}
Mit folgendem Code funktionierts. Leider stimmt meine Catch Anweisung nicht, sodass er bei der ComException fällt. Will heissen wenn der angesprochene Client nicht verfügbar ist schmiert mein Programm ab.
public partial class WMI : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
WMILbl.Text = "Bitte geben Sie Ihre Suchkriterien ein. Es kann als Hostname auch die IP-Adresse angegeben werden";
if (IsPostBack)
{
string WMIHost;
WMIHost = WMITxt.Text;
ConnectionOptions WMIConnect = new ConnectionOptions();
WMIConnect.Impersonation = System.Management.ImpersonationLevel.Impersonate;
ManagementScope WMIMgmtScope;
WMIMgmtScope = new ManagementScope(new ManagementPath("\\\\" + WMIHost + "\\root\\CIMV2"), WMIConnect);
/* Damit die Daten nicht von einer DB kommen müssen wird eine DataTable im Arbeitsspeicher generiert
* 1. Die DataTable wird initiiert und der Name wird vergeben
* 2. Die Spalten müssen festgelegt werden, im ersten Schritt mit null initiiert und in einem weiteren
* Schritt werden den einzelnen Spalten Überschriften vergeben.
* 3. Die DataRow muss dann auch mit null initiiert werden.
* 4. Damit alle Objekte des ManagementObjectCollection als Row angelegt werden, wird die Wenge
* mit einer foreach-Schleife für die sequentielle Hinzufügung von Rows verwendet.
* 5. Die Rows müssen Namen aufweisen, diese müssen dann im DataView angegeben werden
* 6. Ist die DataTable erstellt so wird sie mit der Default View an ein DataGrid o. ä. gebunden.
* 7. Danach wird das Grid selbst an die Datenbindung gebunden.
*/
ObjectQuery WMIQuery = new ObjectQuery("Select * from Win32_NTLogEvent where SourceName='DCOM'");
ManagementObjectSearcher WMISrch = new ManagementObjectSearcher(WMIMgmtScope, WMIQuery);
ManagementObjectCollection WMIMenge = WMISrch.Get();
DataTable WMIDataTable = new DataTable("WMI Ergebnisse");
DataColumn WMIDataColu = null;
DataRow WMIDataRow = null;
WMIDataColu = WMIDataTable.Columns.Add("Event Code");
WMIDataColu = WMIDataTable.Columns.Add("ComputerNa");
WMIDataColu = WMIDataTable.Columns.Add("Quelle");
WMIDataColu = WMIDataTable.Columns.Add("Message");
foreach (ManagementObject man in WMIMenge)
{
WMIDataRow = WMIDataTable.NewRow();
WMIDataRow["Event Code"] = man["EventCode"];
WMIDataRow["ComputerNa"] = man["ComputerName"];
WMIDataRow["Quelle"] = man["SourceName"];
WMIDataRow["Message"] = man["Message"];
WMIDataTable.Rows.Add(WMIDataRow);
}
GridView1.DataSource = WMIDataTable.DefaultView;
GridView1.DataBind();
}
}
protected void WMIBtn_Click(object sender, EventArgs e)
{
}
}
in einem anderen Post habe ich meinen Code für ne Remote WMI Abfrage gepostet. Nun konnte ich ihn dank eurer Hilfe so abändern, dass er auch funktioniert (bis zu einem gewissen Part).
Wenn er dann die WMI-Abfrage auf dem entfernten Client durchführen will, krieg ich einen Win32ServiceProcess Access denied Meldung, obwohl ich beim Verbinden mich "Impersonate" und auch mit User-ID und Passwort daherkomme...
Wäre sehr froh wenn jemand von euch einen Ansatz wüsste...
Hallo zusammen
Da ich die DataTable nun begriffen habe, wollte ich meine WMI Abfragen ein bisschen genereller gestalten, sodass ich x ein Host auswählen kann. Leider funktioniert dies nicht ganz, ich bekomme zwar keine Error-Meldung, aber auch keine Ergebnisse obwohl ich weiss dass da welche vorhanden sind:
protected void WMIBtn_Click(object sender, EventArgs e)
{
/* Beschreibung des Source Codes
* 1. der WMI Queri ruft die angegebenen Parameter über ein Select Queryim WMI Repository auf
* 2. Der ObjectSearcher ruft im WMI-Repository alle Objekte auf die dem Query entsprechen
* 3. Die ManagementCollection stellt das Ergebnis das
* 4. Eine Textbox für den Input wird erstellt, damit ein eingegebener Wert abgefragt werden kann
* 5. Der Button führt dann die Abfrage aus
* 6. Zusätzlich muss eine Verbindung aufgebaut werden.
*/
string WMIHost;
string Loginna;
string Loginpw;
Loginna = WMIUserName.Text;
Loginpw = WMIUserPass.Text;
WMIHost = WMITxt.Text;
string Scopepath = "\\" + WMIHost + "\\root\\CIMV2\\";
ConnectionOptions WMIConnect = new ConnectionOptions();
WMIConnect.Username = Loginna;
WMIConnect.Password = Loginpw;
ManagementScope WMIMgmtScope = new ManagementScope();
WMIMgmtScope = new ManagementScope(WMIHost + (new ManagementPath("\\root\\CIMV2\\")), WMIConnect);
/* Damit die Daten nicht von einer DB kommen müssen wird eine DataTable im Arbeitsspeicher generiert
* 1. Die DataTable wird initiiert und der Name wird vergeben
* 2. Die Spalten müssen festgelegt werden, im ersten Schritt mit null initiiert und in einem weiteren
* Schritt werden den einzelnen Spalten Überschriften vergeben.
* 3. Die DataRow muss dann auch mit null initiiert werden.
* 4. Damit alle Objekte des ManagementObjectCollection als Row angelegt werden, wird die Wenge
* mit einer foreach-Schleife für die sequentielle Hinzufügung von Rows verwendet.
* 5. Die Rows müssen Namen aufweisen, diese müssen dann im DataView angegeben werden
* 6. Ist die DataTable erstellt so wird sie mit der Default View an ein DataGrid o. ä. gebunden.
* 7. Danach wird das Grid selbst an die Datenbindung gebunden.
*/
String WMIQuery = "Select EventCode, SourceName, ComputerName, Message from Win32_NTLogEvent where SourceName='DCOM'";
ManagementObjectSearcher WMISrch = new ManagementObjectSearcher(WMIQuery);
ManagementObjectCollection WMIMenge = WMISrch.Get();
DataTable WMIDataTable = new DataTable("WMI Ergebnisse");
DataColumn WMIDataColu = null;
DataRow WMIDataRow = null;
WMIDataColu = WMIDataTable.Columns.Add("Event Code");
WMIDataColu = WMIDataTable.Columns.Add("ComputerNa");
WMIDataColu = WMIDataTable.Columns.Add("Quelle");
WMIDataColu = WMIDataTable.Columns.Add("Message");
foreach (ManagementObject man in WMIMenge)
{
WMIDataRow = WMIDataTable.NewRow();
WMIDataRow["Event Code"] = man["EventCode"];
WMIDataRow["ComputerNa"] = man["ComputerName"];
WMIDataRow["Quelle"] = man["SourceName"];
WMIDataRow["Message"] = man["Message"];
WMIDataTable.Rows.Add(WMIDataRow);
}
GridView1.DataSource = WMIDataTable.DefaultView;
GridView1.DataBind();
}
}
Nun vielleicht hab ich mit der Notation einen Fehler, habe aber leider nichts gefunden, weder im Web noch hier im Forum. Danke für eure Hilfe.
Ich gehe die Objekte im WMI durch und möchte diese dann von der WMI ManagementObjectCollection die Werte die ich abgefragt habe in die Tabelle speichern. Nun müsste ich ja dies folgendermassen bewerkstelligen.
foreach(ManagementObject man in WMIMenge.Get())
{
Interative Füllung der Tabellenfelder
}
{/CSHARP]
Danke für weitere Tipps.
Gruss
Daniel
Hallo zusammen
Ich bin neu und bin momentan an einem Problem, dessen Lösung ich leider nicht mehr ganz so sehe. Darum wäre ich für Hilfe sehr dankbar.
Ziel ist es eine WMI Abfrage von C# aus (ASP.NET) zu tätigen, die Ergebnisse dann in einer foreach Schleife ausgeben und dann die Spalten, Attributnamen an das DataView binden möchte.
leider erhalte ich nach der versuchten Kompilierung den Fehler "Datenquelle verfügt nicht über die von Ihnen angegebene Datenquelle".