• ベストアンサー

vb.net2003での二重起動防止について

度々お世話になっています。 vb.net2003でアプリケーションを作りました。 そこで二重起動防止を行いたい為に、Process.GetProcessesByName メソッドを使用して行いました。 二重起動防止は出来ているのですが、ターミナルサービスでリモートデスクトップ接続を行い、同一ユーザーの二重起動防止はしたいですが、1ユーザーでも使用していたら 別ユーザーで起動できません。 何か良い方法はありませんでしょうか? 出来れば解説しているサイトがあれば教えて下さい。

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

  • ベストアンサー
回答No.2

Mutex クラス と System.Environment.UserNameを利用すれば可能かもしれません。 System.Environment.UserName で現在のスレッドを開始した人のユーザー名を 取得できると思うので、その取得したユーザー名をもとに Mutex クラス を利用した2重起動チェックをもちいると可能かも。 Protected Shared Sub Main()   Dim hMutex As New System.Threading.Mutex(False, Application.ProductName & System.Environment.UserName )   If hMutex.WaitOne(0, False) = True Then     GC.KeepAlive(hMutex)     Application.Run(New Form1)   Else     Application.Exit()   End If   hMutex.Close() End Sub 通常の Mutex をもちいた2重起動チェックは、Mutex を生成しする時に Application.ProductName だけを用いますが、それに更にスレッドを開始した人のユーザー名を足した名前で作成すれば、 いいと思う。 Mutex の2重起動チェック方法は方々で利用されているので調べられたらよいと思います。

ranmaru2
質問者

お礼

回答有難う御座いました。 Mutexクラスを使って実現できました。 有難う御座いました。

その他の回答 (1)

  • kokorone
  • ベストアンサー率38% (417/1093)
回答No.1

1)アクセス情報ファイル(テキストファイルなど)を利用する。 ・アクセス時に、アクセス情報ファイルを読み込み、同一利用者の情報があれば、アプリケーションを終了する。同一利用者の情報がなければ、アクセス情報ファイルに利用者情報を書き込む 2)データベースを利用する ・アクセス時に、データベースに問い合わせ、同一利用者情報があれば、アプリケーションを終了する。同一利用者の情報がなければ、データベースに利用者情報を書き込む いずれの場合も、初回アクセス後の終了処理で、利用者情報を削除 するタイミングに注意が必要。 終了ボタンを押さずに、ウィンドウをクローズしたとか、タスクを 強制終了した場合、利用者情報を削除できない場合もある。

ranmaru2
質問者

お礼

回答有難う御座いました。 Mutexクラスを使って実現できました。 有難う御座いました。

