Laden...

..Namespace nicht vorhanden

Erstellt von schaedld vor 18 Jahren Letzter Beitrag vor 18 Jahren 4.251 Views
schaedld Themenstarter:in
1.433 Beiträge seit 2006
vor 18 Jahren
..Namespace nicht vorhanden

Hallo zusammen

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();
    }
}

Wäre um jede Hilfe sehr dankbar.
Gruss

Daniel

Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt

2.223 Beiträge seit 2005
vor 18 Jahren

moin

haste vieleicht die dll nicht eingebunden?

mfg

schaedld Themenstarter:in
1.433 Beiträge seit 2006
vor 18 Jahren

ich habe die DLL nun mit einem Verweis hinzugefügt, aber leider immer noch dasselbe Ergebnis... 🙁

Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt

2.223 Beiträge seit 2005
vor 18 Jahren

noch eine mögliche fehler quelle ist die dll von dir erstellt ?

wenn ja dann könnte die klasse private sein

wenn nein dann hätte ich jetzt erstmal keine idee mehr

mfg

S
1.047 Beiträge seit 2005
vor 18 Jahren

welcher namespace wurde denn nicht gefunden?

schaedld Themenstarter:in
1.433 Beiträge seit 2006
vor 18 Jahren

Er sagt mir nicht welcher. Den System.Management Namespace habe ich bereits importiert...

Der Code ist gleich aufgebaut wie ein Beispiel von mir im Win32System... Thema, aber mit mehreren Methoden versehen.

Er hat ein Problem beim WMISrch.get().

Ich frage mich ob er den WMI-Namespace meint oder den von C#

Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt

schaedld Themenstarter:in
1.433 Beiträge seit 2006
vor 18 Jahren

Diese Fehler erhalte ich im Browser:

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.

Ausnahmedetails: System.Management.ManagementException: Ungültiger Namespace

Quellfehler:

Zeile 47: WqlObjectQuery WMIWarning = new WqlObjectQuery("Select * from Win32_NTLogEvent where Type=" + "'" + EventLevel + "'");
Zeile 48: ManagementObjectSearcher WMIObjSrch = new ManagementObjectSearcher(WMIScope, WMIWarning);
Zeile 49: (ManagementObjectCollection WMITotal = WMIObjSrch.Get();

Zeile 50:
Zeile 51: /*

Quelldatei: d:\Visual Studio 2005\EventLog\WMI2.aspx.cs Zeile: 49

Stapelüberwachung:

[ManagementException: Ungültiger Namespace
]
System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode) +219
System.Management.ManagementScope.InitializeGuts(Object o) +842
System.Management.ManagementScope.Initialize() +238
System.Management.ManagementObjectSearcher.Initialize() +215
System.Management.ManagementObjectSearcher.Get() +72
WMI2.ManagementDefinitions() in d:\Visual Studio 2005\EventLog\WMI2.aspx.cs:49
WMI2.Page_Load(Object sender, EventArgs e) in d:\Visual Studio 2005\EventLog\WMI2.aspx.cs:24
System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +31
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +68
System.Web.UI.Control.OnLoad(EventArgs e) +88
System.Web.UI.Control.LoadRecursive() +74
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3035

Versionsinformationen: Microsoft .NET Framework-Version:2.0.50727.42; ASP.NET-Version:2.0.50727.42

Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt

S
1.047 Beiträge seit 2005
vor 18 Jahren

schau mir eher aus als ob du vergessen hast da ne exception abzufangen die WMIObjSrch.Get() wirft...

wenn du folgendes mal änderst

ManagementObjectCollection WMITotal = WMIObjSrch.Get();

in


ManagementObjectCollection WMITotal = null;
try {
    WMITotal = WMIObjSrch.Get();
} catch (ManagementException ex) {
    //Fehlerbehandlung
}
return WMITotal;

so sollte der teil des codes ohne probs gehen... allerdigns wird dann null zurück gegeben im fehlerfall, müßtest du also noch prüfen vor weiterverarbeitung.... sonst bekomsmt ne NullPointerException

wähle das nächste mal bitte nen anderen titel, weil aus dem entnehme ich ehr ein problem beim compilieren aber das is ein laufzeitfehler der durch falsche parameter auftritt, und den du nicht abfängst

schaedld Themenstarter:in
1.433 Beiträge seit 2006
vor 18 Jahren

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?

Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt

schaedld Themenstarter:in
1.433 Beiträge seit 2006
vor 18 Jahren

Diesen Fehler hier erhalte ich:

System.Management.ManagementException {"Ungültiger Namespace\r\n"}

Ich bin mir nicht sicher, aber wo hat der dass Problem? Mein WMI Verzeichnis ist doch richtig im Code

\\%servername%\root\CIMV2...

Gruss
Daniel

Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt

S
1.047 Beiträge seit 2005
vor 18 Jahren

laß dir einfach mal bei beiden versionen den namespace ausgeben, bevor du ihn benutzt... vielleicht sind sie ja doch nicht identisch...

schaedld Themenstarter:in
1.433 Beiträge seit 2006
vor 18 Jahren

wie mache ich dass? (sorry für die blöde Frage)

Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt

S
1.047 Beiträge seit 2005
vor 18 Jahren

genauso wie du das hier machst z.B.


WMIRequired.Text = "Bitte geben Sie Ihre Suchkriterien ein. Es kann als Hostname auch die IP-Adresse angegeben werden";

ich arbeite nicht mit asp.net darum k.a. was für möglichkeiten da wirklich sinnvoll sind