Hacer una copia de seguridad de la información de recuperación del TPM en AD DS

En este tema para profesionales de TI se describe cómo hacer una copia de seguridad de la información del Módulo de plataforma segura (TPM) en los Servicios de dominio de Active Directory (AD DS) para que puedas usar los AD DS para administrar el TPM desde un equipo remoto.

Acerca de la administración remota del TPM

Realizar copias de seguridad de la información del propietario del TPM para un equipo permite a los administradores de un dominio de configurar de forma remota el hardware de seguridad del TPM en el equipo local. Por ejemplo, es posible que los administradores deseen restablecer el TPM a la configuración predeterminada del fabricante cuando retiran o reutilizan equipos, sin necesidad de estar presentes en el equipo.

Puedes usar los AD DS para almacenar información del propietario del TPM para su uso en situaciones de recuperación en las que el propietario del TPM haya olvidado la contraseña o cuando debas tomar el control del TPM. Solo existe una contraseña de propietario de TPM por equipo; por lo tanto, el hash de la contraseña del propietario del TPM puede almacenarse como un atributo del objeto del equipo en los AD DS. El atributo tiene el nombre común (CN) de ms-TPM-OwnerInformation.

Nota  

El valor de autorización del propietario del TPM se almacena en AD DS, y está presente en un archivo de contraseña de propietario del TPM como un hash SHA-1 de la contraseña de propietario del TPM, que está codificado en Base64. No se almacena la contraseña de propietario real.

 

Los controladores de dominio que ejecutan Windows Server 2012 R2 o Windows Server 2012 incluyen los objetos de esquema de AD DS necesarios de manera predeterminada. Sin embargo, si el controlador de dominio ejecuta Windows Server 2008 R2, debes actualizar el esquema, como se describe en Extensiones de esquema de AD DS para admitir la copia de seguridad de TPM.

Este tema contiene procedimientos, algunos de las cuales dependen de scripts de Visual Basic para recuperar información de TPM y retirarlo en equipos remotos. Los scripts de muestra están disponibles, que puedes personalizar para cumplir los requisitos de tu entorno.

En este tema:

  1. Comprobar el estado de los requisitos previos

  2. Establecer permisos para hacer copia de seguridad de la información de la contraseña

  3. Configurar la Directiva de grupo para hacer copia de seguridad de la información de recuperación del TPM en AD DS.

  4. Usar AD DS para recuperar información del TPM

  5. Scripts de muestra

Comprobar el estado de los requisitos previos

Antes de comenzar la copia de seguridad, asegúrate de que se cumplen los siguientes requisitos previos:

  1. Todos los controladores de dominio que son accesibles para los equipos cliente que van a usar los servicios del TPM ejecutan Windows Server 2012 R2, Windows Server 2012 o Windows Server 2008 R2 con el esquema actualizado.

    Sugerencia  

    Para obtener más información acerca de las extensiones de esquema necesarias para una copia de seguridad del TPM en dominios de Active Directory que ejecutan Windows Server 2008 R2, consulta el tema Extensiones de esquema de AD DS para admitir la copia de seguridad del TPM.

     

  2. Tienes derechos de administrador de dominio en el bosque de destino, o estás usando una cuenta que ha recibido permisos adecuados para extender el esquema para el bosque de destino. Los miembros de los grupos Administradores de empresas y Administradores de esquema son ejemplos de cuentas que tienen los permisos adecuados.

Establecer permisos para hacer copia de seguridad de la información de la contraseña

Este procedimiento usa el script de ejemplo Add-TPMSelfWriteACE.vbs para agregar una entrada de control de acceso (ACE) para que sea posible hacer una copia de seguridad de la información de recuperación del TPM. Un equipo cliente no puede hacer una copia de seguridad de la información del propietario del TPM hasta que se agregue esta ACE.

