2010-04-14 14 views
6

A mis usuarios les gusta cargar documentos Word protegidos con contraseña en nuestro sistema de gestión de documentos personalizado. Me gustaría agregar una validación para verificar la contraseña y rechazar la carga si tiene una contraseña.En ASP.NET, ¿cómo detecto una contraseña en un archivo de Word 2003 o 2007?

Automatizar Word - con interoperabilidad COM - está fuera de cuestión porque esta es una aplicación del lado del servidor.

Respuesta

5

Desafortunadamente no está disponible directamente desde .NET o DSOFile.dll, pero podría crear un contenedor en .NET para leer la propiedad PIDSI_DOC_SECURITY de cualquier archivo de Office para averiguar si está protegido con contraseña o no sin abrir el documento. Hay un número de C++ samples por ahí que podría ser portado con una definición de iPropertyStorage.

Un ejemplo envuelto está en TechTarget, pero el contenedor parece no estar disponible.

0

¿Está diciendo que le gustaría abrir/examinar documentos de Word sin utilizar ninguna interoperabilidad de Office en absoluto? ¡Buena suerte!

Posiblemente su único lugar para comenzar sea analizar manualmente el docx usted mismo (la especificación se publica here). Sin embargo, realmente le sugiero que muerda la bala y use las bibliotecas de interoperabilidad de Office, porque es un requisito mucho más ligero que el análisis del documento usted mismo. No hay nada que intrínsecamente impida que lo haga en una aplicación de servidor.

+1

re: prevención ... Bueno, existen restricciones de licencia en las aplicaciones de Office y no siempre es fácil convencer a un administrador de servidor de instalar MS Office en un servidor, especialmente cuando la interoperabilidad de MS-Office que se ejecuta en ASP.NET a menudo conduce a cientos de procesos exel.exe y word.exe en el servidor. – MatthewMartin

+0

Eso es solo otro problema para resolver, no un bloqueador completo. Si tiene suficientes necesidades comerciales, sus administradores tendrán que ceder a eso (y debe lidiar con las ramificaciones); si no, entonces necesitas encontrar una solución diferente. –

+0

um. ¡no! La ejecución de Office en el servidor es una configuración no compatible y algo mejor para los administradores de hackers dudosos. Si estás tratando de resolver ese problema, estás resolviendo el problema equivocado. –

5

Creo que va a depender de la versión de Microsoft Word. Las versiones anteriores de Word (antes de 2007) requerirán alguna interoperación COM, ya que no se guardan en un formato abierto. No hay nada que pueda hacer para evitar eso, y siento sus frustraciones con la instalación de cualquier cosa de Office en un servidor web. Además, creo que la única forma de detectar la protección con contraseña en estos casos es intentar abrir/desproteger el archivo y detectar una cierta excepción (es posible que tenga que evaluar más a fondo un código de error dentro de la excepción). ¡No es bonito!

Sin embargo, hay nuevas versiones de la palabra (2007+) guardados en el formato DOCX abierta (Standard ECMA-376), se puede examinar el XML y comprobar la existencia del elemento DocumentProtection con el atributo w:enforcement define como "on" ..

<w:DocumentProtection 
    w:edit="read-only" 
    w:enforcement="on" 
    w:unprotectPassword="1FC6CBEB"/> 

Nota: La contraseña que se muestra aquí está encriptada (obviamente); Guardé este documento en particular con una contraseña de "prueba".

+0

¡Ojalá pudiera dividir la recompensa! (Revisé las preguntas frecuentes para ver si podía). Esta es la mitad de la respuesta. Otaku tenía la otra mitad, ¡gracias! – MatthewMartin

+0

@Matthew No estoy aquí para obtener puntos; ¡Me alegro de escuchar que encontraste una solución! –

Cuestiones relacionadas