関連するQ&A

  • 二重起動チェックについて

    WindowsServer2003でターミナルサービスを使ってシステムを構築しています。 一応GetProcessesByNameを使用して二重起動チェックを行っていたのですが、この場合だと他のユーザーが別のPCから同じアプリケーションを起動した際に二重起動チェックに引っかかってしまいます。 ターミナルサービス上でユーザー毎にアプリケーションの二重起動チェックは出来ないのでしょうか。 開発言語はVB.NET2003です。 よろしくお願いします。

  • vb.net2003で困っています。

    vb.net2003で困っています。 プログラムの二重起動をチェックするため、process.getprocessesbynameを使用し実行すると プログラムがprocess.getprocessesbynameのところで固まります。 (CPUの使用率が100%になっていました。) イベントビューアを確認すると、プログラムを強制終了した時刻にperflibのエラー(イベントID 2002) が発生しています。 記述は色々なサイトで掲載されていたものを、そのままコピー&ペーストしてますのでおかしくないと思うのですが...。 同じような経験をされたかたはいませんでしょうか?

  • VB5.0 二重起動防止

    OSWin98/VB5.0を使用しています。同一のシステムの重複起動を防止したいのです。過去ログの、 http://oshiete1.goo.ne.jp/kotaeru.php3?q=644390 を参照し、 http://www.vbvbvb.com/jp/gtips/1101/gCreateToolhelp32SnapshotTh32csSnapprocess.html のサンプルを参考にし、実行中のプロセスに同一のものがあれば、複数起動と判断するようにしました。 しかし、どうしても二重起動されてしまいます。 例1)A.exeを起動、A.vbpをデバッグで実行    →二重起動を検出し、後者は起動されない 例2)A.exeを起動、A.exeを起動    →二重起動が検出されず、後者も起動されてしまう App.PrevInstanceで判断できると思うのですが、例1と同じ方法でもこの場合は、二重起動を防ぐことができません。 他によい方法がある、ここがおかしいんじゃないの?等ありましたら、教えてください。 よろしくお願いします。

  • 2重起動の防止

    C++Builder5.0でアプリケーションの2重起動の防止 を実現する方法を教えて下さい。

  • 2重起動の防止方法

    Microsoft Visual C++6.0でアプリケーションの2重起動の防止を実現する方法を教えて下さい。

  • サーバ・クライアント環境で2重起動防止したい

    現在、2重起動防止の機能を考えています。 システムとしてはサーバー(Win2003Server)にアプリを置いて、クライアント(WinXP)からリモート接続で繋いでそのアプリを起動します。この時、クライアント1にてアプリを実行していた場合はサーバ及び他クライアントではアプリを起動できないようにしたい。 CreateMutexとWaitForSingleObjectで出来るかと思ったのですが、(作り方が悪いのか)出来ませんでした。(x_x) VC++6.0を使用しています。VBの経験はそれなりにありますが、VCは初心者です。 よろしくお願いいたします。

  • [C#]リモートコンピューターを選択するダイアログ

    C#でコンピュータのプロセスを監視するプログラムを作っています。 Process.GetProcessesByName メソッドによるプロセスの取得は、リモートコンピューターでも可能なようなのですが、以下1・2の実現方法が分かりません。 1.ユーザーが(ダイアログか何かで)リモートコンピューターを選択する 2.選択されたリモートコンピューターの名前かIPアドレスを取得する 3.プロセスを取得する。Process [] ipByName = Process.GetProcessesByName("notepad", "169.0.0.0"); コンピューターを選択して取得するようなダイアログは.NETに用意されていないようですが、この場合どのようにすればよいでしょうか? よろしくお願いします。

  • VB.NETで起動したExcelの閉じ方について

    VB.NET(2003)でExce(2003)を起動し、そのシートに動的コマンドボタンを貼り付けました。 このコマンドボタンには、Excelを閉じ、COMオブジェクトの開放を行うコードを記述しています。 これでうまくExcelは閉じることが出来き、Excelのプロセスも残らないのですが、直接Excelの[×]閉じるボタンで閉じるとExcelのプロセスが残ってしまいます。 これを防止するにはどのようにすればよいでしょうか? どうかよろしく御教示ください。

  • VB6 二重起動確実防止について

    VB6 SP5にて2重起動確実な防止処理をいれようとCreateMutex 関数を使用しようと思っています。 CreateMutex 関数を埋め込んでEXEを実行すると 実際に対象となるプログラムが起動しているにも関わらず起動してしまいます。 何がいけないのか?検討がつかず困っています。 下記がプログラムになります。 何かわかりましたらご回答の程、よろしくお願い致します。 ***Win32API**************** Option Explicit ' CreateMutex 関数 Private Declare Function CreateMutex Lib "KERNEL32.DLL" Alias "CreateMutexA" ( _ ByRef lpMutexAttributes As Long, _ ByVal bInitialOwner As Long, _ ByVal lpName As String _ ) As Long ' CloseHandle 関数 Private Declare Function CloseHandle Lib "KERNEL32.DLL" ( _ ByVal hObject As Long _ ) As Long ************************************ SUB MAIN********************************* Public Sub Main() Dim hMutex As Long hMutex = CreateMutex(ByVal 0&, 0&, App.Title) On Error GoTo Err_Main If Err.LastDllError = 0 Then Dim cForm As Form1 Set cForm = New Form1 Call cForm.Show(vbModal) End If Err_Main: If hMutex <> 0 Then Call CloseHandle(hMutex) End If End Sub ************************************************

  • VBプログラムの終了

    VB6.0で作成した実行ファイル(exe)を終了させても タスクマネージャのプロセスに残ってしまい、 もう一度プログラムを起動することができません。 (プログラムで二重起動防止の処理をしています) このプログラムをVBのラインタイムが入っていない マシンで動かしているのですが、 やはりそれが問題なのでしょうか? それとも別に何か原因があるのでしょうか?