Come posso ottenere il nome utente corrente in .NET usando C #?


606

Come posso ottenere il nome utente corrente in .NET usando C #?

Risposte:


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

96
In che modo è diverso da Environment.UserName?
Sam Harwell,

59
@SimonGillbee, questo è sbagliato, Environment.UserNamerestituirà l'utente "RunAs".
Bolu,

5
Per verificare .... MessageBox.Show(Environment.UserName);inseriscilo nel tuo window_loadedevento ed eseguilo utilizzando RunAs ....
Bolu,


4
Questo ritorna Domain\Username. Come posso ottenere il nome associato al nome utente?
SearchForKnowledge,

325

Se ti trovi in ​​una rete di utenti, il nome utente sarà diverso:

Environment.UserName
- Will Display format : 'Username'

piuttosto che

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

Scegli il formato che desideri.


7
Puoi usare Environment.UserDomainName + "\\" + Environment.UserNameper ottenere apparentemente lo stesso risultato di System.Security.Principal.WindowsIdentity.GetCurrent().Name. Ora, qual è la differenza, chiedi ... Non ne sono sicuro.
Gutblender,

9
Avevo bisogno di fare in modo che l'utente eseguisse l'app piuttosto che chi ha effettuato l'accesso (Environment.UserName non è quello che voglio), quindi ho fatto quanto segue per eliminare il dominio: System.Security.Principal.WindowsIdentity.GetCurrent().Name.Split( '\\' ).Last();
thehelix,

Devi aggiungere ToArray()dopo Splitprima di chiamareLast()
codenamezero

1
@codenamezero No ToArray()è necessario. Avresti bisogno using System.Linq;però.
TheSoftwareJedi

112

Prova la proprietà: Environment.UserName.


5
Oppure,string userName = Environment.UserName;
Ciambella

10
Attenzione: come Simon Gillbee menzionato nei commenti della risposta accettata, Environment.UsernNamefornisce il nome dell'account di accesso, ma WindowsIdentity.GetCurrent().Namerestituisce il nome dell'account in cui è in esecuzione l'applicazione.
Gerwald,

5
@leo: Attenzione: anche queste informazioni sono errate, vedi la risposta di Bolu . :-)
TJ Crowder,

NON usarlo con ASP.NET. docs.microsoft.com dice: "Se un'applicazione ASP.NET viene eseguita in un ambiente di sviluppo, la proprietà UserName restituisce il nome dell'utente corrente. In un'applicazione ASP.NET pubblicata, questa proprietà restituisce il nome dell'account del pool di applicazioni ( come AppPool predefinito). "
feihoa,

28

La documentazione per Environment.UserName sembra essere un po 'in conflitto:

Proprietà Environment.UserName

Sulla stessa pagina si dice:

Ottiene il nome utente della persona attualmente connessa al sistema operativo Windows.

E

visualizza il nome utente della persona che ha avviato il thread corrente

Se si verifica Environment.UserName utilizzando RunAs, verrà visualizzato il nome dell'account utente RunAs, non l'utente originariamente connesso a Windows.


24

Assolutamente secondo le altre risposte, ma vorrei evidenziare un altro metodo che dice

String UserName = Request.LogonUserIdentity.Name;

Il metodo sopra riportato mi ha restituito il nome utente nel formato: DomainName \ UserName . Ad esempio, EUROPE \ UserName

Che è diverso da:

String UserName = Environment.UserName;

Quale visualizzato nel formato: Nome utente

E infine:

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

che ha dato: NT AUTHORITY\IUSR(durante l'esecuzione dell'applicazione sul server IIS) e DomainName\UserName(durante l'esecuzione dell'applicazione su un server locale).


Quale spazio dei nomi è necessario per utilizzare la "Richiesta".
TK-421,

1
@ TK-421 Requestfunziona solo se sei un'applicazione web. È un'istanza diSystem.Web.HttpRequest
Gerardo Grignoli il

22

Uso:

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

Questo sarà il nome di accesso.


11

Puoi anche provare a usare:

Environment.UserName;

Come questo...:

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

Spero che questo sia stato utile.


11

Ho provato diverse combinazioni da risposte esistenti, ma mi stavano dando

DefaultAppPool
IIS APPPOOL
IIS APPPOOL\DefaultAppPool

Ho finito per usare

string vUserName = User.Identity.Name;

Il che mi ha dato solo il nome utente del dominio dell'utente reale.


Eccellente. Ho anche ricevuto solo l'identità del pool di app. Ma il tuo codice ha risolto il mio problema. Grazie mille.
SuryaKavitha,

