Risposte:
string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
Environment.UserNamerestituirà l'utente "RunAs".
MessageBox.Show(Environment.UserName);inseriscilo nel tuo window_loadedevento ed eseguilo utilizzando RunAs ....
Domain\Username. Come posso ottenere il nome associato al nome utente?
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.
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.
System.Security.Principal.WindowsIdentity.GetCurrent().Name.Split( '\\' ).Last();
ToArray()dopo Splitprima di chiamareLast()
ToArray()è necessario. Avresti bisogno using System.Linq;però.
Prova la proprietà: Environment.UserName.
string userName = Environment.UserName;
Environment.UsernNamefornisce il nome dell'account di accesso, ma WindowsIdentity.GetCurrent().Namerestituisce il nome dell'account in cui è in esecuzione l'applicazione.
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.
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).
Requestfunziona solo se sei un'applicazione web. È un'istanza diSystem.Web.HttpRequest
Uso:
System.Security.Principal.WindowsIdentity.GetCurrent().Name
Questo sarà il nome di accesso.
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.
String myUserName = Environment.UserName
Questo ti darà un output - your_user_name
Utilizzare System.Windows.Forms.SystemInformation.UserNameper l'utente attualmente connesso in quanto Environment.UserNamerestituisce ancora l'account utilizzato dal processo corrente.
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.
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;
}
}
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
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;
}
}
}
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);
}
}
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.
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
Environment.UserName?