C#を使用して.NETで現在のユーザー名を取得するにはどうすればよいですか?


606

C#を使用して.NETで現在のユーザー名を取得するにはどうすればよいですか?

回答:


897
string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;

96
これはどう違うのですEnvironment.UserNameか?
サムハーウェル

59
@SimonGillbee、これは間違っていEnvironment.UserNameます。「RunAs」ユーザーを返します。
ボル

5
確認するには.... MessageBox.Show(Environment.UserName);あなたにこれを入れてwindow_loaded....イベント、およびRunAsのを使用してそれを実行
ボル


4
これはを返しますDomain\Username。ユーザー名に関連付けられた名前を取得するにはどうすればよいですか?
SearchForKnowledge

325

ユーザーのネットワークにいる場合、ユーザー名は異なります。

Environment.UserName
- Will Display format : 'Username'

のではなく

System.Security.Principal.WindowsIdentity.GetCurrent().Name
- Will Display format : 'NetworkName\Username'

希望する形式を選択します。


7
Environment.UserDomainName + "\\" + Environment.UserNameと同じように見える結果を得るのに使用できますSystem.Security.Principal.WindowsIdentity.GetCurrent().Name。さて、違いは何ですか、あなたは尋ねます...私はわかりません。
Gutblender 2014年

9
私がドメインを取り除くには、以下のなかったので、私は、むしろ(Environment.UserNameは私が欲しいものではありません)にログインしているユーザーよりもアプリを実行しているユーザーを取得するために必要: System.Security.Principal.WindowsIdentity.GetCurrent().Name.Split( '\\' ).Last();
thehelix

あなたは追加する必要がありますToArray()後にSplit呼び出す前にLast()
codenamezero

1
@codenamezero ToArray()必要ありません。あなたが必要になるでしょうusing System.Linq;
TheSoftwareJedi

112

プロパティを試してください:Environment.UserName


5
またはstring userName = Environment.UserName;
ドーナツ

10
注意:受け入れられた回答のコメントで言及されているSimon Gillbeeのように、Environment.UsernNameログインしたアカウントWindowsIdentity.GetCurrent().Name名が表示されますが、アプリケーションが実行されているアカウント名が返されます。
ガーヴァルト2014年

5
@leo:注意:その情報も明らかに間違っています。Bolu の返信を参照してください。:-)
TJクラウダー

ASP.NETでは使用しないでください。docs.microsoft.comのコメント:「ASP.NETアプリケーションが開発環境で実行されている場合、UserNameプロパティは現在のユーザーの名前を返します。公開されたASP.NETアプリケーションでは、このプロパティはアプリケーションプールアカウントの名前を返します(デフォルトのAppPoolなど)。」
feihoa

28

Environment.UserNameのドキュメントは少し矛盾しているようです:

Environment.UserNameプロパティ

同じページでそれは言う:

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

そして

現在のスレッドを開始した人のユーザー名を表示します

RunAsを使用してEnvironment.UserNameをテストすると、最初にWindowsにログオンしたユーザーではなく、RunAsユーザーアカウント名が表示されます。


24

私は他の答えを完全に二番目に言います、しかし私は言うもう一つの方法を強調したいです

String UserName = Request.LogonUserIdentity.Name;

上記のメソッドは、DomainName \ UserNameの形式でユーザー名を返しました。たとえば、EUROPE \ UserName

これは以下とは異なります:

String UserName = Environment.UserName;

次の形式で表示されます:UserName

そして最後に:

String UserName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;

これは与えた:NT AUTHORITY\IUSR(IISサーバー上でアプリケーションを実行している間)及びDomainName\UserName(ローカルサーバ上でアプリケーションを実行中)。


「リクエスト」を使用するにはどの名前空間が必要ですか?
TK-421

1
@ TK-421 Requestは、Webアプリケーションの場合にのみ機能します。それはのインスタンスですSystem.Web.HttpRequest
ヘラルド・グリニョリ


11

また、以下を使用してみることもできます。

Environment.UserName;

このような...:

string j = "Your WindowsXP Account Name is: " + Environment.UserName;

これがお役に立てば幸いです。


11

既存の回答からいくつかの組み合わせを試しましたが、それらは私に与えていました

DefaultAppPool
IIS APPPOOL
IIS APPPOOL\DefaultAppPool

私は結局使用しました

string vUserName = User.Identity.Name;

実際のユーザーのドメインユーザー名のみがわかりました。


優秀な。アプリプールIDのみも受け取りました。しかし、あなたのコードは私の問題を解決しました。どうもありがとうございます。
SuryaKavitha 2014年

リクエストを行っているユーザーのユーザー名が必要だったようですが、MVCまたはWeb APIコントローラーのようです。これは、プロセスが実行されているユーザー名とは異なります
Ben Aaronson 2016年

@BenAaronsonこの質問は、どのユーザー名がプロセスを実行しているかについては何も述べていません。現在ログインしているドメインのユーザー名が必要でしたが、検索によってこのページに移動しました。このコードにより、必要なものが得られました。
ダニエルE.


9

使用するSystem.Windows.Forms.SystemInformation.UserNameと、実際にログインしているユーザーのために Environment.UserName、まだ現在のプロセスによって使用されているアカウントを返します。


共有をありがとう、また次を参照してください。System.Windows.Forms.SystemInformation.UserDomainName
アシシュ・シン

9

念のために誰かがユーザーの探している表示名とは対照的に、ユーザー名私のような、。

ここに御馳走があります:

System.DirectoryServices.AccountManagement.UserPrincipal.Current.DisplayName

System.DirectoryServices.AccountManagementプロジェクトに参照を追加します。


6

