web-dev-qa-db-ja.com

VB.NETを使用して現在ログインしているユーザーのユーザー名を検索する

現在のユーザーのユーザー名を取得しようとしています。 Johnny Smithとしてログインし、管理者権限なしでアプリケーションを実行すると、正しいユーザー名Johnny Smithが返されます。しかし、問題は、右クリックして[管理者として実行]を選択すると、Windowsが管理者のログイン画面を表示し、ログイン後、アプリケーションがログインしているユーザーではなくユーザー名adminを返すことです。現在。

私が試してみました:

strUserLabel.Text = Environment.UserName

また

Dim WSHNetwork = CreateObject("WScript.Network")
Dim strUser = ""

While strUser = ""
    strUser = WSHNetwork.Username
End While

strUserLabel.Text = strUser

管理者としてプロンプトが表示されたら、どちらも管理者ユーザー名を返します。

7
Mario LIPCIK

私はそれを理解しました。ユーザーが使用しているプロセスを判別するこの関数を使用しました。私のコードでは、Explorer.exeプロセスのユーザー名を探すように定義しました。

Function GetUserName() As String

    Dim selectQuery As Management.SelectQuery = New Management.SelectQuery("Win32_Process")
    Dim searcher As Management.ManagementObjectSearcher = New Management.ManagementObjectSearcher(selectQuery)
    Dim y As System.Management.ManagementObjectCollection
    y = searcher.Get

    For Each proc As Management.ManagementObject In y
        Dim s(1) As String
        proc.InvokeMethod("GetOwner", CType(s, Object()))
        Dim n As String = proc("Name").ToString()
        If n = "Explorer.exe" Then
            Return s(0)
        End If
    Next
End Function

Index of はsernameを返します

Index of 1domain name ofuserを返します

2
Mario LIPCIK

MSDNのドキュメントで、プロパティの定義が変更されていることがわかりましたEnvironment.UserName

。NET 3より前

現在のスレッドを開始した人のユーザー名を取得します。

バージョン3以降

現在Windowsオペレーティングシステムにログオンしているユーザーのユーザー名を取得します

7
dovid

上記の受け入れられた答えは、ユーザー名を見つけるための非常にリソースを消費する方法だと思います。何百ものアイテムを含むネストされたループがあります。私の8GP RAM PCでは、これには2秒以上かかります!

どうですか:

  • ユーザー名:SystemInformation.Username、および
  • ドメイン名:Environment.UserDomainName

VS2017でテスト済み

1

SystemInformation.Username特定のアプリケーションでは機能しません。私の場合、コードはSystemとして実行されていますが、Explorer.exeはDanielとして実行されています。 SystemInformation.Usernameレポートシステム。

0
Dan