2010-11-24 8 views
5

Wir haben ein Produkt, das eine C# -Konsolen-App ist. Ist es möglich, die Ausführung nur von der Befehlszeile aus zu beschränken? Mit anderen Worten, Benutzer könnten es nicht von einem Skript oder einer anderen App aus aufrufen.C#: Beschränken, wie eine Konsolenanwendung aufgerufen werden kann

Wenn es ist, würde einige Beispielcode sehr geschätzt werden. Vielen Dank.

+0

Meinst du wirklich die DOS-Befehlszeile (command.com) oder die NT-Befehlszeile (cmd.exe)? Oder ist eine Konsolenanwendung in Ordnung? – CodesInChaos

+0

Und was versuchst du zu erreichen? Warum möchten Sie verhindern, dass andere Programme Ihr Programm starten? – CodesInChaos

+0

@CodeInChaos: Gute Punkte. Jede Konsolen-App ist in Ordnung. Ich möchte verhindern, dass die App als Teil eines anderen Produkts oder einer anderen Dienstleistung verwendet wird. – FunLovinCoder

Antwort

3

Sie können den Prozess, der Ihre Anwendung erstellt hat, mit dem hier angegebenen Code überprüfen: http://msdn.microsoft.com/en-us/netframework/aa569609.aspx#Question3. Um an der DOS-Befehlszeile gestartet zu werden, sollte der Elternprozess cmd.exe sein. Beachten Sie jedoch, wie von Colin aufgezeigt, dass dies leicht mit einem Batch-Skript umgangen werden kann. Sie können dies auch deaktivieren, indem Sie sicherstellen, dass die Eingabeaufforderungs-Argumente für cmd.exe null sind. Dazu müssen Sie WMI verwenden:
http://skysanders.net/subtext/archive/2010/04/11/using-wmi-to-fetch-the-command-line-that-started-all.aspx
Sie sollten auch überprüfen, die cmd.exe Bild aus System32-Ordner ist.

+0

Was ist der übergeordnete Prozess, wenn die Anwendung aus einem Batch-Skript gestartet wurde? –

+0

@Colin: Script-Host, denke ich. Ist es nicht? z.B. WSH – abatishchev

+0

Nein, ich habe es gerade versucht, es ist cmd.exe –

3

Ich glaube nicht, dass es möglich ist, den Unterschied zu erkennen.

Sicherlich ist der Elternprozess kein nützlicher Indikator. Dies ist, was Sie in den übergeordneten Prozess erhalten:

1. type app name into Command Prompt:  cmd.exe 
2. call app from batch script:   cmd.exe 
3. Double click on app or shortcut:  explorer.exe 
4. type app name into Run dialog box:  explorer.exe 

Wenn Sie beabsichtigen, 1. eine gültige Methode, um Ihr Programm zu starten, dann denke ich, nicht wahr 2. stoppen kann, was bedeutet, Ihre Anwendung sein kann genannt von jedem Skript oder ein beliebiges Programm (da es einfach ist, für ein anderes Programm eine 1 Zeile Batch-Skript zu erstellen und auszuführen)

(BTW, weiß jemand eine Möglichkeit, einen Tisch auf Stackoverflow zu bekommen?)

+0

Ist da Wie auch immer, den Großvater zu finden? Dann könnten Sie überprüfen, ob cmd.exe von etwas erzeugt wurde, das Sie erwarten, und nicht von einem Skript oder einem unbekannten Prozess? – FunLovinCoder

+0

Es gibt mehrere Möglichkeiten, einen Prozess zu starten, Task-Manager -> Datei -> Ausführen kommt mir in den Sinn, ich bin sicher, es gibt mehr, die mir nicht in den Sinn kommen. – Tergiver

+0

Oh ja, das waren nur Beispiele. Task-Planer wäre ein anderer. –

1

@ swisston Wenn Sie Ihre Konsolenanwendung von einer anderen eigenen Anwendung starten, möchte ich Ihnen "benannte Kernel-Objekte" empfehlen. Zum Beispiel Mutex. Sie können benannte Mutex in Ihrer übergeordneten App erstellen. Versuchen Sie anschließend im Hauptthread Ihrer untergeordneten Konsolenanwendung, diesen Mutex zu öffnen. Wenn Mutex (nicht gefunden) nicht geöffnet: Konsolenanwendung weiterhin keine Berechtigungen und muss geschlossen werden;) warten, ich werde einige Code für Sie;)

Edit: So ist es sehr einfach, Taktik. In Mutter App Ihren benannten Mutex erstellen:

Mutex mutex = new Mutex(true, "MyPermissions"); 

Dann in Ihrer Anwendung Prüfung Kind-Konsole, wenn Ihr Mutex existiert:

static bool CheckPermissions() 
    { 
     try 
     { 
      Mutex mutex = Mutex.OpenExisting("MyPermissions"); 
     } 
     catch (Exception ex) 
     { 
      return false; 
     } 

     return true; 
    } 

Wenn Ihre Konsole Anwendung ohne Ihre Stammanmeldung CheckPermissions Methode ausgeführt wurde, wird return false und Konsole muss geschlossen sein;)

+1

Das hilft nicht, da die übergeordnete App von überall aufgerufen werden kann. Sie haben das Problem nur um eine Ebene nach oben verschoben, ohne etwas zu lösen. – Tergiver

0

Ich stimme nicht mit dem, was Sie versuchen zu tun, aber hier ist eine Idee, die funktionieren könnte: erfordern eine Art von Benutzereingaben am Anfang des Programms, vielleicht eine Art von CAPTCHA (schwierig in der Befehlszeile zu tun, aber theoretisch möglich. Denken Sie ASCII-Kunst).

Verwandte Themen