2012-08-28 22 views
8

Sé que la siguiente función devuelve el nombre del usuario actual de Windows en el formato dominio \ nombre de usuario.¿Cómo obtengo el nombre del usuario actual de Windows en formato de nombre de usuario @ dominio?

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

Pero, ¿cómo puedo obtener el nombre del usuario en formato [email protected]?

EDIT:

estoy respondiendo en esta edición como todos los que han respondido tiene la misma idea básica.

Según lo que me han dado a entender, el análisis del nombre del formato domain\username y su construcción como [email protected] no es seguro ni aconsejable. Creo que esto es así porque no hay garantía de que los dos nombres de dominio sean iguales en los diferentes formatos. Por ejemplo, en la empresa donde trabajo, la parte domain del formato domain\username se basa en el departamento, pero en el [email protected], es el nombre de la empresa. Es el tipo de cosa que requiere una búsqueda de DNS.

Esperaba que hubiera una API que hiciera esta búsqueda de DNS. Supongo que debería haber puesto esta información en mi pregunta original. Lo siento.

+0

Estoy usando C# en mi aplicación. –

+0

La propiedad que está buscando es el nombre principal del usuario (UPN). –

+1

Intente enumerar WindowsIdentity.GetCurrent(). Reclamaciones, el UPN podría estar incluido. Si no, use P/Invoke para llamar a la función TranslateName. –

Respuesta

3

Todo el código para tomar el nombre en Domain\user name formato y analizar sintácticamente no va a funcionar en todas las situaciones. La respuesta es que debe realizar llamadas a Active Directory para obtener el nombre principal del usuario. Resulta que no puedo confiar en que Active Directory se instale en el escritorio, ya que muchos departamentos de policía no instalan el directorio en sus computadoras portátiles en caso de que sea robado mientras un policía no está en el automóvil. (¡Hablando de agallas, robando una computadora de un vehículo policial!)

Hemos encontrado nuestra propia solución para nuestra situación. Almacenamos los nombres de usuario en nuestra base de datos en el formato Domain\user name. Cuando el programa se inicia, verifica si el nombre de usuario actual de Windows (en el mismo formato) está en la base de datos. Si es así, el programa usa ese usuario como el usuario actual y se ejecuta. Si el usuario actual de Windows no está en nuestra base de datos, el programa vuelve a nuestro código anterior.

De esta manera, el usuario puede iniciar sesión en la máquina con cualquier formato para su nombre de usuario y se autentica con Windows. Nuestro programa siempre obtiene el nombre de usuario en el mismo formato y siempre verifica el nombre de usuario en ese formato. Windows autentica al usuario y no a nosotros.

+1

Para el registro, Active Directory es un componente del servidor por lo que es nunca "instalado en el escritorio". Probablemente el problema fue que no podía confiar en tener conectividad de red con los controladores de dominio. –

+0

Sí, eso es exactamente correcto. Las computadoras portátiles están en autos de policía. No todos ellos tienen ningún tipo de conectividad mientras viajan, y aquellos que lo hacen pueden ser poco confiables. –

+0

Así que básicamente nos dices: 'el departamento de policía no quiere que los nombres de usuario se almacenen localmente por razones de seguridad, pero ignoro ese requisito para que mi programa funcione'' – Sam

3

se puede dividir el nombre utilizando \ como delimitador, a continuación, invertir el orden de este modo:

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 importante tener en cuenta que se requiere una doble barra invertida \\ porque una barra invertida es un carácter especial. Añadimos la segunda barra invertida en el ejemplo anterior para escapar del carácter especial y usarlo como un personaje normal.

+0

Lo siento por la respuesta engañosa - en realidad estaba tipeando al mismo tiempo que yo. – Kevin

+0

No te preocupes, @Kevin, aunque tuve que agregar la verificación condicional para probar y unirte :-P. – Sam

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

Utiliza la pestaña [1] dos veces, que devolverá el nombre de usuario @ nombre de usuario. – Sam

+0

Gracias Sam por las observaciones, gracias –

9

Algo como esto debería funcionar ...

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

Algo a lo largo de estas líneas.

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

Su formato de código se echó a perder. Además, ¿por qué su código asume que 'nameParts.Length == 1' significa uso seguro de una matriz que debe tener una longitud de ** al menos ** (y probablemente no más de) 2. En su hipótesis, podría ser más apropiado para verificar el UpperBound como '(nameParts.GetUpperBound (0) == 1)' – Sam

+0

Su código no se compilará. no puede asignar 'nameParts', que es una matriz de cadenas a una cadena. Además, 'string.format' no existe, es' string.Format'. Finalmente, 'Split (@" \ ")' no es posible ya que Split no acepta una cadena (sin embargo acepta una cadena []) – Sam

+0

gracias por la observación –

2

Uso

System.DirectoryServices.AccountManagement.UserPrincipal.Current.UserPrincipalName 

Esto devuelve el UPN del usuario actual. Requiere una referencia a System.DirectoryServices.AccountManagement.

Cuestiones relacionadas