Este script se ejecuta en el controlador de dominio que se usará para administrar la información de recuperación del TPM y que funciona según los siguientes supuestos:

  • Tienes credenciales de administrador de dominio para establecer permisos para el objeto de dominio de nivel superior.

  • Tu dominio de destino es el mismo que el del dominio de la cuenta de usuario que ejecuta el script. Por ejemplo, al ejecutar el script como TESTDOMAIN\admin se extienden los permisos para TESTDOMAIN.

    Nota  

    Es posible que debas modificar el script de ejemplo si deseas establecer permisos para varios dominios, pero no tienes cuentas de administrador de dominio para cada uno de ellos. Encuentra la variable strPathToDomain en el script y modifícala para tu dominio de destino, por ejemplo:

    LDAP://DC=testdomain,DC=nttest,DC=microsoft,DC=com

     

  • Tu dominio está configurado para que los permisos se hereden del objeto de dominio de nivel superior a los objetos del equipo de destino.

    Los permisos no serán eficaces si algún contenedor en la jerarquía no permite los permisos heredados. De forma predeterminada, la herencia de permisos está establecida en los AD DS. Si no estás seguro de si la configuración es diferente de este valor predeterminado, puedes continuar con los pasos de configuración para establecer los permisos. Puedes comprobar la configuración tal como se describe más adelante en este tema. O puedes hacer clic en el botón Permisos eficaces mientras ves las propiedades de un objeto de equipo y, a continuación, comprueba que Self está aprobado para escribir el atributo msTPM-OwnerInformation.

Mt431876.wedge(es-es,VS.85).gifPara agregar una ACE que permita realizar una copia de seguridad de información de recuperación del TPM

  1. Abre el script de ejemplo Add-TPMSelfWriteACE.vbs.

    El script contiene una extensión de permiso y debes modificar el valor de strPathToDomain mediante su nombre de dominio.

  2. Guarda los cambios del script.

  3. Escribe lo siguiente en el símbolo del sistema y, a continuación, presiona ENTRAR:

    cscript Add-TPMSelfWriteACE.vbs

Este script agrega una única entrada ACE al objeto de dominio de nivel superior. La ACE es un permiso heredable que permite que el equipo (SELF) escriba en el atributo ms-TPM-OwnerInformation para objetos de equipo del dominio.

Completa el siguiente procedimiento para comprobar que se establecen los permisos correctos y para quitar las ACE del TPM y de BitLocker del dominio de nivel superior, si es necesario.

Mt431876.wedge(es-es,VS.85).gifAdministrar ACE configuradas en objetos de esquema del TPM

  1. Abre el script de ejemplo List-ACEs.vbs.

  2. Modifica List-ACEs.vbs.

    Debes modificar:

    • Valor de strPathToDomain: usa tu nombre de dominio.

    • Opciones de filtro: el script establece un filtro para dirigirse a objetos de esquema de BitLocker y del TPM, por lo que debes modificar If IsFilterActive () si deseas mostrar o quitar otros objetos de esquema.

  3. Guarda los cambios del script.

  4. Escribe lo siguiente en el símbolo del sistema y, a continuación, presiona ENTRAR:

    cscript List-ACEs.vbs

    Con este script, de forma opcional puedes quitar ACE de objetos de esquema de BitLocker y del TPM en el dominio de nivel superior.

Configurar la Directiva de grupo para hacer copia de seguridad de la información de recuperación del TPM en AD DS.

Usa estos procedimientos para establecer la configuración de directiva Configuración de directiva de grupos del TPM en un equipo local. En un entorno de producción, una forma eficaz de hacerlo es crear o editar un Objeto de directiva de grupo (GPO) que tengan como objetivo los equipos cliente del dominio.

Mt431876.wedge(es-es,VS.85).gifPara habilitar la configuración de directiva local para hacer la copia de seguridad de la información de recuperación del TPM a AD DS

  1. Inicia sesión en un equipo unido a un dominio mediante una cuenta de dominio que sea miembro del grupo de Administradores locales.

  2. Abre el Editor de directivas de grupo local (gpedit.msc) y en el árbol de consola, vete a Configuración del equipo\Plantillas administrativas\Sistema.

  3. Haz clic en Servicios del Módulo de plataforma segura.

  4. Haz doble clic en Activar copia de seguridad del TPM en los Servicios de dominio de Active Directory.

  5. Haz clic en Habilitada y, después, en Aceptar.

Importante  

Cuando se habilita esta configuración, no se puede establecer ni cambiar la contraseña del propietario del TPM a menos que el equipo esté conectado al dominio y se realice correctamente la copia de seguridad de AD DS de la información de recuperación del TPM.

 

Usar AD DS para recuperar información del TPM

Cuando necesites recuperar la información de propietario del TPM de AD DS y usarla para administrar el TPM, debes leer el objeto ms-TPM-OwnerInformation desde AD DS y, a continuación, crear manualmente un archivo de copia de seguridad de contraseña de propietario del TPM que puede suministrarse cuando se necesiten las credenciales del propietario del TPM.

