Autor Beitrag
Net_Hans
Hält's aus hier
Beiträge: 11



BeitragVerfasst: So 28.02.10 17:44 
Hallo,

ich suche nach einer Möglichkeit um bei mehreren PC in meinem Netzwerk bestimmte Services / Dienst auslesen zu können. Mir reicht schon das ich den Status bestimmen kann, ich muss die Dienste weder starten noch stoppen können. Um auf die PCs zugreifen zu können, steht mir ein Windows Account ohne Administratorrechten zur Verfügung. Dieser User könnte allerdings Dienste auch starten und stoppen.

Welche Weg muss ich gehen um mein Ziel zu erreichen?

Hoffe ihr könnt mir helfen.

mfG Hans
Greenberet
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 339
Erhaltene Danke: 20

Win 10
C# (VS 2012), C++ (VS 2012/GCC), PAWN(Notepad++), Java(NetBeans)
BeitragVerfasst: So 28.02.10 20:25 
Keine Ahnung ob das ohne Administratorrechte geht( glaub es aber nicht ).
Du könntest aber mit der WMI Klasse Win32_Service arbeiten, die sollte dir alle nötigen Daten liefern.
Google einfach nach WMI C# da solltest genug treffer finden wie man die WMI klassen verwendet
Net_Hans Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mo 01.03.10 09:55 
Hallo Greenberet,

danke für den Hinweis, in welche Richtung ich mich informieren muss. Lieder bin ich mit der gesamten Problematik dann doch etwas überfordert da ich im Netz auch nicht das wieder finde was ich suche ... Entweder werden Infos nur auf dem Localhost ausgelesen oder die eigenen Klassen für das fernauslesen bekomm ich nicht zum laufen.

Kamm mir bitte jemand Beispiel für den fremdzugriff mittels WMI und Benutzernamen geben, welcher mit den Boardmitteln von Visual C# 2008 machbar ist?

Danke
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Mo 01.03.10 10:42 
Hallo,

Windows-Dienste kannst du mit der Klasse ServiceController auslesen. Ein einfaches Beispiel hierfür findest du zum Beispiel hier. Ich habe nirgends einen Hinweis gefunden, dass man Administrator sein muss. Du kannst es ja mal testen und dein Ergebnis für Alle an den Post anhängen.

Gruß Daniel
Net_Hans Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mo 01.03.10 14:20 
Hallo,

danke auch für den Hinweis mit dem ServiceControler. Aber leider bekomm ich auch den nicht so zum laufen.

Mit dem Folgenden Code bekomm ich die Fehlermeldung, das mir eventuell die Berechtigung fehlen.
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
           string strmachine = "<IP-ADRESSE>";
           ConnectionOptions options = new ConnectionOptions();
           options.Username = "<USERNAME>";
           options.Password = "<KENNWORT>";
           options.Authority = "ntdlmdomain:<MEINE_DOMAIN>";

           ServiceController[] xprServices;
           xprServices = ServiceController.GetServices(strmachine);

           string[,] aServices = new string[xprServices.Length + 15];
           int iElement = 1//the service number incrementor
           aServices[00] = "Service Name";
           aServices[01] = "Display Name";
           aServices[02] = "Status";
           aServices[03] = "Log on As";
           aServices[04] = "# of Dependencies";
           foreach (ServiceController sServices in xprServices)
           {

                   if (sServices.Status == ServiceControllerStatus.Running)
                   {
                       aServices[iElement, 0] = sServices.ServiceName;
                       aServices[iElement, 1] = sServices.DisplayName;
                       aServices[iElement, 2] = sServices.Status.ToString();
                       ManagementObject wmiService;
                       wmiService = new ManagementObject("Win32_Service.Name='" + sServices.ServiceName + "'");
                       wmiService.Get();
                       aServices[iElement, 3] = wmiService["StartName"].ToString();
                       aServices[iElement, 4] = sServices.ServicesDependedOn.Length.ToString();
                   }
           }


