2012-08-28 7 views
8

Ich weiß, dass die folgende Funktion den aktuellen Windows-Benutzernamen im Format Domäne \ Benutzername zurückgibt.Wie bekomme ich den Namen des aktuellen Windows-Benutzers in Benutzername @ Domain-Format?

Convert.ToString(WindowsIdentity.GetCurrent().Name); 

Aber wie erhalte ich den Namen des Benutzers in [email protected] Format?

EDIT:

Ich bin in diesem bearbeiten reagiert wie jeder, der geantwortet hat die gleiche Grundidee hat.

Von dem, was ich gegeben habe zu verstehen, Parsing der Name von domain\username Format und die Konstruktion als [email protected] ist nicht sicher oder empfohlen. Ich glaube, das ist so, weil es keine Garantie gibt, dass die beiden Domain-Namen in den verschiedenen Formaten gleich sind. Zum Beispiel in der Firma, in der ich arbeite, der domain Teil des domain\username Formats basiert auf departement, aber in [email protected], ist es der Firmenname. Es ist die Art von Sache, die eine DNS-Suche erfordert.

Ich hatte gehofft, dass es eine API gab, die diese DNS-Suche durchführte. Ich denke, ich hätte diese Informationen in meine ursprüngliche Frage einfügen sollen. Es tut uns leid.

string[] splitName = WindowsIdentity.GetCurrent().Name.Split('\\'); 
//check that splitName contains at least 2 values before using 
string name = (splitName.Length > 1) ? splitName[1] + "@" + splitName[0] : null; 

Es ist wichtig zu beachten, dass ein doppelter Schrägstrich \\ ist erforderlich, da ein Backslash ein Sonderzeichen ist:

+0

Ich verwende C# in meiner Anwendung. –

+0

Die Eigenschaft, nach der Sie suchen, ist der Benutzerprinzipalname (User Principal Name, UPN). –

+1

Versuchen Sie WindowsIdentity.GetCurrent() aufzulisten. Ansprüche, der UPN könnte enthalten sein. Wenn nicht, verwenden Sie P/Invoke, um die TranslateName-Funktion aufzurufen. –

Antwort

3

des Codes Alle Namen in Domain\user name Format zu nehmen und analysieren es in allen Situationen nicht funktionieren. Die Antwort ist, dass Sie Anrufe an Active Directory tätigen müssen, um den Benutzerprinzipalnamen zu erhalten. Es stellt sich heraus, dass ich mich nicht darauf verlassen kann, dass Active Directory auf dem Desktop installiert wird, da viele Polizeibehörden das Verzeichnis nicht auf ihren Laptops installieren, falls es gestohlen wird, während sich ein Polizist nicht im Auto befindet. (Sprechen Sie über Mutsy, stehlen einen Computer aus einem Polizeifahrzeug!)

Wir haben unsere eigene Lösung für unsere Situation gefunden. Wir speichern die Benutzernamen in unserer Datenbank im Format Domain\user name. Wenn das Programm gestartet wird, überprüft es, ob der aktuelle Windows-Benutzername (im selben Format) in der Datenbank vorhanden ist. Wenn dies der Fall ist, verwendet das Programm diesen Benutzer als aktuellen Benutzer und wird ausgeführt. Wenn der aktuelle Windows-Benutzer nicht in unserer Datenbank ist, greift das Programm auf unseren vorherigen Code zurück.

Auf diese Weise kann sich der Benutzer am Computer anmelden, indem er ein beliebiges Format für seinen Benutzernamen verwendet und sich mit Windows authentifiziert. Unser Programm erhält immer den Benutzernamen im selben Format und überprüft immer den Benutzernamen in diesem Format. Windows authentifiziert den Benutzer und nicht uns.

+1

Für den Eintrag ist Active Directory eine Serverkomponente nie "auf dem Desktop installiert". Wahrscheinlich war das Problem, dass Sie sich nicht auf eine Netzwerkverbindung zu den Domänencontrollern verlassen konnten. –

+0

Ja, das stimmt genau. Die Laptops sind in Polizeiautos. Nicht alle von ihnen haben irgendeine Verbindung während der Fahrt, und diejenigen, die das tun, sind möglicherweise unzuverlässig. –

+0

Sie sagen uns im Grunde: "Die Polizeibehörde möchte nicht, dass Benutzernamen aus Sicherheitsgründen lokal gespeichert werden, aber ich ignoriere diese Anforderung, damit mein Programm funktioniert"? – Sam

3

Sie können den Namen \ als Trennzeichen, dann in umgekehrter Reihenfolge wie so aufgeteilt werden. Wir fügen den zweiten umgekehrten Schrägstrich im obigen Beispiel hinzu, um das Sonderzeichen zu umgehen und es als normales Zeichen zu verwenden.

+0

Entschuldigung für die Duplikate Antwort - Sie waren anschaulich tippen Sie es gleichzeitig wie ich war. – Kevin

+0

Keine Sorgen @Kevin, obwohl ich die bedingte Überprüfung hinzufügen musste, um zu versuchen und One-up Sie :-P. – Sam

3
var input = WindowsIdentity.GetCurrent().Name ; 
string[] tab = input.Split('\\'); 
var result = tab[1] + "@" + tab[0]; 
+0

Sie verwenden die Registerkarte [1] zweimal, wodurch Benutzername @ Benutzername zurückgegeben wird. – Sam

+0

Danke Sam für Bemerkungen, Danke –

9

So etwas sollte funktionieren ...

string[] temp = Convert.ToString(WindowsIdentity.GetCurrent().Name).Split('\\'); 
string userName = temp[1] + "@" + temp[0]; 
0

Etwas in dieser Richtung.

var nameParts = WindowsIdentity.GetCurrent().Name.Split(@"\"); 
string name = nameParts.Length == 1 
    ? nameParts 
    : string.format("{0}@{1}",nameParts[1],nameParts[0]); 
+0

Ihr Code-Format wurde durcheinander gebracht. Warum nimmt Ihr Code auch an, dass 'nameParts.Length == 1' die sichere Verwendung eines Arrays bedeutet, das eine Länge von ** mindestens ** (und wahrscheinlich nicht mehr als) haben sollte. 2. In Ihrer Annahme könnte es sein besser geeignet, das UpperBound wie folgt zu überprüfen '(nameParts.GetUpperBound (0) == 1)' – Sam

+0

Ihr Code wird nicht kompiliert. Sie können 'name'Parts', die ein String-Array ist, keinem String zuweisen. "String.format" existiert auch nicht, es ist 'string.Format'. Schließlich ist Split (@ "\") nicht möglich, da Split keine Zeichenkette akzeptiert (es akzeptiert jedoch eine Zeichenkette []) – Sam

+0

danke für die Bemerkung –

2

Verwenden

System.DirectoryServices.AccountManagement.UserPrincipal.Current.UserPrincipalName 

Dies ist der UPN des aktuellen Benutzers zurück. Erfordert einen Verweis auf System.DirectoryServices.AccountManagement.

Verwandte Themen