Mt431876.wedge(es-es,VS.85).gifPara obtener la información de la copia de seguridad del propietario del TPM desde AD DS y crear un archivo de contraseña

  1. Inicia sesión en un controlador de dominio con credenciales de administrador de dominio.

  2. Copia el archivo de script de ejemplo, Get TPMOwnerInfo.vbs, en una ubicación de tu equipo.

  3. Abre una ventana del símbolo del sistema y cambia la ubicación predeterminada a la ubicación de los archivos de script de ejemplo que guardaste en el paso anterior.

  4. En el símbolo del sistema, escribe cscript Get-TPMOwnerInfo.vbs.

    El resultado esperado es una cadena que es el hash de la contraseña que creaste anteriormente.

    Nota  

    Si recibes el mensaje de error "Active Directory: La propiedad de directorio no se encuentra en caché", comprueba que estás usando una cuenta de administrador de dominio, necesaria para leer el atributo ms-TPM-OwnerInformation.

    La única excepción a este requisito es que si los usuarios son el Creador propietario de los objetos del equipo que unen al dominio, posiblemente podrán leer la información del propietario del TPM para los objetos del equipo.

     

  5. Abre el Bloc de notas u otro editor de texto y copia el siguiente ejemplo de código en el archivo y reemplaza TpmOwnerPasswordHash por la cadena que registraste en el paso anterior.

    <?xml version="1.0" encoding="UTF-8"?>
    <!--
    This page is a backup of Trusted Platform Module (TPM) owner
    authorization information. Upon request, use the authorization information to
    prove ownership of the computer's TPM.
    
    
    IMPORTANT: Please keep this file in a secure location away from your computer's
    local hard drive.
    -->
    <tpmOwnerData version="1.0" softwareAuthor="Microsoft Windows [Version 6.1.7600]" creationDate="2009-11-11T14:39:29-08:00" creationUser="DOMAIN\username" machineName="mymachine">
                    <tpmInfo manufacturerId="1096043852"/>
                    <ownerAuth>TpmOwnerPasswordHash</ownerAuth>
    </tpmOwnerData>
    
  6. Guarda este archivo con extensión .tpm en un dispositivo de almacenamiento extraíble, como por ejemplo una unidad flash USB. Cuando accedas al TPM y tengas que proporcionar la contraseña de propietario del TPM, elige la opción para leer la contraseña de un archivo y proporciona la ruta de acceso a este archivo.

Scripts de muestra

Puedes usar la totalidad o parte de los siguientes scripts de muestra, que se usan en los procedimientos anteriores, para configurar AD DS para realizar copias de seguridad de información de recuperación del TPM. La personalización es necesaria dependiendo de la configuración de tu entorno.

  • Add-TPMSelfWriteACE.vbs: úsalo para agregar la entrada de control de acceso (ACE) para el TPM a AD DS

  • List-ACEs.vbs: úsalo para enumerar o quitar las ACE configuradas en objetos de esquema de BitLocker y del TPM.

  • Get-TPMOwnerInfo.vbs: úsalo para recuperar la información de recuperación del TPM de AD DS para un equipo en particular

Add-TPMSelfWriteACE.vbs

Este script agrega la entrada de control de acceso (ACE) para el TPM a AD DS para que el equipo pueda hacer una copia de seguridad de la información de recuperación del TPM en AD DS.

'===============================================================================
'
' This script demonstrates the addition of an Access Control Entry (ACE)
' to allow computers to write Trusted Platform Module (TPM) 
' recovery information to Active Directory.
'
' This script creates a SELF ACE on the top-level domain object, and
' assumes that inheritance of ACL's from the top-level domain object to 
' down-level computer objects are enabled.
'
' 
'
' Last Updated: 12/05/2012
' Last Reviewed: 12/05/2012
' Microsoft Corporation
'
' Disclaimer
' 
' The sample scripts are not supported under any Microsoft standard support program
' or service. The sample scripts are provided AS IS without warranty of any kind. 
' Microsoft further disclaims all implied warranties including, without limitation, 
' any implied warranties of merchantability or of fitness for a particular purpose. 
' The entire risk arising out of the use or performance of the sample scripts and 
' documentation remains with you. In no event shall Microsoft, its authors, or 
' anyone else involved in the creation, production, or delivery of the scripts be 
' liable for any damages whatsoever (including, without limitation, damages for loss 
' of business profits, business interruption, loss of business information, or 
' other pecuniary loss) arising out of the use of or inability to use the sample 
' scripts or documentation, even if Microsoft has been advised of the possibility 
' of such damages.
'
' Version 1.0.2 - Tested and re-released for Windows 8 and Windows Server 2012 