und bei diesem Ansatz, bekomm ich die Fehlermeldung, das ein Parameter ungültig ist.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
            ConnectionOptions options =
                new ConnectionOptions("MS_409""<USERNAME>""<KENNWORT>",
                "ntdlmdomain:<MEINE_DOMAIN>",
                System.Management.ImpersonationLevel.Impersonate,
                System.Management.AuthenticationLevel.Unchanged, true,
                null, System.TimeSpan.MaxValue);
            
            ManagementScope scope = new ManagementScope("\\\\<IP-ADRESSE>\\root\\cimv2", options);
            scope.Connect(); // Hier kommt die Fehlermeldung
            
            Query system for Operating System information
            ObjectQuery query = new ObjectQuery(
                "SELECT * FROM Win32_OperatingSystem");
            ManagementObjectSearcher searcher =
                new ManagementObjectSearcher(scope, query);

            ManagementObjectCollection queryCollection = searcher.Get();
            foreach (ManagementObject m in queryCollection)
            {
                MessageBox.Show("Computer Name : "+ m["csname"]);
            }


Kamm mir vielleicht jemand sagen, was ich an einem der codeausschnitte ändernmuss, damit ich zum Ziel komme.

DANKE für eure Hilfe
mfG Hans
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Mo 01.03.10 14:57 
Wenn du eine Fehlermeldung bekommst, wäre es hilfreich, wenn du diese hier vollständigen zeigst.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
            ServiceController[] services = ServiceController.GetServices();

            foreach (ServiceController service in services)
            {
                Console.WriteLine(string.Format("{0}: {1}", service.DisplayName, service.Status));
            }
funktioniert einwandfrei bei mir ...

ausblenden C#-Quelltext
1:
2:
3:
4:
public bool IsActive(string name, string machinename)
{
   return new ServiceController("dienst name""machine").Status == ServiceControllerStatus.Running;
}


Gruß Daniel
Net_Hans Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mo 01.03.10 15:42 
Hallo Daniel,

danke für die Info, aber leider bekomm ich hier wieder die Fehlermeldung, das ich eventuell nicht ausreichend rechte besichtze.
Leider kann ich mich an meinem PC nicht mit dem Benutzer anmelden, der auch auf die Server zugreifen kann. Ein Blick in die Eventlogs vom Server haben mir gezeigt, das der versuch den Dienst auszulesen angeschonben und vom System abgewiesen wurde. Des weiteren ist zu erkennen, das die Anfrage mit meinem Usernamen geschehen ist.

Demnach sollte deine Möglichkeit funktioniern, wenn ich eine Möglichkeit finde, nicht mit meinem Account diese Anfrage durchzuführen, sondern mit dem Funktions Account der mir zu Verfügung gestellt wurde.

Hast du da eine Idee?

Meine Idee mit folgendem Codezusatz
ausblenden C#-Quelltext
1:
2:
3:
4:
           ConnectionOptions options = new ConnectionOptions();
           options.Username = "<USERNAME>";
           options.Password = "<KENNWORT>";
           options.Authority = "ntdlmdomain:<MEINE_DOMAIN>";

hat leider nicht funktioniert.

gibt es noch weiter Möglichkeiten die Anfrage unter einem anderen account laufen zu lassen?

mfG Hans
Greenberet
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 339
Erhaltene Danke: 20

Win 10
C# (VS 2012), C++ (VS 2012/GCC), PAWN(Notepad++), Java(NetBeans)
BeitragVerfasst: Mo 01.03.10 20:24 
bist du sicher dass es "ntdlmdomain" ist und nicht "ntlmdomain" ?
Net_Hans Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mo 01.03.10 20:55 
Hmm sicher bin ich mir nicht,
ich hab die info von folgender Homepage:
msdn.microsoft.com/d...tions.authority.aspx

