13

Con el fin de instalar una nueva página de propiedades en el Active Directory SnapIn, tengo que escribir a la siguiente clave del registro de W2K8 R2 (as documented by Microsoft)Cómo escribir en una clave de registro propio por TrustedInstaller

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ MMC \ SnapIns {E355E538-1C2E-11D0-8C37-00C04FD8FE93} \ NodeTypes

Esta clave es la propia por un usuario especial llamado TrustedInstaller. Encontré muchas cosas en NET por ahí.

Por el momento aquí es la forma en que funciona haciendo lo siguiente (el usuario es miembro del grupo de administradores):

  1. Doy al usuario el privilegio de tomar posesión.
  2. El usuario tomar posesión
  3. El usuario escribir el registro
  4. el usuario otorga la propiedad al grupo de administradores.

Mi proyecto está completo escrito en C# y hay dos cosas que no me gustan en la forma en que lo estoy haciendo.

  • Uso InteropServices para llamar a Win32 AdjustTokenPrivileges API. ¿Alguien sabe una manera de hacerlo en C# puro?
  • Al final TrustedInstaller ya no es el propietario de la clave, y no puedo darle la propiedad, él mantiene el control total, pero no quiero que mi servidor se clasifique como dañado después de la instalación de mi complemento -en.

Así que mi pregunta es: ¿Extraño algo, hay una forma documentada de modificar esa clave que está documentada como modificable?

Existe un Stack overflow question existente sobre eso, la respuesta dice que la propiedad TrustedInstaller, significa que la clave es parte de la instalación del sistema y no de la instalación de la aplicación. Para mí, si Microsoft documenta cómo modificar una clave, es la instalación de la aplicación.

Gracias de antemano.

Respuesta

5

Así que encontré uno de mis problemas.

Cuando desee apropiarse de un recurso que agregue para habilitar el SeTakeOwnershipPrivilege, esto le permite cambiar el SID del propietario. Pero el nuevo propietario Sid debe estar en el token de la persona que llama, además, Sid debe tener el atributo SE_GROUP_OWNER. En mi caso, no pude cambiar el propietario de SID a S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464 (TrustedInstaller). Solo pude apropiarme o darle propiedad al grupo "Administradores". Descubrí que hay un rey del trabajo temporal por el que puede asignar cualquier usuario arbitrario como el propietario, incluso si su SID no está en el token. SeRestorePrivilege privilegio que es concedido a los administradores y operadores de copia de seguridad, pero NO habilitado de forma predeterminada. Al permitirlo, puedo devolver la propiedad a TrustedInstaller.

por lo que funciona haciendo lo siguiente (el usuario es miembro del grupo de administradores):

  1. Doy al usuario el privilegio de tomar posesión y permiten el privilegio de restaurar
  2. El usuario tomar posesión
  3. El usuario escribe el registro
  4. el usuario cede la propiedad al anterior propietario TrustedInstaller.

utilizo InteropServices llamar a la API de Win32 AdjustTokenPrivileges, y parece ser la única manera de hacerlo en C#

pronto voy a publicar en mi blog una pequeña herramienta que permite devolver la propiedad a TrustedInstaller .


Editado: Siento el retraso me olvido, puede encontrar el código en Gist.

+0

+1, SeRestorePrivilege es una joya. – ongle

+0

¿Hay alguna posibilidad de que tengas una publicación de blog o código de muestra? He estado tratando de hacer que esto funcione durante horas. – Laoujin

+1

@Laoujin Finalmente coloqué el código en Gist, espero que ayude. – JPBlanc

3

Si usa Registry table en un instalador MSI, debería poder escribir la entrada sin problemas. Esto se debe a que el proceso de instalación se realiza bajo la cuenta TrustedInstaller (no es necesario cambiar la propiedad).

Editar: Parece que está intentando escribir en una clave de registro que está bajo el sistema de protección de Windows. La cuenta de TrustedInstaller no importa en este caso.

Básicamente, un MSI normal no puede escribir en esa clave porque está protegido por Windows. Deberá buscar otro enfoque para instalar la página de propiedades.

+0

Intento hacerlo usando la entrada de registro de una MSI generada por un "proyecto de instalación de implementación" en Visual Studio 10. Volveré a intentar, pero en mi primera prueba no estaba funcionando. ¿Debo especificar algo especial en la mesa con Orca? – JPBlanc

+0

Así que lo probé de nuevo. aquí está la tabla de registro de mi MSI '_2D2C089689924663A0BDAAE6CFE4E160 2 Software \ Microsoft \ MMC \ SnapIns \ {E355E538-1C2E-11D0-8C37-00C04FD8FE93} \ NodeTypes \ {3bcd9db8-f84b-451C-952f-6c52b81f9ec6} * C__2D2C089689924663A0BDAAE6CFE4E160' ¿Estás seguro de su afirmación? – JPBlanc

+0

¿Qué sucede durante la instalación? ¿Creó un registro para ver cómo se maneja la entrada de registro? –

3

Si ejecuta programa como administrador (no se olvide de activar 'requireAdministrator' como el nivel de ejecución en el manifiesto UAC) o cualquier otro usuario que tiene privilegios SE_RESTORE_NAME que pueda enable the privilage y luego usar RegCreateKeyEx con REG_OPTION_BACKUP_RESTORE bandera. Puede usar el mismo marcador en RegOpenKeyEx (vea el parámetro ulOptions), pero no está documentado y le recomendaría mejor usar RegCreateKeyEx en su lugar.El identificador de clave devuelto se puede usar para establecer el valor con respecto a RegSetValueEx, por ejemplo. En el camino, podrá establecer cualquier clave de registro. Si además habilita el privilegio SE_BACKUP_NAME, podrá leer cualquier clave de registro (por ejemplo, desde HKEY_LOCAL_MACHINE\SECURITY o HKEY_LOCAL_MACHINE\SAM\SAM).

Cuestiones relacionadas