' 
'===============================================================================

' --------------------------------------------------------------------------------
' Access Control Entry (ACE) constants 
' --------------------------------------------------------------------------------

'- From the ADS_ACETYPE_ENUM enumeration
Const ADS_ACETYPE_ACCESS_ALLOWED_OBJECT      = &H5   'Allows an object to do something

'- From the ADS_ACEFLAG_ENUM enumeration
Const ADS_ACEFLAG_INHERIT_ACE                = &H2   'ACE can be inherited to child objects
Const ADS_ACEFLAG_INHERIT_ONLY_ACE           = &H8   'ACE does NOT apply to target (parent) object

'- From the ADS_RIGHTS_ENUM enumeration
Const ADS_RIGHT_DS_WRITE_PROP                = &H20  'The right to write object properties
Const ADS_RIGHT_DS_CREATE_CHILD              = &H1   'The right to create child objects

'- From the ADS_FLAGTYPE_ENUM enumeration
Const ADS_FLAG_OBJECT_TYPE_PRESENT           = &H1   'Target object type is present in the ACE 
Const ADS_FLAG_INHERITED_OBJECT_TYPE_PRESENT = &H2   'Target inherited object type is present in the ACE 

' --------------------------------------------------------------------------------
' TPM and FVE schema object GUID's 
' --------------------------------------------------------------------------------

'- ms-TPM-OwnerInformation attribute
SCHEMA_GUID_MS_TPM_OWNERINFORMATION = "{AA4E1A6D-550D-4E05-8C35-4AFCB917A9FE}"

'- ms-FVE-RecoveryInformation object
SCHEMA_GUID_MS_FVE_RECOVERYINFORMATION = "{EA715D30-8F53-40D0-BD1E-6109186D782C}"

'- Computer object
SCHEMA_GUID_COMPUTER = "{BF967A86-0DE6-11D0-A285-00AA003049E2}"

'Reference: "Platform SDK: Active Directory Schema"




' --------------------------------------------------------------------------------
' Set up the ACE to allow write of TPM owner information
' --------------------------------------------------------------------------------

Set objAce1 = createObject("AccessControlEntry")

objAce1.AceFlags = ADS_ACEFLAG_INHERIT_ACE + ADS_ACEFLAG_INHERIT_ONLY_ACE
objAce1.AceType = ADS_ACETYPE_ACCESS_ALLOWED_OBJECT
objAce1.Flags = ADS_FLAG_OBJECT_TYPE_PRESENT + ADS_FLAG_INHERITED_OBJECT_TYPE_PRESENT

objAce1.Trustee = "SELF"
objAce1.AccessMask = ADS_RIGHT_DS_WRITE_PROP 
objAce1.ObjectType = SCHEMA_GUID_MS_TPM_OWNERINFORMATION
objAce1.InheritedObjectType = SCHEMA_GUID_COMPUTER



' --------------------------------------------------------------------------------
' NOTE: BY default, the "SELF" computer account can create 
' BitLocker recovery information objects and write BitLocker recovery properties
'
' No additional ACE's are needed.
' --------------------------------------------------------------------------------


' --------------------------------------------------------------------------------
' Connect to Discretional ACL (DACL) for domain object
' --------------------------------------------------------------------------------

Set objRootLDAP = GetObject("LDAP://rootDSE")
strPathToDomain = "LDAP://" & objRootLDAP.Get("defaultNamingContext") ' e.g. string dc=fabrikam,dc=com

Set objDomain = GetObject(strPathToDomain)

WScript.Echo "Accessing object: " + objDomain.Get("distinguishedName")

Set objDescriptor = objDomain.Get("ntSecurityDescriptor")
Set objDacl = objDescriptor.DiscretionaryAcl

 
' --------------------------------------------------------------------------------
' Add the ACEs to the Discretionary ACL (DACL) and set the DACL
' --------------------------------------------------------------------------------

objDacl.AddAce objAce1

