• ベストアンサー

他のEXEが起動しているかの確認

お世話になります。 C++.net2003で開発しております。 あるのA.EXEが起動しているかの確認をしたいのですが、 他のユーザがA.EXEを起動しているかはどのように確認できるでしょうか? ※A.EXEに上書きする権限がないので、上書きできることで確認ができない。 ※A.EXEはMUTEXがローカルMUTEXしかもっていない。 以上よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8525/19378)
回答No.1

1.プロセスをリストする 2.リストしたプロセスのうち、ファイル名が「A.EXE」になっている物を探す(A.EXEがリネームされている場合はどうしようもない) 3.探したプロセスのメモリの特定部分を検査し、A.EXEかどうか確認する(例えば、コードブロックメモリの先頭にあるバージョン情報や、リソース情報を読み取る) //変数宣言 PROCESSENTRY32 *ProcessList; DWORD ProcessListSize; DWORD ProcessListCount; BOOL (WINAPI *lpfEnumProcessModules)(HANDLE, HMODULE *, DWORD, LPDWORD); DWORD (WINAPI *lpfGetModuleFileNameEx)(HANDLE, HMODULE, LPTSTR, DWORD); HINSTANCE hInstLib; //初期化部分 hInstLib = NULL; if (GetVersion() < 0x80000000) { //WinNT or WinXP hInstLib = LoadLibrary("PSAPI.DLL"); if (hInstLib) { lpfEnumProcessModules = (BOOL (WINAPI *)(HANDLE, HMODULE *, DWORD, LPDWORD)) GetProcAddress(hInstLib, "EnumProcessModules"); lpfGetModuleFileNameEx = (DWORD (WINAPI *)(HANDLE, HMODULE,LPTSTR, DWORD)) GetProcAddress(hInstLib,"GetModuleFileNameExA"); if (!lpfEnumProcessModules && !lpfGetModuleFileNameEx) { lpfEnumProcessModules = NULL; lpfGetModuleFileNameEx = NULL; FreeLibrary(hInstLib); hInstLib = NULL; } } } //プロセスのリスト関数 DWORD __fastcall GetProcessList(PROCESSENTRY32 *ProcList, DWORD ListSize, LPDWORD Needed) { DWORD Need = 0; DWORD SetCount = 0; HANDLE hSnapshot; HANDLE hProcess; PROCESSENTRY32 procent; HMODULE hMod; DWORD dwSize; CHAR szFileName[MAX_PATH]; hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); if (hSnapshot != (HANDLE)-1) { procent.dwSize = sizeof(PROCESSENTRY32); if (Process32First(hSnapshot,&procent)) { do { hProcess = OpenProcess(PROCESS_ALL_ACCESS, NULL, procent.th32ProcessID); if (hProcess) { if ((ListSize) && (ProcList)) { //WinNT or WinXP if (hInstLib) { if (lpfEnumProcessModules(hProcess, &hMod, sizeof(hMod), &dwSize)) if (lpfGetModuleFileNameEx(hProcess, hMod, szFileName, sizeof(szFileName))) { strncpy(procent.szExeFile,szFileName,MAX_PATH - 1); procent.szExeFile[MAX_PATH - 1] = '\0'; } } *ProcList++ = procent; ListSize--; SetCount++; } Need++; CloseHandle(hProcess); } } while(Process32Next(hSnapshot,&procent) != FALSE); } CloseHandle(hSnapshot); } if (Needed) *Needed = SetCount; return Need; } //関数の呼び出し部分 PROCESSENTRY32 *NewProcessList; i = GetProcessList(ProcessList, ProcessListSize, &ProcessListCount); if (i > ProcessListSize) { NewProcessList = (PROCESSENTRY32 *)realloc(ProcessList,(i + 16) * sizeof(PROCESSENTRY32)); if (!NewProcessList) { ProcessList = NewProcessList; ProcessListSize = i + 16; } GetProcessList(ProcessList, ProcessListSize, &ProcessListCount); } //i番目のプロセスにアタッチする DWORD ProcessId; ProcessId = ProcessList[i]->th32ProcessID; if (ExecProcessHandle) CloseHandle(ExecProcessHandle); ExecProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, NULL, ProcessId); //アタッチしたプロセスのメモリを1バイト読む unsigned char cbuf[3]; int StartAddress; int err; DWORD Rb; Rb = 0; err = ReadProcessMemory(ExecProcessHandle, (void *)StartAddress, cbuf, 1, &Rb); if (!err) { err = GetLastError(); if ((err != ERROR_PARTIAL_COPY) && (err != ERROR_NOACCESS)) { //該当プロセスが終了してメモリにアクセスできない } }

