C# Process starten, passiert aber nix ?

J

Jonny9904

Gast
Hallo,

hab eine Frage:

und zwar möchte ich einen Process starten, der was tun soll.

Mein Code sieht bis jetzt so aus:

Code:
    string arguments = "shutdown -s -f -t 30";
     
    Process objProcess = new Process();
    objProcess.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
    objProcess.StartInfo.FileName = "cmd.exe";
     
    objProcess.StartInfo.Arguments = arguments;
    objProcess.Start();
    objProcess.WaitForExit();
    objProcess.Dispose();

es öffnet sich nur folgendes fenster:

Unbenannt.JPG

aber das Fenster tut nix ?!?

wo liegt denn der Fehler ??

Lg
 
Warum startest du cmd? Du solltest doch eigentlich shutdown starten.
So wie du es jetzt hast, startet er cmd mit shutdown als Parameter. Und das kann cmd nicht interpretieren, weil er diesen Parameter nicht kennt.
 
Zuletzt bearbeitet:
e-Laurin schrieb:
Warum startest du cmd? Du solltest doch eigentlich shutdown starten.
So wie du es jetzt hast, startet er cmd mit shutdown als Parameter. Und das kann cmd nicht interpretieren, weil er diesen Parameter nicht kennt.

Oder einfach
Code:
string arguments = "/C shutdown -s -f -t 30";

(falls es unbedingt über cmd laufen soll/muss).

Generell würde ich den Shutdown eher über WMI machen. Mehr Kontrolle, mehr Möglichkeiten. Wenn ich mich recht entsinne, möchte der TE auch einen Remote-Logoff oder Reboot (weiß ich grade nicht) realisieren.
 
ja des hätte ich so gemacht:

Code:
 System.Diagnostics.Process.Start(System.Environment.SystemDirectory + "\\shutdown.exe", "-s -f");

Des funktioniert auch :)


aber ich möchte folgendes machen:

Meinen PC im Netzwerk herunterfahren. Dafür möchte ich den Befehl
Code:
net use \\PCname /user:anmeldename password

wie mach ich das denn dann ??
 
Entweder machst du arguments = "/c shutdown -s -f -t 30";
oder
Process.Start("shutdown.exe", "-s -f -t 30");

edit:
oh, etwas spät :D
 
Der Vollständigkeit halber - für den nächsten Copy-Paster :D

Code:
enum ShutdownType
{
    Halt = 0x1,
    Reboot = 0x2
}

bool Shutdown( string targetMachine, string username, string password, string domain, ShutdownType type )
{
    try
    {
        ConnectionOptions opts = new ConnectionOptions
        {
            EnablePrivileges = true,
            Username = username,
            Password = password,
            Authority = string.Format( "ntlmdomain:{0}", domain )
        };

        ManagementScope scope = new ManagementScope( string.Format( @"\\{0}\root\CIMV2", targetMachine ), opts );
        scope.Connect();

        SelectQuery query = new SelectQuery( "Win32_OperatingSystem" );
        using ( ManagementObjectSearcher searcher = new ManagementObjectSearcher( scope , query ) )
        {
            var collection = searcher.Get();
            var mobj = collection.OfType<ManagementObject>().First();
            ManagementBaseObject parameters = mobj.GetMethodParameters( "Win32Shutdown" );
            parameters["Flags"] = (int)type;
            ManagementBaseObject method = mobj.InvokeMethod( "Win32Shutdown", parameters, null );
            object retVal = method["returnValue"];
            
            // Ich weiß grade nicht, ob retVal ein HR oder ein Bool ist -> ausprobieren oder in MSDN suchen
            // Würde von HR ausgehen, d.h. 0 = Erfolg
            return ((int)retVal == 0) ? true : false;
        }
    }
    catch ( ManagementException ex )
    {
        // WMI Fehler
    }
    catch ( UnauthorizedAccessException ex )
    {
        // keine Berechtigung
    }
    catch ( Exception ex )
    {
        // sonstige Fehler
    }

    return false;
}

Benutzen:
Code:
bool success = Shutdown( "FQDN", "USER", "PASSWORT", "DOMÄNE_ODER_ARBEITSGRUPPE", ShutdownType.Halt );

System.Management muss referenziert werden.
Möchtest du localhost damit herunterfahren, musst du die drei Parameter Username, Password und Authority auskommentieren.
 
Zurück
Oben