質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Blue Prism

Blue Prismは、複数ロボットの統括管理RPAです。各企業の事業部門に分散されているロボットに対し、プロセスの制御・監視・実行・スケジュールを行うコンソールでロボットの運用を推進。内部統制を強化できます。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

1回答

10591閲覧

いま動いてるプロセスのユーザを知る方法ってあるでしょうか。

sumire_cl

総合スコア228

Blue Prism

Blue Prismは、複数ロボットの統括管理RPAです。各企業の事業部門に分散されているロボットに対し、プロセスの制御・監視・実行・スケジュールを行うコンソールでロボットの運用を推進。内部統制を強化できます。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2020/03/18 13:22

編集2020/03/19 02:08

たとえば二重起動しては困るようなアプリを起動するときに、起動前に「そのプロセスが既にありますか?」と確認する動作を入れます。

それで
たとえばそのプロセスがメモ帳だとして
こんな感じでメモ帳のプロセスがあるかぐるぐる回して探します。(全部じゃなくその回す動作のところだけ書きます)

VB

1for each p as system.diagnostics.process in system.diagnostics.process.getprocessesbyname("notepad") 2 exists = true 3 exit sub 4next

今日、あるアプリを、絶対に起動してないことを目視で確認したのに、これを回すと「そのプロセスあります」と出てしまうのです。
おかしいなと思って、プロセスの稼働状況を見てみました。

いつも、プロセスの稼働状況を詳しく見るときは
Process Explorer
を使って見ます。
これで見てわかったのは
私がこの作業をしていたのはWindowsServerで
私の他にあと何人か別のユーザがログインしていて、
そのなかの誰かがそのアプリを使っていたのでした。

なので、知りたいのは、「そのプロセスが自分のプロセスかどうか」です。
自分のじゃないってわかればユーザ名はわからなくていいです。
Linuxだとpsで見るところですが
VB.NETならどのように書けば、「プロセス名を指定して、当該のプロセスが自分のプロセスかどうかを返り値で得る」ことができるのでしょうか。

上に書いたものは「プロセス名が探しているものと一致したらOK」なのですが、
これにさらに「自分のプロセスだったら」という条件を足したいのです。
が、書き方がわかりません。
よろしくお願いします。

#補足
Blue Prismのタグをつけていますが、これはBlue Prismのコードステージに書いて実行しています。
なので、制御室からRRで実行する場合は、ひとつのRRにロボットアカウント1個しかいないので、この問題は出ません。
たとえば開発環境のようなインタラクティブクライアントで、複数のユーザがデバッグ実行するときに問題になるものです。
だからまあ本番で問題ないからいいじゃんと言われればそうなので今すぐ超困る話ではないのですが、
開発ユーザが増えてくるとそこそこ困るというお話です……。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sumire_cl

2020/03/18 22:57

おおありがとうございます、 検索します。
guest

回答1

0

「WMI プロセス ユーザ名」でググると結構ヒットします。
VB.NET で書かれたものを抜粋すると
https://dobon.net/vb/bbs/log3-3/1615.html

https://okwave.jp/qa/q2467712.html

https://qa.itmedia.co.jp/qa2467712.html

などいろいろ
なんだか元ネタが同一っぽい気もしますが・・・

他のユーザが起動したプロセスはユーザ名取得時、エラーになることががありますが、
自分かそうでないかを判断すればよいわけで、エラーになれば自分のプロセスではない、
というロジックで良いと思います、

WMI はちょっと遅いので API でゴリゴリ書いた例を紹介しておきます。(C#)
http://kozhouse.homeip.net/dotnet/etc/10/

###追記
Framework に何か部品がないかなーと調べてみたのですが、System.Security.Principal.WindowsIdentity を使うと、もっと簡単になります。

VB.NET

1Imports System.Runtime.InteropServices 2Imports System.Security.Principal 3 4Module Module1 5 6 Sub Main() 7 For Each p In Process.GetProcesses() 8 Using wid As WindowsIdentity = GetWindowsIdentity(p) 9 Debug.WriteLine("{0} {1}", p.ProcessName, If(wid Is Nothing, "(Error)", wid.Name)) 10 End Using 11 p.Dispose() 12 Next 13 End Sub 14 15 Public Function GetWindowsIdentity(ByVal process As Process) As WindowsIdentity 16 Dim tokenHandle As IntPtr 17 Try 18 If OpenProcessToken(process.Handle, TOKEN_QUERY, tokenHandle) Then 19 Return New WindowsIdentity(tokenHandle) 20 End If 21 Catch ex As Exception 22 Finally 23 If tokenHandle <> IntPtr.Zero Then 24 CloseHandle(tokenHandle) 25 End If 26 End Try 27 Return Nothing 28 End Function 29 30 Private Const TOKEN_QUERY = &H8 31 32 <DllImport("advapi32.dll", SetLastError:=True)> 33 Private Function OpenProcessToken(ByVal ProcessHandle As IntPtr, ByVal DesiredAccess As Integer, ByRef TokenHandle As IntPtr) As Boolean 34 End Function 35 36 <DllImport("kernel32.dll", SetLastError:=True)> 37 Private Function CloseHandle(ByVal hHandle As IntPtr) As Boolean 38 End Function 39 40End Module

OpenProcessToken を公開しているメソッドがあれば、API 使わなくて済むのですが、今のところ見つからないです。

投稿2020/03/18 14:17

編集2020/03/19 00:41
KOZ6.0

総合スコア2696

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問