Der saubersten Ansatz ist es, einen Befehlszeilenparameter zu verwenden, die Sie auf dem Weg sind in dem Schlüssel Run
Registry angegeben. Natürlich gibt es nichts, was den Benutzer daran hindern könnte, die App manuell mit demselben Befehlszeilenparameter auszuführen.
Eine andere Option besteht darin, einen Launcher zu erstellen, der die Hauptanwendung ausführt. Erstellen Sie entweder eine Launcher-App, die von der Registrierung ausgeführt wird, oder einen Launcher-Dienst, der automatisch mit Windows startet und die Haupt-App startet, wenn sich ein Benutzer anmeldet. Dann können Sie alle Dinge tun, damit die Haupt-App erkennt, wann sie ausgeführt wird der Launcher:
Machen die beiden miteinander kommunizieren mit Rohren, Fenstermeldungen usw.
Haben die Trägerrakete passieren einen geheimen Wert im STARTUPINFO::lpReserved
oder STARTUPINFO::lpReserved2
Feld, wenn CreateProcess()
Aufruf (siehe this article für weitere Details).
Lassen Sie die Hauptanwendung überprüfen, ob ihre Elternprozess-ID die ausführbare Startprogramm ist (und ja, dort IST ein Konzept eines übergeordneten Prozesses in Windows). Siehe CreateToolhelp32Snapshot()
und Process32First()
/Process32Next()
. Die PROCESSENTRY32
Struktur hat ein th32ParentProcessID
Feld. Sie können den Dateinamen für diese Prozess-ID extrahieren.
Lassen Sie den Launcher ein Kernel-Objekt erstellen, das launched process can inherit.
etc, etc, etc.
Aber auch hier gibt es nichts, um den Benutzer zu verhindern, nur den Launcher manuell ausgeführt wird, oder einen Launcher Service zu töten und einen neuen Starter App zu schreiben, das Original zu imitieren Verhalten.
Am besten bleiben Sie einfach mit dem Befehlszeilenparameter und sorgen Sie sich nicht um Benutzer, die versuchen, es zu fälschen. Einfache Benutzer werden wahrscheinlich nicht einmal von der Registrierung oder der Befehlszeile wissen, und erfahrene Benutzer werden sie wahrscheinlich ignorieren. Böswillige Benutzer werden wahrscheinlich herausfinden, wie Sie Ihre Erkennungen umgehen oder sie einfach deaktivieren/ersetzen können.
Gibt es einen besonderen Grund, warum Sie Befehlszeilenargumente vermeiden möchten?Ich kann mir keinen saubereren Weg vorstellen, um das zu tun, was du verlangst. –
Sie sollten die Einrichtung haben, die Ihre Anwendung startet * sagen Sie * es ist getan; Eine Befehlszeile ist dafür die beste Option. Sie würden sich wahrscheinlich nicht mit "-user" beschäftigen und annehmen, dass es, wenn es keine Befehlszeile gibt, manuell von der Shell gestartet wurde. –
Verwenden Sie Befehlszeilenparameter. Was ist an einem System, das bekanntermaßen funktioniert, nicht zu mögen? –