¿Por qué cuando un usuario se conecta a un servidor de Terminal Server el servidor de licencias registra un evento 4105 en el visor de sistema?

Hola a todos,

Recientemente nos hemos encontrado con un caso curioso, en el que hemos estado trabajando unas cuantas semanas, que implica tanto a la parte de Core como de Directorio Activo y queríamos comentároslo. Esperamos que os sea de utilidad :).

Cuando un usuario se conecta a un servidor de Terminal Server, el servidor de licencias registra el siguiente evento:

Event ID 4105

Source Microsoft-Windows-TerminalServices-Licensing

Type Warning

Description

The Terminal Services license server cannot update the license attributes for user "user" in the Active Directory Domain "domain". Ensure that the computer account for the license server is a member of Terminal Server License Servers group in Active Directory domain "domain".

If the license server is installed on a domain controller the Network Service account also needs to be a member of the Terminal Server License Servers group.

If the license server is installed on a domain controller after you have added the appropriate accounts to the Terminal Server License Servers group you must restart the Terminal Services Licensing service to track or report the usage of TS Per User CALs.

Win32 error code: 0x80070005

El error 4105 ocurre en los usuarios migrados desde un entorno NT/2000. Cuando se actualiza el esquema del dominio a 2003, los usuarios creados a partir de ese momento, incluyen permisos de lectura/escritura para el grupo Terminal Server License Servers en su security descriptor. Esto es debido a que el grupo Terminal Server License Servers se crea al ampliar el esquema a 2003 ya que en 2000 no existía y se modifica el defaultSecurityDescriptor de la clase user añadiendo la siguiente ACE:

(OA;;WPRP;6db69a1c-9422-11d1-aebd-0000f80367c1;;S-1-5-32-561)

Donde:

  • 6db69a1c-9422-11d1-aebd-0000f80367c1 –> es la propiedad sobre la que damos los permisos (terminalserver)
  • WPRP –> Write/Read property
  • S-1-5-32-561 –> SID del grupo Terminal Server License Servers

Llegados a este punto tenemos dos posibilidades:

  • Aplicar la ACE para todos los objetos en el naming context de dominio.

Para ello, lo que tenemos que hacer es ejecutar el comando dsacls "dc=XXXX,dc=XXXX,dc=XXXX,dc=XXXX” /I:T /G "BUILTIN\Terminal Server License Servers”:WPRP;terminalServer” . Por ejemplo, si nuestro dominio se llamase contoso.com el comando sería:

dsacls "dc=contoso,dc=com” /I:T /G "BUILTIN\Terminal Server License Servers”:WPRP;terminalServer”

  • Dar permisos usuario a usuario utilizando el comando:

dsacls "CN=XXXX,OU=XXXX,OU=XXXX,OU=XXXX,DC=XXXX,DC=XXXX,DC=XXX" /G "BUILTIN\Terminal Server License Servers:WPRP;terminalServer"

Este comando lo que hace es precisamente dar permisos de lectura/escritura al grupo Terminal Server License Servers sobre la propiedad terminalServer de un usuario. Por tanto, lo que necesitamos para resolver el problema es identificar todos los usuarios creados antes de actualizar el esquema a 2003 (y que vayan a acceder a través de terminal server) y darle los permisos antes mencionados.

En este punto es necesario identificar los usuarios sobre los que necesitamos dar los permisos, basándonos en la pertenencia a un grupo o en la fecha de creación. Si os vais a basar en la pertenencia a grupos, os recomendamos seguir los pasos descritos en el siguiente post:

Diversas herramientas no muestran todos los miembros de un grupo en el Directorio Activo

De acuerdo con el post, un posible script sería como el siguiente:

Set objGroup = GetObject _

    ("LDAP://cn=XXXX, ou=XXXX, dc=XXXX, dc=XXXX”)

set objShell = WScript.CreateObject("WScript.Shell")

For Each strUser on objGroup.Member

        Wscript.Echo strUser

         set objExec = objShell.Exec("dsacls """ + strUser + """ /G ""BUILTIN\Terminal Server License Servers:WPRP;terminalServer""")

El anterior script daría permisos a 1000 usuarios pertenecientes a un grupo administrativo. Si el número de usuarios es mayor, habría que utilizar otro script.

Nuestros compañeros de desarrollo nos han comentado que el script se complicaría bastante por lo que os recomendamos abrir un caso con ellos para que os puedan guiar de la mejor manera. Asimismo, si lo que queremos es dar permisos a usuarios de una OU específica el script también sería diferente.

Por último, si os queréis basar en la fecha de creación de los usuarios también deberíamos utilizar un script diferente y bastante más complejo. Además, necesitaríamos utilizar un filtro para la query LDAP del tipo (&(objectclass=user)(whenCreated>=20010420235531.0Z)(whencreated<=20010420235531.0Z) .

Un saludo,

Rafael Basterra Careaga y Yolanda Muñoz Muñoz