2016-07-15 24 views
1

ショートカットを使用して別のプロセスまたはウィンドウが開始されたかどうかを確認することはできますか?その目的は、スタートアップの設定を取得するためのショートカットを読むことです:スタートインフォルダ、管理者として実行するなどです。プログラムの呼び出し元/呼び出し元(管理者権限/ショートカットのユーザー/アプリケーション) ?プロセスがショートカットから開始されたかどうかを確認する

私はWindowsドライバキットをdetermine itに使用しています。これは他のものの中で発展するのはやや難しいですが。

+0

昇格された権限とカスタムコマンドラインを使用してプロセスを開始する方法はたくさんあります。ユーザーはコンソールを使用することができ、サービスはSCMなどによって実行されます。リンクされたアプローチが最適であり、DDKの使用を必要とせず、すべてのネイティブAPI関数と構造を自分で定義することができます。 – Ari0nhh

+0

あなたのアプリケーション環境を調べることもできます:現在のフォルダはスタートインフォルダになります。管理者のセキュリティトークンを持っているかどうかなどを確認します。 –

+1

リンクを確認する理由はありません。起動フォルダは、プログラムが起動するときの現在の作業ディレクトリです。実行はadminで、プロセスが適切なトークンを所有しているかどうかを判断できます。私は、lnkファイルを探す必要は全く見当たりません... – xMRi

答えて

7

ショートカットを使用して別のプロセス/ウィンドウが開始されたかどうかを確認することはできますか?

はい、しかし容易ではありません。自身がGetStartupInfo()を呼び出して、STARTF_TITLEISLINKNAMEフラグをチェックすることによって、ショートカットで起動した場合

a similar questionan answerで述べたように、プロセスは見つけることができます。これは、MSDNで文書化されています。

GetStartupInfo function

は、呼び出し元のプロセスの作成時に指定されたSTARTUPINFO構造体の内容を取得します。プロセスはウインドウを作成するときに特定のSTARTUPINFO部材が使用されているか否かを判断

STARTUPINFO structure

dwFlagsパラメータ
ビットフィールド。このメンバは、次の値の1つ以上です。

...
STARTF_TITLEISLINKNAME
0x00000800
はlpTitle部材は、ユーザがこのプロセスを開始するために呼び出されることがショートカットファイル(.LNK)のパスを含みます。これは通常、起動されたアプリケーションを指すファイル.lnkが呼び出されたときにシェルによって設定されます。ほとんどのアプリケーションでは、この値を設定する必要はありません。

あなたは.lnkファイルへのパスを持っていたら、(詳細はShell Linksを参照)、必要に応じてIShellLinkインタフェースを使用してそれを解析することができます。

は今、言われていることを、あなたは直接別のプロセスSTARTUPINFO構造を取得することはできません。しかし、あなたは(CreateRemoteThread()またはSetWindowsHookEx()を使用して)、ターゲットプロセスにコードを注入することにより、間接的にをそれを取得し、そのコードの呼び出しGetStartupInfo()を持っており、名前のあなたが選んだのIPC mechanismWM_COPYDATAを使用して、戻ってあなたのプロセスに必要な情報を通信することができます。パイプ、メールスロット、ソケット、COM、RPCなど)。

または、.lnkファイル名を含む同じSTARTUPINFOフィールド値の多くを取得するための非公式な方法(OSバージョンに従います)があり、ターゲットプロセスにコードを挿入しません。(STARTUPINFOからの値を含む他のフィールドの中で)WindowTitleフィールドを有するRTL_USER_PROCESS_PARAMETERS 構造体へのポインタであるProcessParametersフィールドを有する対象プロセスのPEB 構造体へのポインタを取得するNtQueryInformationProcess()を使用します。あなたは(あなたがGetWindowThreadProcessId()を使用してHWNDのプロセスIDを取得することができます)ターゲット・プロセスにHANDLEを取得するためにOpenProcess()を使用し、必要に応じてPEBRTL_USER_PROCESS_PARAMETERS構造の内容を読み取るためにReadProcessMemory()を使用することができます。

PEBRTL_USER_PROCESS_PARAMETERS構造の内容のほとんどは、MSDNで文書化されていませんが、http://undocumented.ntinternals.netherehere)に記載されています。

関連する問題