objDescriptor.DiscretionaryAcl = objDacl
objDomain.Put "ntSecurityDescriptor", Array(objDescriptor)
objDomain.SetInfo

WScript.Echo "SUCCESS!"

List-ACEs.vbs

Este script enumera o quita las ACE que se configuran en objetos de esquema de BitLocker y del TPM para el dominio de nivel superior. Esto te permite comprobar que se han agregado correctamente las ACE esperadas o quitar cualquier ACE que esté relacionada con BitLocker o el TPM, si es necesario.

'===============================================================================
'
' This script lists the access control entries (ACE's) configured on 
' Trusted Platform Module (TPM) and BitLocker Drive Encryption (BDE) schema objects 
' for the top-level domain.
'
' You can use this script to check that the correct permissions have been set and
' to remove TPM and BitLocker ACE's from the top-level domain.
'
' 
' Last Updated: 12/05/2012
' Last Reviewed: 12/02/2012
'
' Microsoft Corporation
'
' Disclaimer
' 
' The sample scripts are not supported under any Microsoft standard support program
' or service. The sample scripts are provided AS IS without warranty of any kind. 
' Microsoft further disclaims all implied warranties including, without limitation, 
' any implied warranties of merchantability or of fitness for a particular purpose. 
' The entire risk arising out of the use or performance of the sample scripts and 
' documentation remains with you. In no event shall Microsoft, its authors, or 
' anyone else involved in the creation, production, or delivery of the scripts be 
' liable for any damages whatsoever (including, without limitation, damages for loss 
' of business profits, business interruption, loss of business information, or 
' other pecuniary loss) arising out of the use of or inability to use the sample 
' scripts or documentation, even if Microsoft has been advised of the possibility 
' of such damages.
'
' Version 1.0.2 - Tested and re-released for Windows 8 and Windows Server 2012
' 
'===============================================================================

' --------------------------------------------------------------------------------
' Usage
' --------------------------------------------------------------------------------

Sub ShowUsage
   Wscript.Echo "USAGE: List-ACEs"
   Wscript.Echo "List access permissions for BitLocker and TPM schema objects"
   Wscript.Echo ""
   Wscript.Echo "USAGE: List-ACEs -remove"
   Wscript.Echo "Removes access permissions for BitLocker and TPM schema objects"
   WScript.Quit
End Sub


' --------------------------------------------------------------------------------
' Parse Arguments
' --------------------------------------------------------------------------------

Set args = WScript.Arguments

Select Case args.Count
  
  Case 0
      ' do nothing - checks for ACE's 
      removeACE = False
      
  Case 1
    If args(0) = "/?" Or args(0) = "-?" Then
      ShowUsage
    Else 
      If UCase(args(0)) = "-REMOVE" Then
            removeACE = True
      End If
    End If

  Case Else
    ShowUsage

End Select

' --------------------------------------------------------------------------------
' Configuration of the filter to show/remove only ACE's for BDE and TPM objects
' --------------------------------------------------------------------------------

'- ms-TPM-OwnerInformation attribute
SCHEMA_GUID_MS_TPM_OWNERINFORMATION = "{AA4E1A6D-550D-4E05-8C35-4AFCB917A9FE}"

'- ms-FVE-RecoveryInformation object
SCHEMA_GUID_MS_FVE_RECOVERYINFORMATION = "{EA715D30-8F53-40D0-BD1E-6109186D782C}"

' Use this filter to list/remove only ACEs related to TPM and BitLocker

aceGuidFilter = Array(SCHEMA_GUID_MS_TPM_OWNERINFORMATION, _
                      SCHEMA_GUID_MS_FVE_RECOVERYINFORMATION)


' Note to script source reader:
' Uncomment the following line to turn off the filter and list all ACEs
'aceGuidFilter = Array()


' --------------------------------------------------------------------------------
' Helper functions related to the list filter for listing or removing ACE's
' --------------------------------------------------------------------------------

Function IsFilterActive()

    If Join(aceGuidFilter) = "" Then
       IsFilterActive = False
    Else 
       IsFilterActive = True
    End If

End Function


Function isAceWithinFilter(ace) 

    aceWithinFilter = False  ' assume first not pass the filter

    For Each guid In aceGuidFilter 

        If ace.ObjectType = guid Or ace.InheritedObjectType = guid Then
           isAceWithinFilter = True           
        End If
    Next

End Function

Sub displayFilter
    For Each guid In aceGuidFilter
       WScript.echo guid
    Next
