Bagaimana cara mendapatkan nama pengguna saat ini di .NET menggunakan C #?

606

Bagaimana cara mendapatkan nama pengguna saat ini di .NET menggunakan C #?

Yves
sumber

Jawaban:

897
string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
juan
sumber
96
Bagaimana ini berbeda dari Environment.UserName?
Sam Harwell
59
@SimonGillbee, ini salah, Environment.UserNameakan mengembalikan pengguna "RunA".
Bolu
5
Untuk memverifikasi .... MessageBox.Show(Environment.UserName);masukkan ini ke dalam window_loadedacara Anda , dan jalankan dengan menggunakan RunA ....
Bolu
4
Ini kembali Domain\Username. Bagaimana saya bisa mendapatkan Nama yang dikaitkan dengan nama pengguna?
SearchForKnowledge
325

Jika Anda berada di jaringan pengguna, maka nama pengguna akan berbeda:

Environment.UserName
- Will Display format : 'Username'

daripada

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

Pilih format yang Anda inginkan.

Israel Margulies
sumber
7
Anda dapat menggunakan Environment.UserDomainName + "\\" + Environment.UserNameuntuk mendapatkan hasil yang tampaknya sama System.Security.Principal.WindowsIdentity.GetCurrent().Name. Sekarang, apa bedanya, Anda bertanya ... Saya tidak yakin.
Gutblender
9
Saya perlu agar pengguna menjalankan aplikasi daripada yang masuk (Environment.UserName bukan yang saya inginkan), jadi saya melakukan yang berikut untuk menghapus domain: System.Security.Principal.WindowsIdentity.GetCurrent().Name.Split( '\\' ).Last();
thehelix
Anda perlu menambahkan ToArray()setelah Splitsebelum memanggilLast()
codenamezero
1
@codenamezero Tidak ToArray()diperlukan. Anda akan membutuhkannya using System.Linq;.
TheSoftwareJedi
112

Cobalah properti: Environment.UserName.

JaredPar
sumber
5
Atau,string userName = Environment.UserName;
Donat
10
Perhatian: seperti Simon Gillbee yang disebutkan dalam komentar dari jawaban yang diterima, Environment.UsernNamememberikan nama akun yang masuk, tetapi WindowsIdentity.GetCurrent().Namemengembalikan nama akun tempat aplikasi itu berjalan.
Gerwald
5
@leo: Perhatian: Informasi itu juga tampaknya salah, lihat jawaban Bolu . :-)
TJ Crowder
JANGAN menggunakannya dengan ASP.NET. docs.microsoft.com mengatakan: "Jika aplikasi ASP.NET berjalan di lingkungan pengembangan, properti UserName mengembalikan nama pengguna saat ini. Dalam aplikasi ASP.NET yang diterbitkan, properti ini mengembalikan nama akun kumpulan aplikasi ( seperti Default AppPool). "
feihoa
28

Dokumentasi untuk Environment.UserName tampaknya agak bertentangan:

Properti Environment.UserName

Pada halaman yang sama tertulis:

Mendapat nama pengguna dari orang yang saat ini masuk ke sistem operasi Windows.

DAN

menampilkan nama pengguna orang yang memulai utas saat ini

Jika Anda menguji Environment.UserName menggunakan RunA, itu akan memberi Anda nama akun pengguna RunA, bukan pengguna yang awalnya masuk ke Windows.

Kobus
sumber
24

Saya benar-benar mendukung jawaban yang lain, tetapi saya ingin menyoroti satu metode lagi yang mengatakan

String UserName = Request.LogonUserIdentity.Name;

Metode di atas mengembalikan saya nama pengguna dalam format: DomainName \ UserName . Misalnya, EUROPE \ UserName

Yang berbeda dari:

String UserName = Environment.UserName;

Yang ditampilkan dalam format: UserName

Dan akhirnya:

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

yang memberi: NT AUTHORITY\IUSR(saat menjalankan aplikasi pada server IIS) dan DomainName\UserName(saat menjalankan aplikasi pada server lokal).

Shivam657
sumber
Namespace apa yang diperlukan untuk menggunakan "Permintaan."?
TK-421
1
@ TK-421 Requesthanya berfungsi jika Anda adalah aplikasi web. Ini adalah contoh dariSystem.Web.HttpRequest
Gerardo Grignoli
22

Menggunakan:

System.Security.Principal.WindowsIdentity.GetCurrent().Name

Itu akan menjadi nama masuk.

John Cuckaroo
sumber
11

Anda mungkin juga ingin mencoba menggunakan:

Environment.UserName;

Seperti ini...:

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

Semoga ini bermanfaat.

jay_t55
sumber
11

Saya mencoba beberapa kombinasi dari jawaban yang ada, tetapi mereka memberi saya

DefaultAppPool
IIS APPPOOL
IIS APPPOOL\DefaultAppPool

Saya akhirnya menggunakan

string vUserName = User.Identity.Name;

Yang memberi saya nama pengguna domain pengguna saja sebenarnya.

Daniel E.
sumber
Luar biasa. Saya juga menerima identitas kumpulan aplikasi saja. Tetapi kode Anda menyelesaikan masalah saya. Terima kasih banyak.
SuryaKavitha
Kedengarannya seperti Anda menginginkan nama pengguna dari pengguna yang membuat permintaan, saya kira untuk kontroler MVC atau Web API. Itu berbeda dengan nama pengguna dari proses yang sedang berjalan
Ben Aaronson
@ BenAaronson Pertanyaan tidak mengatakan apa-apa tentang nama pengguna apa yang menjalankan suatu proses. Saya membutuhkan nama pengguna domain yang saat ini masuk dan sebuah pencarian membawa saya ke halaman ini, kode ini akhirnya memberikan apa yang saya butuhkan.
Daniel E.
11
String myUserName = Environment.UserName

