Geçerli kullanıcı adını C # kullanarak .NET'te nasıl edinebilirim?


606

Geçerli kullanıcı adını C # kullanarak .NET'te nasıl edinebilirim?

Yanıtlar:


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

96
Bunun farkı Environment.UserNamenedir?
Sam Harwell

59
@SimonGillbee, bu yanlış, Environment.UserName"RunAs" kullanıcı döndürür.
Bolu

5
Doğrulamak için .... MessageBox.Show(Environment.UserName);bunu window_loadedetkinliğinize koyun ve RunAs'ı kullanarak çalıştırın ....
Bolu


4
Bu geri döner Domain\Username. Kullanıcı adıyla ilişkili Adı nasıl alabilirim?
SearchForKnowledge

325

Bir kullanıcı ağındaysanız, kullanıcı adı farklı olacaktır:

Environment.UserName
- Will Display format : 'Username'

ziyade

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

İstediğiniz biçimi seçin.


7
Environment.UserDomainName + "\\" + Environment.UserNameGörünüşe göre aynı sonucu elde etmek için kullanabilirsiniz System.Security.Principal.WindowsIdentity.GetCurrent().Name. Differenceimdi, fark nedir, soruyorsun ... Emin deđilim.
Gutblender

9
Ben oturum açmış yerine uygulamayı çalıştıran kullanıcı almak gerekiyordu (Environment.UserName istediğim değil), bu yüzden etki alanını çıkarmak için aşağıdakileri yaptım: System.Security.Principal.WindowsIdentity.GetCurrent().Name.Split( '\\' ).Last();
thehelix

Sen eklemeniz gerekir ToArray()sonra Splitçağırmadan önceLast()
codenamezero

1
@codenamezero Hayır ToArray()gerekli. using System.Linq;Gerçi ihtiyacın var .
TheSoftwareJedi

112

Özelliğini deneyin: Environment.UserName.


5
Veya,string userName = Environment.UserName;
Donut

10
Dikkat: kabul edilen cevabın yorumlarında belirtildiği gibi Simon Gillbee Environment.UsernName, giriş yapmış hesap adını verir, ancak WindowsIdentity.GetCurrent().Nameuygulamanın çalıştığı hesap adını döndürür.
Gerwald

5
@leo: Dikkat: Bu bilgi de yanlış görünüyor, Bolu'nun cevabına bakınız . :-)
TJ Crowder

ASP.NET ile KULLANMAYIN. docs.microsoft.com şöyle diyor: "Bir ASP.NET uygulaması geliştirme ortamında çalışıyorsa, UserName özelliği geçerli kullanıcının adını döndürür. Yayımlanan bir ASP.NET uygulamasında, bu özellik uygulama havuzu hesabının adını döndürür ( Varsayılan AppPool gibi). "
feihoa

28

Environment.UserName belgeleri biraz çakışıyor gibi görünüyor:

Environment.UserName Özelliği

Aynı sayfada diyor ki:

Windows işletim sisteminde oturum açmış olan kişinin kullanıcı adını alır.

VE

geçerli konuyu başlatan kişinin kullanıcı adını görüntüler

Ortam.KullanıcıAdı'nı RunAs kullanarak test ederseniz, ilk olarak Windows'da oturum açmış olan kullanıcıya değil, RunAs kullanıcı hesap adını verir.


24

Diğer cevapları tamamen ikinci olarak görüyorum, ancak şunu söyleyen bir yöntemi daha vurgulamak istiyorum:

String UserName = Request.LogonUserIdentity.Name;

Yukarıdaki yöntem bana kullanıcı adını şu biçimde döndürdü: DomainName \ UserName . Örneğin, EUROPE \ KullanıcıAdı

Hangisi farklı:

String UserName = Environment.UserName;

Hangi formatta görüntülenir: KullanıcıAdı

Ve sonunda:

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

verdi: NT AUTHORITY\IUSR(uygulamayı IIS sunucusunda DomainName\UserNameçalıştırırken ) ve (uygulamayı yerel bir sunucuda çalıştırırken).


"İstek" i kullanmak için hangi ad alanı gereklidir?
TK-421

1
@ TK-421 Requestyalnızca bir web uygulamasıysanız çalışır. Bu bir örnekSystem.Web.HttpRequest
Gerardo Grignoli

22

kullanın:

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

Oturum açma adı bu olacaktır.


11

Ayrıca aşağıdakileri kullanmayı denemek isteyebilirsiniz:

Environment.UserName;

Bunun gibi...:

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

Umarım yardımcı olmustur.


11

Mevcut cevaplardan birkaç kombinasyon denedim, ama onlar bana

DefaultAppPool
IIS APPPOOL
IIS APPPOOL\DefaultAppPool

Kullanarak bitirdim

string vUserName = User.Identity.Name;

Bu da bana gerçek kullanıcıların alan adı kullanıcı adını verdi.


Mükemmel. Ayrıca yalnızca uygulama havuzu kimliğini aldım. Ama kodun sorunumu çözdü. Çok teşekkür ederim.
SuryaKavitha

Bir kullanıcı, bir MVC veya Web API denetleyicisi için sanırım kullanıcı adı istediğiniz gibi görünüyor. Sürecin altında çalıştığı kullanıcı
adından