in folgenden Abschnitt wird die von mir angegeben Variante verwendet.
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
using System;
using System.Management;
public class RemoteConnect 
{
    public static void Main() 
    {
        // Build an options object for the remote connection
        // if you plan to connect to the remote
        // computer with a different user name
        // and password than the one you are currently using.
        // This example uses the default values.  
        ConnectionOptions options = 
            new ConnectionOptions();
        options.Authority = "ntdlmdomain:DOMAIN";

        // Make a connection to a remote computer.
        // Replace the "FullComputerName" section of the
        // string "\\\\FullComputerName\\root\\cimv2" with
        // the full computer name or IP address of the
        // remote computer.
        ManagementScope scope = 
            new ManagementScope(
            "\\\\FullComputerName\\root\\cimv2", options);
        scope.Connect();

        //Query system for Operating System information
        ObjectQuery query = new ObjectQuery(
            "SELECT * FROM Win32_OperatingSystem");
        ManagementObjectSearcher searcher = 
            new ManagementObjectSearcher(scope,query);

        ManagementObjectCollection queryCollection = searcher.Get();
        foreach ( ManagementObject m in queryCollection)
        {
            // Display the remote computer information
            Console.WriteLine("Computer Name : {0}"
                m["csname"]);
            Console.WriteLine("Windows Directory : {0}"
                m["WindowsDirectory"]);
            Console.WriteLine("Operating System: {0}",  
                m["Caption"]);
            Console.WriteLine("Version: {0}", m["Version"]);
            Console.WriteLine("Manufacturer : {0}"
                m["Manufacturer"]);
        }
    }
}


ich werde aber sobald ich morgen wieder auf Arbeit bin, deinen Vorschlag ausprobieren und dann hier das Resultat posten.

mfG Hans
Net_Hans Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Di 02.03.10 08:39 
So ich hab das mit deinem Vorschlag einmal versucht

user profile iconGreenberet hat folgendes geschrieben Zum zitierten Posting springen:
bist du sicher dass es "ntdlmdomain" ist und nicht "ntlmdomain" ?


und ich bin zumindest zu einem kleinen Teilerfolg gekommen.
user profile iconNet_Hans hat folgendes geschrieben Zum zitierten Posting springen:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
            ConnectionOptions options =
                new ConnectionOptions("MS_409""<USERNAME>""<KENNWORT>",
                "ntdlmdomain:<MEINE_DOMAIN>",
                System.Management.ImpersonationLevel.Impersonate,
                System.Management.AuthenticationLevel.Unchanged, true,
                null, System.TimeSpan.MaxValue);
            
            ManagementScope scope = new ManagementScope("\\\\<IP-ADRESSE>\\root\\cimv2", options);
            scope.Connect(); // Hier kommt die Fehlermeldung
            
            Query system for Operating System information
            ObjectQuery query = new ObjectQuery(
                "SELECT * FROM Win32_OperatingSystem");
            ManagementObjectSearcher searcher =
                new ManagementObjectSearcher(scope, query);

            ManagementObjectCollection queryCollection = searcher.Get();
            foreach (ManagementObject m in queryCollection)
            {
                MessageBox.Show("Computer Name : "+ m["csname"]);
            }


Wenn ich in diesem Code deine Anderung vornehme, kommt die Fehlermeldung nicht mehr, dafür aber die Meldung, das der Zugriff verweigert wurde.
Auf dem Server selber steht in keinem Eventlog etwas drin, das ich versucht habe mich zu verbinden ...
Somit vermute ich einmal, das die oben aufgeführte Variante bestimmte Benutzerrechte benötigt. Somit kann diesen Ansatz nicht weiter verfolgen, das ich diese Rechte nicht bekommen werde.

Bei dem von dir gezeigten Ansatz,
user profile icondanielf hat folgendes geschrieben Zum zitierten Posting springen:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
            ServiceController[] services = ServiceController.GetServices();

            foreach (ServiceController service in services)
            {
                Console.WriteLine(string.Format("{0}: {1}", service.DisplayName, service.Status));
            }
funktioniert einwandfrei bei mir ...

ausblenden C#-Quelltext
1:
2:
3:
4:
public bool IsActive(string name, string machinename)
{
   return new ServiceController("dienst name""machine").Status == ServiceControllerStatus.Running;
}


verbindest dich der Prozess "nur" mit dem falschen Username. Wenn man diese Routine noch dazu bringen könnte, das man Username und Kennwort sauber übergeben kann, könnte ich mir vorstellen, das es klappen könnte.

Hat vielleicht jemand eine Idee wie man dem ServicController ein Usernamen und Kennwort übergeben kann?

mfG Hans