Ini akan memberi Anda output - your_user_name

Shivam Bharadwaj
sumber
9

Gunakan System.Windows.Forms.SystemInformation.UserNameuntuk pengguna yang benar-benar masuk karena Environment.UserNamemasih mengembalikan akun yang sedang digunakan oleh proses saat ini.

Remy
sumber
Terima kasih telah berbagi, lihat juga: System.Windows.Forms.SystemInformation.UserDomainName
Ashish Singh
9

Hanya dalam kasus seseorang mencari Nama Tampilan pengguna yang bertentangan dengan Nama Pengguna , seperti saya.

Inilah perlakukannya:

System.DirectoryServices.AccountManagement.UserPrincipal.Current.DisplayName

Tambahkan Referensi ke System.DirectoryServices.AccountManagementdalam proyek Anda.

Bhramar
sumber
6

Saya sudah mencoba semua jawaban sebelumnya dan menemukan jawabannya di MSDN setelah tidak ada yang bekerja untuk saya. Lihat 'UserName4' untuk yang benar untuk saya.

Saya mencari Pengguna yang Masuk , seperti yang ditampilkan oleh:

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

Inilah sedikit fungsi yang saya tulis untuk mencoba semuanya. Hasil saya ada di komentar setelah setiap baris.

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;
}

Memanggil fungsi ini mengembalikan nama pengguna yang masuk dengan kembali.

Pembaruan: Saya ingin menunjukkan bahwa menjalankan kode ini pada contoh server lokal saya menunjukkan kepada saya bahwa Username4 mengembalikan "" (string kosong), tetapi UserName3 dan UserName5 mengembalikan Pengguna yang login. Hanya sesuatu yang perlu diwaspadai.

FlashTrev
sumber
Situs web saya menggunakan IIS tetapi ketika saya mengunjungi halaman dari komputer lain dalam jaringan, saya tetap melihat "Layanan Jaringan" sebagai nama pengguna. Saya mencoba semua opsi berbeda tetapi tidak memberi saya pengguna yang masuk yang melihat halaman. Ada ide?
Si8
3
CATATAN: Tidak dibuat jelas, tetapi contoh di atas berlaku dalam konteks aplikasi web yang berjalan di IIS, di mana beberapa di antaranya akan menampilkan nama akun windows server yang mengeksekusi kumpulan aplikasi ASP.Net. Jika berjalan sebagai program interaktif atau layanan windows, yang dari HttpContext tidak akan tersedia, dan yang lain harus digunakan untuk menemukan akun tempat proses dijalankan.
Oskar Berggren
4

Ini kodenya (tetapi tidak dalam 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

Ini kodenya (sekarang juga dalam 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;
    }
}
Michael B
sumber
Misalkan jawaban dalam C #
Shivam Bharadwaj
4

coba ini

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

sekarang terlihat lebih baik

priyesh jaiswal
sumber
2

Untuk aplikasi Windows Forms yang akan didistribusikan ke beberapa pengguna, banyak di antaranya masuk melalui vpn, saya telah mencoba beberapa cara yang semuanya bekerja untuk pengujian mesin lokal saya tetapi tidak untuk yang lain. Saya menemukan artikel Microsoft yang saya adaptasi dan berfungsi.

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;
        }
    }
}
hujan john
sumber
1

Dapatkan nama pengguna Windows saat ini:

using System;

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

        //  <-- Keep this information secure! -->
        Console.WriteLine("UserName: {0}", Environment.UserName);
    }
}
Ali Eshghi
sumber
Situs web saya menggunakan IIS tetapi ketika saya mengunjungi halaman dari komputer lain dalam jaringan, saya tetap melihat "Layanan Jaringan" sebagai nama pengguna. Saya mencoba semua opsi berbeda tetapi tidak memberi saya pengguna yang masuk yang melihat halaman. Ada ide?
Si8
1

Jika bermanfaat bagi orang lain, ketika saya memutakhirkan aplikasi dari aplikasi c # .net 3.5 ke Visual Studio 2017 baris kode User.Identity.Name.Substring(4);ini melontarkan kesalahan ini " startIndex tidak boleh lebih besar dari panjang string " (tidak rusak sebelumnya).

Itu senang ketika saya mengubahnya System.Security.Principal.WindowsIdentity.GetCurrent().Nametetapi saya akhirnya menggunakan Environment.UserName;untuk mendapatkan pengguna Windows yang masuk dan tanpa bagian domain.

Doreen
sumber
Terima kasih @doreen, Anda menganggapnya berguna.
Shivam Bharadwaj
0

Saya memeriksa sebagian besar jawaban di sini dan tidak ada yang memberi saya nama pengguna yang tepat.

Dalam kasus saya, saya ingin mendapatkan nama pengguna yang masuk, sambil menjalankan aplikasi saya dari pengguna yang berbeda, seperti ketika menggeser + klik kanan pada file dan "Jalankan sebagai pengguna yang berbeda".

Jawaban yang saya coba berikan nama pengguna 'lain'.

Posting blog ini menyediakan cara untuk mendapatkan nama pengguna yang masuk, yang berfungsi bahkan dalam skenario saya:
https://smbadiwe.github.io/post/track-activities-windows-service/

Ini menggunakan Wtsapi

Alonzzo2
sumber