@BenAaronson Soru, hangi kullanıcı adının bir işlem yürüttüğü hakkında hiçbir şey söylemiyor. Şu anda oturum açmış olan etki alanı kullanıcı adına ihtiyacım vardı ve bir arama beni bu sayfaya getirdi, bu kod bana ihtiyacım olanı verdi.
Daniel E.

11
String myUserName = Environment.UserName

Bu size çıktı verecektir - kullanıcı_adı


9

System.Windows.Forms.SystemInformation.UserNameGerçekte oturum açmış olan kullanıcı Environment.UserNameiçin geçerli işlem tarafından kullanılmakta olan hesabı döndürürken kullanın .


Paylaştığınız için teşekkür ederiz, ayrıca bkz: System.Windows.Forms.SystemInformation.UserDomainName
Ashish Singh

9

Birisinin benim gibi Kullanıcı Adı yerine kullanıcının Görünen Adını araması durumunda .

İşte tedavi:

System.DirectoryServices.AccountManagement.UserPrincipal.Current.DisplayName

System.DirectoryServices.AccountManagementProjenize referans ekleyin .


6

Önceki tüm cevapları denedim ve bunların hiçbiri benim için çalışmadan sonra MSDN'de cevabı buldum. Benim için doğru olanı görmek için 'KullanıcıAdı4'e bakınız.

Oturum açmış olan kullanıcının peşinde olduğum gibi:

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

İşte hepsini denemek için yazdığım küçük bir işlev. Sonucum her satırdan sonraki yorumlarda.

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

Bu işlevin çağrılması, oturum açmış kullanıcı adını döndürerek döndürür.

Güncelleme: Yerel sunucu örneğimde bu kodu çalıştırmanın Kullanıcı Adı4'ün "" (boş bir dize) döndürdüğünü, ancak KullanıcıAdı3 ve KullanıcıAdı5'in oturum açmış Kullanıcıyı döndürdüğünü belirtmek isterim. Dikkat edilmesi gereken bir şey.


Web sitem IIS kullanıyor ancak sayfayı ağ içindeki başka bir bilgisayardan ziyaret ettiğimde, kullanıcı adı olarak "Ağ Hizmeti" ni görmeye devam ediyorum. Ben tüm farklı bir seçenek denedim ama bana sayfayı görüntüleyen giriş yapmış kullanıcı vermiyor. Herhangi bir fikir?
Si8

3
NOT: Açık değildir, ancak yukarıdaki örnek IIS'de çalışan bir web uygulaması bağlamında geçerlidir, burada birkaç tanesi ASP.Net uygulama havuzunu çalıştıran sunucu windows hesabının adını görüntüler. Etkileşimli bir program veya windows hizmeti olarak çalıştırılıyorsa, HttpContext programından biri kullanılamaz ve diğerlerinden biri, işlemin yürütüldüğü hesabı bulmak için kullanılmalıdır.
Oskar Berggren

4

İşte kod (ama C # değil):

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

İşte kod (şimdi C # da):

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 # cevaplamak varsayalım
Shivam Bharadwaj

4

bunu dene

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

şimdi daha iyi görünüyor


3

Geçerli Windows kullanıcı adını edinin:

using System;

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

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

Web sitem IIS kullanıyor ancak sayfayı ağ içindeki başka bir bilgisayardan ziyaret ettiğimde, kullanıcı adı olarak "Ağ Hizmeti" ni görmeye devam ediyorum. Ben tüm farklı bir seçenek denedim ama bana sayfayı görüntüleyen giriş yapmış kullanıcı vermiyor. Herhangi bir fikir?
Si8

2

Birçoğu vpn üzerinden oturum açan birkaç kullanıcıya dağıtılacak bir Windows Forms uygulaması için, hepsi yerel makine testlerimde işe yarayan, ancak diğerleri için değil, birkaç yol denedim. Uyarladığım ve çalıştığım bir Microsoft makalesiyle karşılaştım.

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

Başkalarına yardımcı olması durumunda, bir uygulamayı c # .net 3.5 uygulamasından Visual Studio 2017'ye yükselttiğimde bu kod satırı User.Identity.Name.Substring(4);" startIndex, dize uzunluğundan daha büyük olamaz " (daha önce baulk yapmadı) bu hatayı attı .

Bunu değiştirdiğimde mutlu oldum, System.Security.Principal.WindowsIdentity.GetCurrent().Nameancak Environment.UserName;oturum açmış Windows kullanıcısını ve etki alanı kısmı olmadan almak için kullandım .


Teşekkürler @ doreen yararlı buldunuz.
Shivam Bharadwaj

0

Buradaki cevapların çoğunu geçtim ve hiçbiri bana doğru kullanıcı adını vermedi.

Benim durumumda, farklı bir kullanıcıdan uygulamamı çalıştırırken oturum açmış kullanıcı adını almak istedim, örneğin bir dosyaya shift + sağ tıklama ve "Farklı bir kullanıcı olarak çalıştır" gibi.

Denediğim cevaplar bana 'diğer' kullanıcı adını verdi.

Bu blog yazısı, senaryomda bile çalışan giriş yapan kullanıcı adını almanın bir yolunu sunar:
https://smbadiwe.github.io/post/track-activities-windows-service/

Wtsapi kullanır

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.