End Sub


' --------------------------------------------------------------------------------
' Connect to Discretional ACL (DACL) for domain object
' --------------------------------------------------------------------------------

Set objRootLDAP = GetObject("LDAP://rootDSE")
strPathToDomain = "LDAP://" & objRootLDAP.Get("defaultNamingContext") ' e.g. dc=fabrikam,dc=com

Set domain = GetObject(strPathToDomain)

WScript.Echo "Accessing object: " + domain.Get("distinguishedName")
WScript.Echo ""

Set descriptor = domain.Get("ntSecurityDescriptor")
Set dacl = descriptor.DiscretionaryAcl


' --------------------------------------------------------------------------------
' Show Access Control Entries (ACE's)
' --------------------------------------------------------------------------------

' Loop through the existing ACEs, including all ACEs if the filter is not active

i = 1 ' global index
c = 0 ' found count - relevant if filter is active

For Each ace In dacl

 If IsFilterActive() = False or isAceWithinFilter(ace) = True Then

    ' note to script source reader:
    ' echo i to show the index of the ACE
    
    WScript.echo ">            AceFlags: " & ace.AceFlags
    WScript.echo ">             AceType: " & ace.AceType
    WScript.echo ">               Flags: " & ace.Flags
    WScript.echo ">          AccessMask: " & ace.AccessMask
    WScript.echo ">          ObjectType: " & ace.ObjectType
    WScript.echo "> InheritedObjectType: " & ace.InheritedObjectType
    WScript.echo ">             Trustee: " & ace.Trustee
    WScript.echo ""


    if IsFilterActive() = True Then
      c = c + 1

      ' optionally include this ACE in removal list if configured
      ' note that the filter being active is a requirement since we don't
      ' want to accidentally remove all ACEs

      If removeACE = True Then
        dacl.RemoveAce ace  
      End If

    end if

  End If 

  i = i + 1

Next


' Display number of ACEs found

If IsFilterActive() = True Then

  WScript.echo c & " ACE(s) found in " & domain.Get("distinguishedName") _
                 & " related to BitLocker and TPM" 'note to script source reader: change this line if you configure your own 

filter

  ' note to script source reader: 
  ' uncomment the following lines if you configure your own filter
  'WScript.echo ""
  'WScript.echo "The following filter was active: "
  'displayFilter
  'Wscript.echo ""

Else

  i = i - 1
  WScript.echo i & " total ACE(s) found in " & domain.Get("distinguishedName")
  
End If


' --------------------------------------------------------------------------------
' Optionally remove ACE's on a filtered list
' --------------------------------------------------------------------------------

if removeACE = True and IsFilterActive() = True then

  descriptor.DiscretionaryAcl =  dacl
  domain.Put "ntSecurityDescriptor", Array(descriptor)
  domain.setInfo

  WScript.echo c & " ACE(s) removed from " & domain.Get("distinguishedName")

else 

  if removeACE = True then

    WScript.echo "You must specify a filter to remove ACEs from " & domain.Get("distinguishedName") 
 
 end if


end if

Get-TPMOwnerInfo.vbs

Este script recupera la información de recuperación del TPM de AD DS para un equipo en particular para que puedas comprobar que solo los administradores de dominio (o funciones delegadas) pueden leer copias de seguridad de información de recuperación del TPM y que la información se está copiando correctamente.

'=================================================================================
'
' This script demonstrates the retrieval of Trusted Platform Module (TPM) 
' recovery information from Active Directory for a particular computer.
'
' It returns the TPM owner information stored as an attribute of a 
' computer object.
'
' Last Updated: 12/05/2012
' Last Reviewed: 12/05/2012
'
' Microsoft Corporation
'
' Disclaimer
' 
' The sample scripts are not supported under any Microsoft standard support program
' or service. The sample scripts are provided AS IS without warranty of any kind. 
' Microsoft further disclaims all implied warranties including, without limitation, 
' any implied warranties of merchantability or of fitness for a particular purpose. 
' The entire risk arising out of the use or performance of the sample scripts and 
' documentation remains with you. In no event shall Microsoft, its authors, or 
' anyone else involved in the creation, production, or delivery of the scripts be 
' liable for any damages whatsoever (including, without limitation, damages for loss 
' of business profits, business interruption, loss of business information, or 
' other pecuniary loss) arising out of the use of or inability to use the sample 
' scripts or documentation, even if Microsoft has been advised of the possibility 
' of such damages.
'
' Version 1.0 - Initial release
' Version 1.1 - Updated GetStrPathToComputer to search the global catalog.
' Version 1.1.2 - Tested and re-released for Windows 8 and Windows Server 2012
' 
'=================================================================================