関連するQ&A

  • サーバー間のEXE起動

    すいません、宜しくお願いします。 開発言語 C# VS2008使用 今試しで画面を開発中なのですが、 Aサーバー Bサーバー Cサーバー と3つのサーバーがありまして、 Aサーバーに配置している画面のボタンを押された場合、 B、CサーバーのEXEを起動させると言う感じに構想考えています。 (すいません、セキュリティーとか抜きにして・・・) Aサーバーのタスク書き換え or Exe起動はうまくいくのですが、 他サーバーに同様に同じような事実行すると うまくいきません・・・ そもそも他サーバーのEXEを起動する事は出来ないのでしょうか??? 暇な時にでも付き合って頂けると幸いです。

  • 権限昇格の確認を出さないプロダクトIDの取得方法

    Visual Studio2013で 一つのソリューションの中でC#とC++を使って開発を行っています。 C++でWindowsのレジストリを読む処理を書いたところ開発環境では問題なく動作したのですが 別のPCでは管理者権限として実行しないと読めませんでした。 そこでネットの情報を参考にVisual Studioでマニフェストファイルを作成し起動時に管理者に昇格させるようにしました。 レジストリを読む処理は問題なく動作したのですが、必ず「権限昇格の確認ダイアログ」が出てしまいます。 ネットで調べたところ、プログラムを「Program Files」以下に置かなければでないような記述を見たので \C直下に置いたのですが変わらず「権限昇格確認ダイアログ」が出てしまいます。 「権限昇格確認ダイアログ」を出さずにレジストリを読むために何が必要でしょうか? (作成したexeのプロパティ-互換性 から特権レベルを変更するではなく、プログラムでどうにか出来ないかを考えています) また、UACが有効だと問題が起こる可能性があるとの記事も見つけました。 UACは有効にしないほうがよいのでしょうか? http://dobon.net/vb/dotnet/system/uac.html 確かに「権限昇格の確認ダイアログ」が出るようになってからプログラム内部からexeを起動している箇所で実行環境だとexeの起動が出来なくなってしまいました。 よろしくお願いします。 開発環境  Windows7 32bit  Visual Studio2013 インストール済   実行環境  Windows7 32bit  .Net 4.5 インストール済  VisualStudio 2013 の Visual C++ 再頒布可能パッケージインストール済   読みたいレジストリ  WindowsのProductID   ※VBで作られたアプリですが、「権限昇格の確認ダイアログ」を出さずに ProductIDを表示するアプリを見たことであるので何かしらやり方はあるのでは?と思っています。

  • createprocessで起動させる別.exeをモーダルで起動したい

    createprocessで起動させる別.exeをモーダルで起動したい お世話になります。 VC++6.0 MFCで開発しております。 現在A.exeのあるボタンを押すとcreateprocessでB.exeを起動させるようにしております。 B.exeを起動後、A.exeの画面表示をクリックするとA.exeがアクティブになるのです。 それを、B.exeが終了しないとA.exeがアクティブにならないように変更したいのですがどのようにすればよいでしょうか? 現状は PROCESS_INFORMATION pi; STARTUPINFO si; si.cb=sizeof(si); CreateProcess(実行EXEパス,コマンドライン,NULL,NULL,TRUE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi); で起動しております。 また、実現不可能というお答えでもいいので教えていただければと思います。 お手数ですが何卒よろしくお願いします。

  • EXEの起動について

    プログラムの連続起動をバッチファイルで作成しています。 本体(A.EXE)を連続起動させるべくfor文でテキストファイルを読み込み引数を与えながら起動して、ということをしたいのですが、A.EXEは自動で終了するもののワケあって終了した状態を取得できません。 そこで監視(B.EXE)を実行してA.EXEの終了を待つプログラムを用意しました。 for文の中でA.EXE起動→5秒待ち→B.EXE起動(バッチは待ち状態)→A.EXE終了→B.EXE終了(バッチ待ち解除)→2回目のA.EXE起動…という流れを想定していますが、B.EXEが待ち状態にならずA.EXEが実行されてしまいます。 バッチの中身をコマンドプロンプトで実行するとB.EXEは待ち状態となるのですがバッチ実行すると待ち状態になりません。 なにが原因かわからず質問いたしました。 ご助力いただけると助かります。 以下はバッチ内容です(for文は除きます)。 ----------------- start C:\work\A.EXE timeout 5 start /w C:\work\B.EXE ----------------- よろしくお願いします。

  • ネットワークユーザでのローカルマシンのソフト起動について

    説明が不十分かもしれませんがお願いします。 ネットワークユーザ(A)とローカルユーザ(B)のふたつのユーザがあります。 Bはローカルマシンでログインし、アドミニ権限を持っています。 ここで一つのソフトウェアをインストールします。 そしてAでネットワークのドメインにログインしなおします。 (Bはアドミニ権限は持っていません。権限を付加することもできません) さっきインストールしたソフトを起動するとエラーがでて起動できません。 あくまでBのアカウントを主とします。そのため、AよりBで起動すれば それでもOKですが、やはり誰でも使えるようにはしたいです。 環境はWinNT4.0です。 以上、よろしくお願いします。

  • CD-ROMからexeを起動するとファイルを読み込まない

    自作したゲームのexeファイルを起動したところ、ファイルを読み込んでくれないので困っています。 自分は、 if(NULL == (fp = fopen("ファイル名","r+t")))  としているのですが、普通にWindows上でexeを起動すると普通に読み込んでくれるのですが、何故かCD-ROMに焼いてから、CD-ROMからexeファイルを起動させるとファイルを読み込んでくれません。 他の方法でfopen("../フォルダ名/ファイル名")にしても駄目でした。  なにか別の方法がないのでしょうか? 教えていただけると助かります。 ちなみに開発環境は、VS.NET2003 C++です。

  • 自動リリースにおけるEXE起動について

    社会人1年目です。 以下の課題について方法をご教示ください。 システムAとBがあります。 AとBはLANでつながっています。 Bで不具合が発生しAからBに配信します。 (1)配信したEXEでBを起動したいが、配信時にはBは立ち上がってるため、EXE上書きで起動ができないと思います。 こういった場合、どうやってEXE差し替えを行い再起動するのでしょうか。 (2)Bにはデータベースがあり、新しいテーブル追加のSQLを配信でBのデータベースにリリースします。こういった場合のやり方をご教示ください。 ※ネットで色々調べたのですが全くでてきませんでした・・・

  • Webアプリから起動した実行ファイルについて

    お世話になります。IIS6.0、ASP.NET、C#でWeb開発しております。 Webアプリからwin32コンソールアプリを起動しているのですが、コンソールアプリ側でファイル操作ができません。具体的には、fopen()やCreateFile()などを試しましたが、落ちる・エラーが返るなどでまともに動きませんでした。コンソールアプリ単体で起動した場合は問題ないです。Webアプリから起動した場合、タスクマネージャで見ると、EXEの実行ユーザが"NETWORK SERVICE"となっています。権限の問題とかでしょうか…。どなたか、分かる方がいましたら、教えて頂ければと思います。よろしくお願いします。

  • Windows7で自作EXEが起動しない

    OS:Windows7(Professional) お世話になります。 XPで作成したEXE(VB6で作成)をWindows7で実行したところ、上手く起動してくれません。 自作したEXEというのが、メニューEXE、ログインEXEとあって、 メニューEXEは起動時にログインEXEをShellExecuteで起動します。 問題は、メニューEXEを起動しても、ログインEXEが起動されない事です。 (ログインEXE自体は単体で起動できました) ShellExecuteが問題?? とも思いましたが、 EXEを格納しているフォルダの変更や再作成などを行うと上手く起動し、 問題なく動作しました。 ですが、しばらくするとまた起動しなくなりました。(←まったく理解できない) フォルダのアクセス権限の問題かと思い、プロパティでフォルダの 「アクセス許可」を設定しましたが、やはり起動してくれません。 (↑「Everyone」をフルコントロールで追加しました) ユーザアカウント制御はOFF(通知しない)に設定しています。 また、「互換性のトラブルシューティング」を実施してみましたが結果は 変わりませんでした。 Windows7が嫌いになりそうな現象です。。 何かしらご存知の方いらっしゃいましたら、よろしくお願いします。

  • ASPからのEXEファイル起動

    VBScriptで作ったASPからVisualBasicで作ったEXEファイルを起動するプログラムを作りました。 そこでEXEファイルを起動する際にASPで持ってる情報(ユーザID)を 起動をかけるEXEに渡したいのですがうまくいきません。 DOS画面より >C:\abc.exe 10 とうつとパラメータ 10が引きわたり正常に起動します。 ところがWEBから Response.Redirect("C:\abc.exe 10")とやると ページが見つかりませんとなります。 ちなみに Response.Redirect("C:\abc.exe")だと パラメータの受け渡しはありませんが起動はできます。 何がいけないんでしょうか・・・? ご教授願います。