以前のすべての回答を試しましたが、どれもうまくいかなかったため、MSDNで回答を見つけました。私にとって正しいものについては、「UserName4」を参照してください。

私は後だ、ログインユーザによって表示されているように、:

<asp:LoginName ID="LoginName1" runat="server" />

これらをすべて試すために私が書いた小さな関数は次のとおりです。私の結果は、各行の後のコメントにあります。

protected string GetLoggedInUsername()
{
    string UserName = System.Security.Principal.WindowsIdentity.GetCurrent().Name; // Gives NT AUTHORITY\SYSTEM
    String UserName2 = Request.LogonUserIdentity.Name; // Gives NT AUTHORITY\SYSTEM
    String UserName3 = Environment.UserName; // Gives SYSTEM
    string UserName4 = HttpContext.Current.User.Identity.Name; // Gives actual user logged on (as seen in <ASP:Login />)
    string UserName5 = System.Windows.Forms.SystemInformation.UserName; // Gives SYSTEM
    return UserName4;
}

この関数を呼び出すと、ログインしているユーザー名が返されます。

更新:ローカルサーバーインスタンスでこのコードを実行すると、Username4は ""(空の文字列)を返しますが、UserName3とUserName5はログインしたユーザーを返すことを示します。注意すべきことだけです。


WebサイトでIISを使用していますが、ネットワーク内の別のコンピューターからページにアクセスすると、ユーザー名として「ネットワークサービス」が表示され続けます。さまざまなオプションを試しましたが、ページを表示しているログインユーザーが表示されません。何か案が?
Si8 16

3
注:明確にはされていませんが、上記の例はIISで実行されているWebアプリケーションのコンテキストに適用され、ASP.Netアプリケーションプールを実行するサーバーウィンドウアカウントの名前がいくつか表示されます。対話型プログラムまたはWindowsサービスとして実行している場合、HttpContextからの1つは使用できなくなり、他の1つを使用して、プロセスが実行されるアカウントを見つける必要があります。
Oskar Berggren 2017

4

コードは次のとおりです(ただしC#ではありません)。

Private m_CurUser As String

Public ReadOnly Property CurrentUser As String
    Get
        If String.IsNullOrEmpty(m_CurUser) Then
            Dim who As System.Security.Principal.IIdentity = System.Security.Principal.WindowsIdentity.GetCurrent()

            If who Is Nothing Then
                m_CurUser = Environment.UserDomainName & "\" & Environment.UserName
            Else
                m_CurUser = who.Name
            End If
        End If
        Return m_CurUser
    End Get
End Property

これがコードです(現在はC#でも):

private string m_CurUser;

public string CurrentUser
{
    get
    {
        if(string.IsNullOrEmpty(m_CurUser))
        {
            var who = System.Security.Principal.WindowsIdentity.GetCurrent();
            if (who == null)
                m_CurUser = System.Environment.UserDomainName + @"\" + System.Environment.UserName;
            else
                m_CurUser = who.Name;
        }
        return m_CurUser;
    }
}

C#で回答するとします
Shivam Bharadwaj

4

これを試して

ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT UserName FROM Win32_ComputerSystem");
ManagementObjectCollection collection = searcher.Get();
string username = (string)collection.Cast<ManagementBaseObject>().First()["UserName"];

今では良く見えます


2

複数のユーザーに配布される予定のWindowsフォームアプリの場合、その多くはVPN経由でログインし、いくつかの方法を試してみましたが、すべてが私のローカルマシンのテストでは機能しましたが、他では機能しませんでした。私は適応して機能するマイクロソフトの記事に出くわしました。

using System;
using System.Security.Principal;

namespace ManageExclusion
{
    public static class UserIdentity

    {
        // concept borrowed from 
        // https://msdn.microsoft.com/en-us/library/system.security.principal.windowsidentity(v=vs.110).aspx

        public static string GetUser()
        {
            IntPtr accountToken = WindowsIdentity.GetCurrent().Token;
            WindowsIdentity windowsIdentity = new WindowsIdentity(accountToken);
            return windowsIdentity.Name;
        }
    }
}

1

現在のWindowsユーザー名を取得します。

using System;

class Sample
{
    public static void Main()
    {
        Console.WriteLine();

        //  <-- Keep this information secure! -->
        Console.WriteLine("UserName: {0}", Environment.UserName);
    }
}

WebサイトでIISを使用していますが、ネットワーク内の別のコンピューターからページにアクセスすると、ユーザー名として「ネットワークサービス」が表示され続けます。さまざまなオプションを試しましたが、ページを表示しているログインユーザーが表示されません。何か案が?
Si8 16

1

他の人に役立つ場合は、c#.net 3.5アプリからVisual Studio 2017にアプリをアップグレードしたときに、このコード行がUser.Identity.Name.Substring(4);このエラーをスローしました " startIndexは文字列の長さより大きくすることはできません

に変更したときはうれしかったですが、ドメイン部分なしでログインしたWindowsユーザーを取得するためにSystem.Security.Principal.WindowsIdentity.GetCurrent().Name使用Environment.UserName;してしまいました。


@doreenに感謝します。
Shivam Bharadwaj

0

私はここでほとんどの回答を調べましたが、どれも正しいユーザー名を教えてくれませんでした。

私の場合、Shift +ファイルを右クリックして「別のユーザーとして実行」する場合など、別のユーザーからアプリを実行しているときに、ログインしたユーザー名を取得したいと考えました。

私が試した答えは私に「他の」ユーザー名を与えました。

このブログ投稿は、ログインしたユーザー名を取得する方法を提供します。これは、私のシナリオでも機能します。https
//smbadiwe.github.io/post/track-activities-windows-service/

Wtsapiを使用します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.