Professional Documents
Culture Documents
44
saber si el usuario
actual es
administrador del
dominio?
Lluis Franco
HOW TO: ¿COMO SABER SI EL USUARIO ACTUAL ES ADMINISTRADOR
DEL DOMINIO?
Nivel: Intermedio
por Lluis Franco
Esta es una cuestión que suscita dudas muy a menudo en todo tipo de foros de
desarrolladores, ya que se trata de una necesidad muy común en las aplicaciones de gestión de
escritorio.
De este modo para saber si nuestro usuario es administrador local, basta con hacer esto:
A partir del usuario que ejecuta nuestra aplicación (válido también en caso de que se haga
suplantación de usuario), creamos un objeto Principal e invocamos al método pasándole el
grupo contra el que deseamos validar. ¿A qué es sencillo?
Nota: Por motivos de rendimiento, para determinar la función del usuario se recomienda
utilizar la sobrecarga de IsInRole(SecurityIdentifier) como sobrecarga preferible.
El problema de esta enumeración es que como su nombre indica, sólo contempla los grupos
locales. Así que si queremos saber si pertenece a un grupo del dominio parece que tendremos
que buscar el SID del grupo, o el nombre, y “hardcodearlo” –introducirlo a mano- en nuestra
aplicación.
¿Feo verdad? Pues la verdad es que si, muy feo… vamos a investigar un poco más, a ver si
encontramos otra forma.
Identificadores de seguridad: SID
Existe una enumeración llamada WellKnownSidType, que devuelve los SID (Security Identifiers,
identificadores de seguridad) más utilizados.
Los SID son valores únicos de longitud variable que se usan para identificar una entidad
principal de seguridad (usuario) o un grupo de seguridad en sistemas operativos Windows. Los
SID conocidos son un grupo de estos identificadores que representan a usuarios o grupos
comunes y cuyos valores permanecen constantes en todos los sistemas operativos. Si quieres
profundizar en estos elementos y su composición puedes hacerlo en este artículo de la
Wikipedia (inglés).
En la Tabla C, al final, se muestra la lista de los SID conocidos. Verás que hay muchos usuarios y
grupos comunes, y entre ellos ¡BINGO!, está también el SID del grupo de administradores del
dominio (en rojo, AccountDomainAdminSid), y parece que por lo tanto ya podemos volver a
probar el método IsInRole:
SecurityIdentifier sid =
new SecurityIdentifier(WellKnownSidType.AccountDomainAdminsSid, null);
return wp.IsInRole(sid);
Se necesita especificar el segundo argumento en el constructor del SID de grupo, y por lo tanto
no funciona. El error habla de un AccountDomainSid. ¿Y qué es esto?
DomainSid
Según la documentación del constructor debe proporcionarse el SID del dominio para que éste
ueda devolver algunos identificadores WellKnownSidType, entre los cuales está el de que nos
interesa de los administradores del dominio.
Dicho de otro modo, o sabemos el SID de nuestro dominio o todo lo anterior no vale para
nada… :-(
¿Y cómo podemos saber el SID de dominio? Después de buscar un ratito, lo único que he
encontrado es una utilidad de consola llamada PsGetSid, que forma parte de las PSTools del
inefable Mark Russinovich. Basta descargar esta utilidad y ejecutarla desde la consola de este
modo para saber el SID de nuestro dominio (el nombre de dominio en formato
“microsoft.com” o “net.volvo.com”):
Sin embargo tener que hacer esto y usar el identificador “hardcodeado” en el código no sería
tampoco de gran ayuda. Así que vamos a probar si podemos recuperar esta propiedad del
esquema de Directorio Activo mediante un DirectoryEntry. Para ello utilizaremos la clase
Domain:
using System.DirectoryServices;
using System.DirectoryServices.ActiveDirectory;
using System.Net.NetworkInformation;
using System.Security.Principal;
namespace Alpha.Code
{
public static class SecurityExtensions
{
public static bool IsDomainAdmin (this WindowsIdentity identity)
{
Domain d = Domain.GetDomain(new
DirectoryContext(DirectoryContextType.Domain, getDomainName()));
using (DirectoryEntry de = d.GetDirectoryEntry())
{
byte[] bdomSid = (byte[])de.Properties["objectSid"].Value;
string sdomainSid = sIDtoString(bdomSid);
WindowsPrincipal wp = new WindowsPrincipal(identity);
SecurityIdentifier dsid = new SecurityIdentifier(sdomainSid);
SecurityIdentifier dasid = new SecurityIdentifier(
WellKnownSidType.AccountDomainAdminsSid, dsid);
return wp.IsInRole(dasid);
}
}
Y ahora la forma de usarlo sería tan sencilla como hacer algo así:
if (WindowsIdentity.GetCurrent().IsDomainAdmin())
{
//Acciones a realizar si el usuario es administrador de dominio...
}
APÉNDICE: TABLAS
Nombre Descripción
AccountOperator Los operadores de cuentas administran las cuentas de los usuarios de un
equipo o dominio.
Administrator Los administradores tienen acceso completo y sin restricciones al equipo o
dominio.
BackupOperator Los operadores de copia de seguridad pueden reemplazar las restricciones
de seguridad con el único propósito de hacer copias de seguridad de los
archivos o de restaurarlas.
Tabla B.- Identificadores de recursos bien conocidos (RID) para usar con IsInRole
Nombre Descripción
NullSid Indica un SID null.
WorldSid Indica un SID que coincide con todos.
LocalSid Indica un SID local.
CreatorOwnerSid Indica un SID que coincide con el propietario o
creador de un objeto.
CreatorGroupSid Indica un SID que coincide con el grupo de
creadores de un objeto.
CreatorOwnerServerSid Indica un SID de Creator Owner Server.
CreatorGroupServerSid Indica un SID de servidor de grupo de creadores.
NTAuthoritySid Indica un SID para la autoridad de Windows NT.
DialupSid Indica un SID para una cuenta de acceso
telefónico.
NetworkSid Indica un SID para una cuenta de red. Este SID se
agrega al proceso de un símbolo (token) cuando
inicia sesión a través de una red.
BatchSid Indica un SID para un proceso por lotes. Este SID
se agrega al proceso de un símbolo (token) cuando
inicia sesión como un trabajo por lotes.
InteractiveSid Indica un SID para una cuenta interactiva. Este SID
se agrega al proceso de un símbolo (token) cuando
inicia sesión interactivamente.
ServiceSid Indica un SID para un servicio. Este SID se agrega al
proceso de un símbolo (token) cuando inicia
sesión como servicio.
AnonymousSid Indica un SID para la cuenta anónima.
ProxySid Indica un SID de servidor proxy.
EnterpriseControllersSid Indica un SID para un controlador de empresa.
SelfSid Indica un SID para sí mismo.
AuthenticatedUserSid Indica un SID para un usuario autenticado.
RestrictedCodeSid Indica un SID para código restringido.
TerminalServerSid Indica un SID que coincide con una cuenta de
Terminal Server.
RemoteLogonIdSid Indica un SID que coincide con inicios de sesión
remotos.
LogonIdsSid Indica un SID que coincide con identificadores de
inicio de sesión.
LocalSystemSid Indica un SID que coincide con el sistema local.
LocalServiceSid Indica un SID que coincide con un servicio local.
NetworkServiceSid Indica un SID que coincide con un servicio de red.
Acerca de campusMVP
CampusMVP te ofrece la mejor formación en tecnología Microsoft a través de nuestros cursos online y
nuestros libros especializados, impartidos y escritos por conocidos MVP de Microsoft. Visita nuestra
página y prueba nuestros cursos y libros gratuitamente. www-campusmvp.com