' --------------------------------------------------------------------------------
' Usage
' --------------------------------------------------------------------------------

Sub ShowUsage
   Wscript.Echo "USAGE: Get-TpmOwnerInfo [Optional Computer Name]"
   Wscript.Echo "If no computer name is specified, the local computer is assumed."
   WScript.Quit
End Sub

' --------------------------------------------------------------------------------
' Parse Arguments
' --------------------------------------------------------------------------------

Set args = WScript.Arguments

Select Case args.Count
  
  Case 0
      ' Get the name of the local computer      
      Set objNetwork = CreateObject("WScript.Network")
      strComputerName = objNetwork.ComputerName
    
  Case 1
    If args(0) = "/?" Or args(0) = "-?" Then
      ShowUsage
    Else
      strComputerName = args(0)
    End If
  
  Case Else
    ShowUsage

End Select


' --------------------------------------------------------------------------------
' Get path to Active Directory computer object associated with the computer name
' --------------------------------------------------------------------------------

Function GetStrPathToComputer(strComputerName) 

    ' Uses the global catalog to find the computer in the forest
    ' Search also includes deleted computers in the tombstone

    Set objRootLDAP = GetObject("LDAP://rootDSE")
    namingContext = objRootLDAP.Get("defaultNamingContext") ' e.g. string dc=fabrikam,dc=com    

    strBase = "<GC://" & namingContext & ">"
 
    Set objConnection = CreateObject("ADODB.Connection") 
    Set objCommand = CreateObject("ADODB.Command") 
    objConnection.Provider = "ADsDSOOBject" 
    objConnection.Open "Active Directory Provider" 
    Set objCommand.ActiveConnection = objConnection 

    strFilter = "(&(objectCategory=Computer)(cn=" &  strComputerName & "))"
    strQuery = strBase & ";" & strFilter  & ";distinguishedName;subtree" 

    objCommand.CommandText = strQuery 
    objCommand.Properties("Page Size") = 100 
    objCommand.Properties("Timeout") = 100
    objCommand.Properties("Cache Results") = False 

    ' Enumerate all objects found. 

    Set objRecordSet = objCommand.Execute 
    If objRecordSet.EOF Then
      WScript.echo "The computer name '" &  strComputerName & "' cannot be found."
      WScript.Quit 1
    End If

    ' Found object matching name

    Do Until objRecordSet.EOF 
      dnFound = objRecordSet.Fields("distinguishedName")
      GetStrPathToComputer = "LDAP://" & dnFound
      objRecordSet.MoveNext 
    Loop 


    ' Clean up. 
    Set objConnection = Nothing 
    Set objCommand = Nothing 
    Set objRecordSet = Nothing 

End Function

' --------------------------------------------------------------------------------
' Securely access the Active Directory computer object using Kerberos
' --------------------------------------------------------------------------------

Set objDSO = GetObject("LDAP:")
strPath = GetStrPathToComputer(strComputerName)


WScript.Echo "Accessing object: " + strPath

Const ADS_SECURE_AUTHENTICATION = 1
Const ADS_USE_SEALING = 64 '0x40
Const ADS_USE_SIGNING = 128 '0x80

Set objComputer = objDSO.OpenDSObject(strPath, vbNullString, vbNullString, _
                                   ADS_SECURE_AUTHENTICATION + ADS_USE_SEALING + ADS_USE_SIGNING)

' --------------------------------------------------------------------------------
' Get the TPM owner information from the Active Directory computer object
' --------------------------------------------------------------------------------

strOwnerInformation = objComputer.Get("msTPM-OwnerInformation")
WScript.echo "msTPM-OwnerInformation: " + strOwnerInformation

Recursos adicionales

Información general sobre la tecnología del módulo de plataforma segura

Conceptos básicos del TPM

Configuración de directivas de grupo del TPM

Cmdlets del TPM en Windows PowerShell

Extensiones de esquema de AD DS para admitir la copia de seguridad del TPM

Prepara tu organización para BitLocker: planificación y directivas, consulta las consideraciones de TPM