Sembra che tu volessi il nome utente dell'utente che fa una richiesta, immagino a un controller MVC o API Web. È diverso dal nome utente con cui è in esecuzione il processo
Ben Aaronson,

@BenAaronson La domanda non dice nulla su quale nome utente sta eseguendo un processo. Avevo bisogno del nome utente di dominio attualmente connesso e una ricerca mi ha portato a questa pagina, questo codice ha finito per darmi quello di cui avevo bisogno.
Daniel E.

11
String myUserName = Environment.UserName

Questo ti darà un output - your_user_name


9

Utilizzare System.Windows.Forms.SystemInformation.UserNameper l'utente attualmente connesso in quanto Environment.UserNamerestituisce ancora l'account utilizzato dal processo corrente.


Grazie per aver condiviso, vedi anche: System.Windows.Forms.SystemInformation.UserDomainName
Ashish Singh

9

Nel caso in cui qualcuno stia cercando il nome visualizzato dell'utente anziché il nome utente , come me.

Ecco il piacere:

System.DirectoryServices.AccountManagement.UserPrincipal.Current.DisplayName

Aggiungi riferimento a System.DirectoryServices.AccountManagementnel tuo progetto.


6

Ho provato tutte le risposte precedenti e ho trovato la risposta su MSDN dopo che nessuna di queste ha funzionato per me. Vedi 'UserName4' per quello corretto per me.

Sto cercando l'utente connesso , come mostrato da:

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

Ecco una piccola funzione che ho scritto per provarli tutti. Il mio risultato è nei commenti dopo ogni riga.

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

La chiamata a questa funzione restituisce il nome utente registrato al ritorno.

Aggiornamento: Vorrei sottolineare che l'esecuzione di questo codice sulla mia istanza del server locale mi mostra che Username4 restituisce "" (una stringa vuota), ma UserName3 e UserName5 restituiscono l'utente che ha effettuato l'accesso. Solo qualcosa di cui fare attenzione.


Il mio sito Web utilizza IIS ma quando visito la pagina da un altro computer all'interno della rete, continuo a vedere "Servizio di rete" come nome utente. Ho provato tutte le diverse opzioni ma non mi dà l'utente che sta visualizzando la pagina. Qualche idea?
Si8

3
NOTA: Non è stato chiarito, ma l'esempio sopra si applica nel contesto di un'applicazione Web in esecuzione in IIS, in cui molti di essi visualizzeranno il nome dell'account Windows del server che esegue il pool di applicazioni ASP.Net. Se eseguito come programma interattivo o servizio Windows, quello di HttpContext non sarà disponibile e uno degli altri dovrebbe essere usato per trovare l'account con cui viene eseguito il processo.
Oskar Berggren,

4

Ecco il codice (ma non in 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

Ecco il codice (ora anche in 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;
    }
}

Supponiamo di avere una risposta in C #
Shivam Bharadwaj,

4

prova questo

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

ora sembra meglio


2

Per un'app di Windows Form che doveva essere distribuita a diversi utenti, molti dei quali accedevano tramite VPN, avevo provato diversi modi che funzionavano tutti per i test delle macchine locali, ma non per altri. Mi sono imbattuto in un articolo di Microsoft che ho adattato e funzionante.

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

Ottieni l'attuale nome utente di Windows:

using System;

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

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

Il mio sito Web utilizza IIS ma quando visito la pagina da un altro computer all'interno della rete, continuo a vedere "Servizio di rete" come nome utente. Ho provato tutte le diverse opzioni ma non mi dà l'utente che sta visualizzando la pagina. Qualche idea?
Si8

1

Nel caso in cui sia utile ad altri, quando ho aggiornato un'app da c # .net 3.5 a Visual Studio 2017 questa riga di codice User.Identity.Name.Substring(4);ha generato questo errore " startIndex non può essere più grande della lunghezza della stringa " (non ha funzionato prima).

È stato felice quando l'ho cambiato, ma alla System.Security.Principal.WindowsIdentity.GetCurrent().Namefine ho usato Environment.UserName;per ottenere l'utente di Windows connesso e senza la parte del dominio.


Grazie @doreen l'hai trovato utile.
Shivam Bharadwaj,

0

Ho esaminato la maggior parte delle risposte qui e nessuna di esse mi ha dato il nome utente giusto.

Nel mio caso volevo ottenere il nome utente registrato, mentre eseguivo la mia app da un altro utente, come quando maiusc + clic destro su un file e "Esegui come un altro utente".

Le risposte che ho provato mi hanno dato l'username 'altro'.

Questo post sul blog fornisce un modo per ottenere il nome utente registrato, che funziona anche nel mio scenario:
https://smbadiwe.github.io/post/track-activities-windows-service/

Usa Wtsapi

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.