Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - Eleкtro

#542
Elektro RadErrorDialog




Descripción:

Esto es simplemente un RadForm que diseñé para manejar excepciones cara al end-user, lo pueden añadir a sus proyectos como una plantilla de Item.

Dependencias: Telerik RAD Controls

Si quieren una versión sin dependencias de terceros, es decir, usando los controles de .NET framework, entonces visiten: [SOURCE] Elektro ErrorDialog Autor: EleKtro




Imágenes:

     

   




Ejemplos de uso:

(Ejemplo de uso básico)
Código (VBNET) [Seleccionar]
    Private Shadows Sub Shown(sender As Object, e As EventArgs) _
    Handles MyBase.Shown

        Try
            Dim Url As New Uri(String.Empty)

        Catch ex As Exception

            Using ErrorDialog As New RadErrorDialog(ex, sender)
                ErrorDialog.ShowDialog()
            End Using

        End Try

    End Sub


(Ejemplo de uso avanzado)
Código (VBNET) [Seleccionar]
Public Class Form1

    Public Sub New()

        ' This call is required by the designer.
        InitializeComponent()

        ' Catches Managed Exceptions.
        AddHandler AppDomain.CurrentDomain.FirstChanceException, AddressOf Application_ManagedException

        ' Catches Unhandled Exceptions.
        AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf Application_UnhandledException

        ' Catches Thread Exceptions.
        AddHandler Application.ThreadException, AddressOf Application_ThreadException

    End Sub

    ''' <summary>
    ''' Handles the 'UnhandledException' event of the Application.
    ''' </summary>
    ''' <param name="sender">The source of the event.</param>
    ''' <param name="e">The <see cref="UnhandledExceptionEventArgs"/> instance containing the event data.</param>
    Private Sub Application_UnhandledException(ByVal sender As Object, ByVal e As UnhandledExceptionEventArgs)

        Using ErrorDialog As New RadErrorDialog(DirectCast(e.ExceptionObject, Exception), Me)
            ErrorDialog.ShowDialog()
        End Using

    End Sub

    ''' <summary>
    ''' Handles the 'FirstChanceException' event of the Application.
    ''' </summary>
    ''' <param name="sender">The source of the event.</param>
    ''' <param name="e">The <see cref="Runtime.ExceptionServices.FirstChanceExceptionEventArgs" /> instance containing the event data.</param>
    Private Sub Application_ManagedException(ByVal sender As Object, ByVal e As Runtime.ExceptionServices.FirstChanceExceptionEventArgs)

        Using ErrorDialog As New RadErrorDialog(e.Exception, Me)
            ErrorDialog.ShowDialog()
        End Using

    End Sub

    ''' <summary>
    ''' Handles the 'ThreadException' event of the Application.
    ''' </summary>
    ''' <param name="sender">The source of the event.</param>
    ''' <param name="e">The <see cref="Threading.ThreadExceptionEventArgs"/> instance containing the event data.</param>
    Private Sub Application_ThreadException(sender As Object, e As Threading.ThreadExceptionEventArgs)

        Using ErrorDialog As New RadErrorDialog(e.Exception, Me)
            ErrorDialog.ShowDialog()
        End Using

    End Sub

End Class





Descarga:

http://www.mediafire.com/download/shg634whhdwg3ba/RadErrorDialog.rar
#543
Hola, comparto esta magnifica colección salvaje de la historia del Psy (lo he sacado de una web en la que tengo un registro de por vida).

Nota: Casi todo está hospedado en uploaded.to.

1TB+ The History Of: PsyChedelic + Progressive + Dark PsyForest Trance + Goa Trance + Ambient! 25-07-2014 UPDATED

Parte 01


Parte 02


Parte 03






Que lo disfruteis, saludos!
#544
Foro Libre / Ice Bucket Challenge, ¿Que opinas?
30 Agosto 2014, 02:41 AM
¿Que opinais del Ice Bucket Challenge?



Hola, creo que aun no se ha hablado de este tema en el foro y me gusta ser el primero :D (a pesar de que ello signifique que soy el primer gilipollas en hablar de esta basura) xD

Yo pienso que la deficiencia intelectual mundial va en aumento y cada vez se denotan más pruebas de ello, pues para empezar creo que el dato más obvio sería que no es normal intentar hacer un reto que se llama "cubo de hielo" tirándote por encima un maldito cubo de agua fria (o templada, los que hagan trampa) y sin cubitos de hielo como los de la siguiente imagen, claro está:


Muchos no estarán deacuerdo con lo que voy a decir, pero a mi me parece absurdo que para realizar una donación debas dejarte en ridículo intencionadamente, puede que esa persona no sienta ridículo pero sabe perfectamente que estará provocando el ridículo en muchas personas que vean su "show", y si quieres donar pues donas, no tienes que exhibirte y justificarte con un "reto" ni intentar captar la atención de los demás para obtener tu minuto de gloria,
así que si este "reto" se hiciera sin donación u otra finalidad entonces creo que cualquier profesional de la psicología podria determinar que esa persona es RETRASADA, ¿entonces porque pensamos que existe una diferencia y que esta persona no es retrasada por hacer el ridículo intencionado simplemente porque lo hace con un fin, sea cual sea?, apoyo a los payasos (los profesionales) porque ellos hacen comedia, pero esto son otro tipo de payasos con un problema bien gordo de moralidad.


Aparte, no se porque los retos famosos de internet siempre se tienen que convertir en una especie de exhibición PORNO, ¿que cojones le pasa a la gente del siglo XI?, ¿porque parecen estar todas las mujeres chaladas?, ¿es que acaso el agua es un afrodisiaco para ellas y todavia no lo hemos descubierto?, si no sabeis a lo que me estoy refiriendo os hago saber que hay decenas (o cientos) de videos sobre este reto de la típica mujer casi en pelotas (mujer normal, mujer modelo, mujer playboy, mujer pu... de todo) exhibiendose con el cubito de agua (las hay tapadas, en bikini, desnudas, de todo también), es bonito y sexy de ver al principio (que duda nos cabe a nosotros xD), pero cuando lo piensas bien... ¡decadencia ajena!.


De verdad deseo con todas mis fuerzas que esta moda tóxica se acabe mañana mismo y a ser posible vengan unos hombres de negro y nos borren cualquier recuerdo de nuestras mentes para no recordar tal acontecimiento catastrófico de la historia de la involución evolución humana.


Lo dicho, no le veo sentido a intentar justificar "hacer el tonto" con la finalidad de donar, si el fín de tirarte hielo es sentirse identificado con el ELA pues creo que es más absurdo si cabe, como mínimo yo me sentiria muy ofendido si yo fuese un enfermo de esta enfermedad.

( aunque él no se sintió ofendido y vió como su familia se tiraban cubos de hielo agua )

La única conclusión a la que puedo llegar con todo esto es que el ser humano, a día de hoy, se toma el acto de Donar como una especie de reto o show, y no como una motivación propia para regalar/compartir. Que pena.




PD: Todo lo que he escrito (menos mi conclusión) lo he expresado de forma seria y quizás algo provocativa pero siempre con un tono de broma, porfavor que nadie se sienta ofendido por alguna de las palabras que empleé y si así ocurriese le pido disculpas, tómese mis palabras con humor... ¡ninguna va con mala intención! :P


Voy a dejar que el youtuber Dalas exprese su opinión también (os aviso, contiene bastante excentricismo y palabras indecentes por doquier xD):

Para los subnormales del #IceBucketChallenge (no pretendo insultar, pero es el título del video)
[youtube=640,360]https://www.youtube.com/watch?v=3ZV93ewK0GU&list=UUgRr2pZaGeaZVN6LfbvQk9w[/youtube]










...
...
...


...


Un saludo!
Elektro
#546
Buenas

He acudido a varias personas del planeta para intentar resolver este problema de la manera idonea, pero por desgracia nadie ha podido aportarme algo de lúz a este misterio...

Me gustaría usar la interface de My.Settings para poder implementar una MRU algo avanzada en una aplicación, cada entrada de la MRU debería contener una imagen (Bitmap), un índice (Int32), y una cadena (String), pero la interface My.Settings es incompatible con Types genéricos (Ej: Tuple(of Bitmap, Integer, String) ) así que el type que mejor se adapta a mis necesidades es un ArrayList, porque antes que ponerme a escribir una pequeña Class serializable para almacenar estos 3 datos insignificantes prefiero usar un ArrayList que ya está implementado, sinceramente.

El problema es que los cambios que se efectuen a la propiedad no se preservan en los siguientes inicios de la aplicación ...y eso es lo que nadie me ha sabido resolver, yo por mi parte he probado todo lo que se me ha ocurrido, incluso la serialización del ArrayList pero he acabado echo un lio con eso.

Teniendo en cuenta que tenemos una propiedad como esta (con el ArrayList inicializado o sin inicializar, ¡no importa!):


Este código que he escrito demuestra el problema:
Código (vbnet) [Seleccionar]
Public Class Test

   Private Sub Test_Handler() Handles MyBase.Shown

       ' Create a temporal predefined ArrayList.
       Dim tmpArrayList As New ArrayList(capacity:=10I)
       With tmpArrayList
           .Add({"Item0", 0.0F})
           .Add({"Item1", 0.5F})
       End With

       ' Check the setting status.
       If My.Settings.MRU Is Nothing Then
           Debug.WriteLine("MRU setting is null.")
           Debug.WriteLine("Initializing the Setting...")
           My.Settings.MRU = New ArrayList(capacity:=10I)

       ElseIf Not My.Settings.MRU.Count Then
           Debug.WriteLine("MRU is not null but the ArrayList is empty.")
           Debug.WriteLine("Adding some items...")
           My.Settings.MRU = tmpArrayList.Clone

       ElseIf My.Settings.MRU.Count Then
           Debug.WriteLine("MRU setting is OK.")
           Debug.WriteLine("Item Count: " & CStr(My.Settings.MRU.Count))
           Threading.Thread.Sleep(Integer.MaxValue)

       End If

       Debug.WriteLine("Saving any changes")
       My.Settings.Save()

       Debug.WriteLine("Updating any changes")
       My.Settings.Reload()

       Debug.WriteLine(String.Empty)
       Debug.WriteLine("****************************************")
       Debug.WriteLine("Checking again the MRU setting status in...")
       For Count As Integer = 1 To 3
           Debug.WriteLine(CStr(Count) & New String("."c, Count))
           Threading.Thread.Sleep(TimeSpan.FromSeconds(1))
       Next
       Debug.WriteLine("****************************************")
       Debug.WriteLine(String.Empty)

       Me.Test_Handler()

   End Sub

End Class


¿Alguien conoce el motivo de porque ocurre esto, porque los cambios no se preservan en el siguiente inicio de la aplicación, y como poder solucionarlo?

PD: Me gustaría dejar bien claro que conozco varios métodos o mejor dicho alternativas para conseguir hacer lo mismo (es decir, guardar un archivo de configuración legible por la app), pero yo me he propuesto hacer esto usando My.Settings debido a las ventajas y comodidades que ofrece, quiero encarecidamente intentar resolver este problema unicamente usando my.settings y conocer con exactitud el motivo de porque el ArrayList no se preserva, no busco alternativas ...pues ya las conozco.

Gracias.
#547
Buenas

Antes de nada me gustaría explicar el motivo que me ha llevado a redactar este post.

Bien, durante mi estancia en esta magnifica página (han sido muchos años, esta no ha sido mi única cuenta) he visto como ciertos usuarios (no daré nombres por si se molestan) llegaron a anunciarse (por asi decirlo) en esta sección del Foro Libre publicando mensajes como este, para dar a conocer al mundo sus habilidades e intentar sacar un beneficio económico de ello haciendo lo que mejor saben hacer (¿os acordais de nuestro amigo **** ofreciendo video-clases de hacking o programacion?, pues a eso me refiero por ejemplo :P).

Por ese motivo espero de corazón que este mensaje no siente mal a ningún lector, usuario, moderador, o miembro del Staff, ya que hemos visto con el tiempo como varios mensajes de este estilo han sido aceptados por la moderación en su momento, aunque recuerdo que alguno fue más polémico que otro pero siempre en el buen sentido de la palabra (al menos así lo vi yo, en mi opinión).


Para aquellas personas que no me conozcan, podeis deducir que se me conoce con el apodo de Eleкtro, pero mi nombre real es Christian (obviamente no iba a ser Eleкtro xD), tengo 27 años, y desde que descubrí la programación es algo que no ha dejado de sorprenderme y apasionarme ...cuanta belleza, aunque no me dedico a esto de forma profesional (en algún trabajo), pues he tenido que llevar las riendas de mi vida por senderos incompatibles.

Y por si no os habeis dado cuenta, otra afición que tengo (otra pasión) es la de ejercer de moderador en varias (dos) secciones del foro, ¿porque comento esto?, pues porque a pesar de la ayuda que yo pueda ofrecer como moderador (recuerden que los moderadores no somos Dioses del conocimiento ni tenemos el Don de la clarividencia, somos personas con ganas de ayudar y mantener el orden), o la ayuda que cualquier otro usuario del foro pueda ofrecerle a una persona en 'apuros' que tenga dudas,
muchas veces se puede dar el caso (y se ha dado) en el que la ayuda proporcionada no es suficiente para esa persona, ya que ciertas personas requieren mucho más que un pequeño empujón o que les muestres un largo código o ejemplos/documentación de otras páginas, eso no es suficiente para ellos y necesitan ayuda "especial" para elaborar una tarea compleja (o simplemente "grande") la cual llevaría bastante tiempo (días, semanas o puede que meses), y eso implicaría una labor personal mucho más profunda y una inversión de tiempo mucho mayor que la obligación que pueda tener un moderador o cualquier otro usuario con esa persona en particular, y ahí es a donde quiero llegaros con mi mensaje, esa es la razón de todo esto.

Si tienes cualquier duda en lo que se refiere a la programación, ¡no dudes en formular tu pregunta en el foro!, yo mismo o cualquier otra persona capacitada estará encantada de intentar ayudarte, pero si la ayuda que te propocionen no te satisface lo suficiente entonces escucha lo que tengo que decirte a continuación...












· ¿Que servicios puedo ofrecerte?

Ofrezco mis (humildes) conocimientos de programación para evitarte la frustración de llevar a cabo la investigación y el desarrollo de Scripts y/o aplicaciones de escritorio (para Windows), para poder realizar practicamente casi cualquier tipo de tarea, desde algo simple como pudiera ser un analizador de texto (un parser), hasta un complejo taller casero enfocado en la edición/manipulación de video,
el límite solo lo impones tú y mis conocimientos, soy una persona honesta y si veo que tu petición está fuera de mi alcance, te lo diré al instante, al igual que si considero que no estoy del todo cualificado para desarrollar "X" tarea pero solo necesitase instruirme un poco más en el tema para poder cumplir tus necesidades, también te lo diré para esperar unos días y proseguir con el tema.  

Soy capaz de desarrollar tanto aplicaciones con interfaz gráfica (GUI) como de consola (CLI), a elección del cliente [1].


   


Nota: Las imágenes de arriba tienen el único fín de demostrar la diferencia entre interfaces, los proyectos no son de mi propiedad.

[1]: En ciertas circunstancias podría depender unicamente de las necesidades de la aplicación, ya que por ejemplo sería imposible mostrar una imagen en la consola.





· ¿En que lenguajes puedo hacerlo?


Para el desarrollo de aplicaciones con interfaz gráfica usaré estríctamente VB.NET, para el desarrollo de aplicaciones con interfaz por linea de comandos, en caso de que no fuese un detalle que tuviera importancia para el cliente, también usaré VB.NET. Si necesitas elaborar trabajos en los otros lenguajes mencionados, podemos hablar de ello.

Nota: Estoy acostumbaro al uso de HTML en ciertos aspectos y puedo desarrollar aplicaciones que intervengan/interactuen de forma general con 'la web' (navegación, edición, etc), pero son eso ...aplicaciones de escritorio, yo no manejo ningún lenguaje relacionado con la programación a nivel web, porfavor, abstenerse de pedirme cosas del tipo "necesito un código para implementarlo en mi web".

[1]: No estoy cualificado para desarrollar códigos complejos en este lenguaje, pero forma parte de Microsoft.NET y esto quiere decir que se puede llevar a cabo y entregarte una traducción literal desde VB.NET, siempre que puedas estar conforme con este detalle.





· ¿Que te ofrezco en la entrega del proyecto?

  • El código fuente junto a las librerías privadas (de pago) de terceros que haya utilizado (si alguna).

Además, de forma gratuita y adicional:


  • La aplicación compilada, junto a una versión protegida de la misma (ofuscada), una versión portátil (portable), y una versión instalable (de Inno Setup install-builder). [1]
  • Un video-presentación demostrando las características de la aplicación.
  • Documentación completa del código fuente, explicando el uso o la finalidad de todos los miembros existentes del código.
  • Archivo de documentación de la aplicación, en formato CHM (Microsoft HTML Help 1). [2]
  • Archivo de texto con unas breves instrucciones de uso (especialmente para aplicaciones de consola).
  • Certificado digital casero (y sin caducidad) para autorizar el uso de la aplicación en un equipo. [2]
  • Soporte gratis para solucionar posibles problemas (bugs) durante los 365 días del año, para siempre. [3]

Nota: Si no requieres la elaboración de alguna de las características adicionales y prefieres prescindir de alguna (o incluso todas), me harías un gran favor al comunicarmelo, ya que esto ayudaría a reducir el tiempo de entrega de tu proyecto.

[1]: Si el trabajo trata sobre el desarrollo de un script, la compilación solo podrá ser una mera conversión a .exe realizada con el respectivo empaquetador, y no enviaré una versión protegida.
[2]: Característica disponible solo para el desarrollo de aplicaciones de escritorio (No Scripting).
[3]: Entiendase que añadir nuevas características o cambiar su función actual no se considera un Bug.





· ¿Como va esto?

No cobro por horas, ni tampoco tengo un precio fijo, pero el precio mínimo que pediré por la elaboración de proyectos simples serán 5€ (menos no puedo pedir, tengo que rentabilizar el tiempo invertido para comer), para todo lo demás llegariamos a un acuerdo (económico) dependiendo de la complejidad de la tarea a realizar y el tiempo de entrega a cumplir o el tiempo de elaboración que yo necesitase invertir en un principio para finalizar el proyecto.

En elaboraciones complejas que requiriesen más de 2 días de desarrollo, yo mantendría al cliente informado del progreso mediante la información de contacto que éste me haya entregado, y si el tiempo me lo permitiese sería con algún video-demostrativo del progreso y por supuesto también enviaría imágenes del proyecto, ya que la desconfianza es algo que puede crear problemas y a mi no me cuesta nada enseñar el progreso para evitar posibles malas caras o miradas.

Al finalizar el proyecto, el cliente depositaría la cantidad de dinero acordada en una cuenta de Paypal que previamente yo le habré proporcionado (el cliente puede abonar el dinero antes de la entrega si así lo prefiere), y entonces se le entregaría una url de descarga del proyecto junto a todas las características adicionales que he comentado anteriormente.





· ¿Hay condiciones?

Sí, las hay, malas experiencias en el pasado por alguna que otra persona aprovechada me han llevado a condicionar los servicios que ofrezco para evitar cualquier tipo de conflicto entre nosotros:

  • Por motivos que deberían ser evidentes, no tendré en cuenta peticiones de códigos/aplicaciones con fines delictivaos.
  • Bajo ninguna circunstancia entregaré el proyecto finalizado antes de recibir la suma de dinero acordada.
  • La forma de pago deberá ser mediante el servicio de Paypal, y la moneda de pago en Euros, no hago ningún tipo de rebajas por vivir en otros paises cuya economía sea pobre.





· ¿Como contactar conmigo?

La publicación de información personal está phohibida en el foro, así que porfavor en caso de querer llegar a un acuero conmigo no publicar nada que pueda perjudicar su cuenta, hacer el favor de ponerse en contacto conmigo enviándome un mensaje privado por el foro.

PD: De todas formas mi email está visible al público en mi perfil de usuario, leeré al mismo tiempo tanto los mensajes que puedan llegar a mi cuenta de correo personal, como a mi cuenta de @ElHacker.net.





¡Un saludo!
Eleкtro
#548
Hola

Las temperaturas de mis hdd ahora en verano están entre 45º-49º (tanto los hdd activos como los inactivos) y me gustaría refrigerarlos en la medida de lo posible...

Tengo 4 Hdd's, cada uno está "pegado" al otro, es decir hay 4 compartimentos, pues 4 hdd's con el espacio mínimo entre cada compartimento,
y lo único que encuentro respecto a la ventilación de HDD es este artículo: http://www.pccomponentes.com/scythe_ita_kaze_slim_hard_disk_cooler.html

Soy inexperto en el tema, nunca he comprado ese tipo de ventilador ni lo he visto en un PC.

· ¿Pueden surgir complicaciones por no haber el suficiente hueco entre mis hdd's?

· ¿Un ventilador de los normales se supone que también serviría de la misma manera?

No se, espero cualquier tipo de consejo.
un saludo!
#549
Esta Class sirve para preservar una o todas las fechas de un archivo para poder restaurarlas en cualquier otro momento, me parece muy útil para modificar archivos los cuales no quieres que sus fechas actuales se alteren después de la modificación... y con este "ayudante" ahorrarás tiempo y escritura de código.
Esta Class también sirve para establecer fechas en un archivo (aunque esa característica simplemente está ahí para decorar, para extender un poco su funcionalidad).

Nota: En la Class podrán notar que le añadí la implementación de la interface IDisposable, en un principio esto podría parecer innecesario, pero la añadí para evitar el poder crear instancias que usen el mismo archivo, ya que no le encuentro sentido alguno al permitir estar preservando/restaurando las fechas de un mismo archivo en distintas instancias y esto podría ocasionar confusiones además de un uso indebido, y además, de esta forma el uso de los bloques Using también pueden prevenir algún que otro descuido.

Espero que a alguien le sirva :).






Ejemplo de uso:

1.
Código (vbnet) [Seleccionar]
       ' Instance the FileDater Class.
       Using fd As New FileDater(File:="C:\Test File.txt")

           ' Preserve the current date-modified of the file.
           fd.Preserve(FileDater.DateType.Modified)

           ' Do some kind of operation that alters the current date-modified of the file.
           IO.File.AppendAllText(fd.File.FullName, New String("X"c, 10I))

           ' Restore the previously preserved date-modified on the TestFile.
           fd.Restore(FileDater.DateType.Modified)

       End Using '/ fd


2.
Código (vbnet) [Seleccionar]
       ' Instance a test FileInfo using an unique temp file.
       Dim TestFile As New IO.FileInfo(IO.Path.GetTempFileName)

       ' Instance the FileDater Class.
       Using fd As New FileDater(File:=TestFile)

           ' Preserve the current dates of the TestFile.
           fd.Preserve(FileDater.DateType.Created Or FileDater.DateType.Accessed Or FileDater.DateType.Modified)

           ' Show the type of the current preserved dates.
           MessageBox.Show(fd.PreservedTypes.ToString)

           ' Show current preserved date-creation.
           MessageBox.Show(fd.PreservedCreationDate.ToString)

           ' Modify the current date-creation on the TestFile.
           fd.Set(FileDater.DateType.Created, Date.Parse("01/01/2015"))

           ' Restore the previously preserved date-creation on the TestFile.
           fd.Restore(FileDater.DateType.Created)

           ' Show the current Creation date of the TestFile.
           MessageBox.Show(TestFile.CreationTime)

       End Using







El código:

Código (vbnet) [Seleccionar]
' ***********************************************************************
' Author   : Elektro
' Modified : 07-22-2014
' ***********************************************************************
' <copyright file="FileDater.vb" company="Elektro Studios">
'     Copyright (c) Elektro Studios. All rights reserved.
' </copyright>
' ***********************************************************************

#Region " Usage Examples "

#Region " Example 1 "

'' Instance the FileDater Class.
'Using fd As New FileDater(File:="C:\Test File.txt")

'    ' Preserve the current date-modified of the file.
'    fd.Preserve(FileDater.DateType.Modified)

'    ' Do some kind of operation that alters the current date-modified of the file.
'    IO.File.AppendAllText(fd.File.FullName, New String("X"c, 10I))

'    ' Restore the previously preserved date-modified on the TestFile.
'    fd.Restore(FileDater.DateType.Modified)

'End Using '/ fd

#End Region

#Region " Example 2 "

'' Instance a test FileInfo using an unique temp file.
'Dim TestFile As New IO.FileInfo(IO.Path.GetTempFileName)

'' Instance the FileDater Class.
'Using fd As New FileDater(File:=TestFile)

'    ' Preserve the current dates of the TestFile.
'    fd.Preserve(FileDater.DateType.Created Or FileDater.DateType.Accessed Or FileDater.DateType.Modified)

'    ' Show the type of the current preserved dates.
'    MessageBox.Show(fd.PreservedTypes.ToString)

'    ' Show current preserved date-creation.
'    MessageBox.Show(fd.PreservedCreationDate.ToString)

'    ' Modify the current date-creation on the TestFile.
'    fd.Set(FileDater.DateType.Created, Date.Parse("01/01/2015"))

'    ' Restore the previously preserved date-creation on the TestFile.
'    fd.Restore(FileDater.DateType.Created)

'    ' Show the current Creation date of the TestFile.
'    MessageBox.Show(TestFile.CreationTime)

'End Using

#End Region

#End Region

#Region " Imports "

Imports System.ComponentModel
Imports System.IO

#End Region

#Region " FileDater "

''' <summary>
''' Contains methods to preserve, set, and restore the dates contained on file.
''' </summary>
Public NotInheritable Class FileDater : Implements IDisposable

#Region " Objects "

   ''' <summary>
   ''' Contains the files that are already used in the constructor to prevent a duplicated instance for the same file.
   ''' </summary>
   Private Shared InstancedFiles As New List(Of FileInfo)

#End Region

#Region " Properties "

   ''' <summary>
   ''' Gets the file.
   ''' </summary>
   ''' <value>The file.</value>
   Public ReadOnly Property [File] As FileInfo
       Get
           Return Me._File
       End Get
   End Property
   Private _File As FileInfo

   ''' <summary>
   ''' Gets the type of the current preserved dates.
   ''' </summary>
   Public ReadOnly Property PreservedTypes As DateType
       Get
           Return Me._PreservedTypes
       End Get
   End Property
   Private _PreservedTypes As DateType = Nothing

   ''' <summary>
   ''' Gets the preserved creation date.
   ''' </summary>
   ''' <value>The preserved creation date.</value>
   Public ReadOnly Property PreservedCreationDate As Date
       Get
           Return Me._PreservedCreationDate
       End Get
   End Property
   Private _PreservedCreationDate As Date

   ''' <summary>
   ''' Gets the preserved last-access date.
   ''' </summary>
   ''' <value>The preserved creation date.</value>
   Public ReadOnly Property PreservedLastAccessDate As Date
       Get
           Return Me._PreservedLastAccessDate
       End Get
   End Property
   Private _PreservedLastAccessDate As Date

   ''' <summary>
   ''' Gets the preserved last-modify date.
   ''' </summary>
   ''' <value>The preserved creation date.</value>
   Public ReadOnly Property PreservedLastModifyDate As Date
       Get
           Return Me._PreservedLastModifyDate
       End Get
   End Property
   Private _PreservedLastModifyDate As Date

#End Region

#Region " Enumerations "

   ''' <summary>
   ''' Contains a FileDate flag.
   ''' </summary>
   <FlagsAttribute>
   Public Enum DateType As Integer

       ''' <summary>
       ''' The date when the file was created.
       ''' </summary>
       Created = 1I

       ''' <summary>
       ''' The date when the file was accessed by last time.
       ''' </summary>
       Accessed = 2I

       ''' <summary>
       ''' The date when the file was modified by last time.
       ''' </summary>
       Modified = 4I

   End Enum

#End Region

#Region " Constructors "

   ''' <summary>
   ''' Initializes a new instance of the <see cref="FileDater"/> class.
   ''' </summary>
   ''' <param name="File">Indicates the <see cref="FileInfo"/> instance.</param>
   ''' <exception cref="System.Exception"></exception>
   Public Sub New(ByVal [File] As FileInfo)

       If Not InstancedFiles.Contains([File]) Then
           Me._File = [File]
           InstancedFiles.Add([File])

       Else
           Throw New Exception(String.Format("Another instance of the '{0}' class is using the same file.", MyBase.GetType.Name))

       End If

   End Sub

   ''' <summary>
   ''' Initializes a new instance of the <see cref="FileDater"/> class.
   ''' </summary>
   ''' <param name="File">Indicates the file.</param>
   Public Sub New(ByVal [File] As String)
       Me.New(New FileInfo([File]))
   End Sub

   ''' <summary>
   ''' Prevents a default instance of the <see cref="FileDater"/> class from being created.
   ''' </summary>
   Private Sub New()
   End Sub

#End Region

#Region " Hidden Methods "

   ''' <summary>
   ''' Serves as a hash function for a particular type.
   ''' </summary>
   <EditorBrowsable(EditorBrowsableState.Never)>
   Public Shadows Sub GetHashCode()
   End Sub

   ''' <summary>
   ''' Determines whether the specified System.Object instances are considered equal.
   ''' </summary>
   <EditorBrowsable(EditorBrowsableState.Never)>
   Public Shadows Sub Equals()
   End Sub

   ''' <summary>
   ''' Determines whether the specified System.Object instances are the same instance.
   ''' </summary>
   <EditorBrowsable(EditorBrowsableState.Never)>
   Private Shadows Sub ReferenceEquals()
   End Sub

   ''' <summary>
   ''' Returns a String that represents the current object.
   ''' </summary>
   <EditorBrowsable(EditorBrowsableState.Never)>
   Public Shadows Sub ToString()
   End Sub

#End Region

#Region " Public Methods "

   ''' <summary>
   ''' Preserves the specified dates of the file to restore them later at any time.
   ''' Note: Dates can be preserved again at any time.
   ''' </summary>
   ''' <param name="DateType">Indicates the type of dates to preserve.</param>
   Public Sub Preserve(ByVal DateType As DateType)

       Me.DisposedCheck()

       ' Creation
       If DateType.HasFlag(FileDater.DateType.Created) Then
           Me._PreservedCreationDate = Me._File.CreationTime
       End If

       ' Accessed
       If DateType.HasFlag(FileDater.DateType.Accessed) Then
           Me._PreservedLastAccessDate = Me._File.LastAccessTime
       End If

       ' Modified
       If DateType.HasFlag(FileDater.DateType.Modified) Then
           Me._PreservedLastModifyDate = Me._File.LastWriteTime
       End If

       Me._PreservedTypes = DateType

   End Sub

   ''' <summary>
   ''' Preserves at once all the dates of the file to restore them later at any time.
   ''' Note: Dates can be preserved again at any time.
   ''' </summary>
   Public Sub Preserve()

       Me.DisposedCheck()

       Me._PreservedCreationDate = Me._File.CreationTime
       Me._PreservedLastAccessDate = Me._File.LastAccessTime
       Me._PreservedLastModifyDate = Me._File.LastWriteTime

       Me._PreservedTypes = DateType.Created Or DateType.Accessed Or DateType.Modified

   End Sub

   ''' <summary>
   ''' Restores the specified preserved dates on the file.
   ''' Note: Calling this method does not cause the deletion of any preserved date.
   ''' </summary>
   ''' <param name="DateType">Indicates the type of dates to restore on the file.</param>
   ''' <exception cref="System.Exception">Any date was preserved.</exception>
   Public Sub Restore(ByVal DateType As DateType)

       Me.DisposedCheck()

       ' Creation
       If DateType.HasFlag(FileDater.DateType.Created) _
       AndAlso Me._PreservedTypes.HasFlag(FileDater.DateType.Created) Then

           Me._File.CreationTime = Me._PreservedCreationDate

       ElseIf DateType.HasFlag(FileDater.DateType.Created) _
       AndAlso Not Me._PreservedTypes.HasFlag(FileDater.DateType.Created) Then

           Throw New Exception(String.Format("The specified date was not preserved.")) With {
               .Source = FileDater.DateType.Created.ToString
           }

       End If

       ' Accessed
       If DateType.HasFlag(FileDater.DateType.Accessed) _
       AndAlso Me._PreservedTypes.HasFlag(FileDater.DateType.Accessed) Then

           Me._File.LastAccessTime = Me._PreservedLastAccessDate

       ElseIf DateType.HasFlag(FileDater.DateType.Accessed) _
       AndAlso Not Me._PreservedTypes.HasFlag(FileDater.DateType.Accessed) Then

           Throw New Exception(String.Format("The specified date was not preserved.")) With {
               .Source = FileDater.DateType.Accessed.ToString
           }

       End If

       ' Modified
       If DateType.HasFlag(FileDater.DateType.Modified) _
       AndAlso Me._PreservedTypes.HasFlag(FileDater.DateType.Modified) Then

           Me._File.LastWriteTime = Me._PreservedLastModifyDate

       ElseIf DateType.HasFlag(FileDater.DateType.Modified) _
       AndAlso Not Me._PreservedTypes.HasFlag(FileDater.DateType.Modified) Then

           Throw New Exception(String.Format("The specified date was not preserved.")) With {
               .Source = FileDater.DateType.Modified.ToString
           }

       End If

   End Sub

   ''' <summary>
   ''' Restores at once all the preserved dates on the file.
   ''' Note: Calling this method does not cause the deletion of any preserved date.
   ''' </summary>
   Public Sub Restore()

       Me.DisposedCheck()

       ' Creation
       If Me._PreservedTypes.HasFlag(FileDater.DateType.Created) Then
           Me._File.CreationTime = Me._PreservedCreationDate
       End If

       ' Accessed
       If Me._PreservedTypes.HasFlag(FileDater.DateType.Accessed) Then
           Me._File.LastAccessTime = Me._PreservedLastAccessDate
       End If

       ' Modified
       If Me._PreservedTypes.HasFlag(FileDater.DateType.Modified) Then
           Me._File.LastWriteTime = Me._PreservedLastModifyDate
       End If

   End Sub

   ''' <summary>
   ''' Sets the specified dates on the file.
   ''' Note:
   ''' Calling this method does not cause the deletion of any preserved date.
   ''' After setting a date, must call once the <see cref="Preserve"/> method if want to preserve any new date established.
   ''' </summary>
   ''' <param name="DateType">Indicates the type of dates to set on the file.</param>
   ''' <param name="Date">Indicates the date.</param>
   Public Sub [Set](ByVal DateType As DateType, ByVal [Date] As Date)

       Me.DisposedCheck()

       ' Creation
       If DateType.HasFlag(FileDater.DateType.Created) Then
           Me._File.CreationTime = [Date]
       End If

       ' Accessed
       If DateType.HasFlag(FileDater.DateType.Accessed) Then
           Me._File.LastAccessTime = [Date]
       End If

       ' Modified
       If DateType.HasFlag(FileDater.DateType.Modified) Then
           Me._File.LastWriteTime = [Date]
       End If

   End Sub

   ''' <summary>
   ''' Sets at once all the dates on the file.
   ''' Note:
   ''' Calling this method does not cause the deletion of any preserved date.
   ''' After setting a date, must call once the <see cref="Preserve"/> method if want to preserve any new date established.
   ''' </summary>
   ''' <param name="Date">Indicates the date.</param>
   Public Sub [Set](ByVal [Date] As Date)

       Me.DisposedCheck()

       Me._File.CreationTime = [Date]
       Me._File.LastAccessTime = [Date]
       Me._File.LastWriteTime = [Date]

   End Sub

#End Region

#Region " IDisposable "

   ''' <summary>
   ''' To detect redundant calls when disposing.
   ''' </summary>
   Private IsDisposed As Boolean = False

   ''' <summary>
   ''' Prevent calls to methods after disposing.
   ''' </summary>
   ''' <exception cref="System.ObjectDisposedException"></exception>
   Private Sub DisposedCheck()

       If Me.IsDisposed Then
           Throw New ObjectDisposedException(Me.GetType().FullName)
       End If

   End Sub

   ''' <summary>
   ''' Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
   ''' </summary>
   Public Sub Dispose() Implements IDisposable.Dispose
       Dispose(True)
       GC.SuppressFinalize(Me)
   End Sub

   ''' <summary>
   ''' Releases unmanaged and - optionally - managed resources.
   ''' </summary>
   ''' <param name="IsDisposing">
   ''' <c>true</c> to release both managed and unmanaged resources;
   ''' <c>false</c> to release only unmanaged resources.
   ''' </param>
   Protected Sub Dispose(ByVal IsDisposing As Boolean)

       If Not Me.IsDisposed Then

           If IsDisposing Then
               InstancedFiles.Remove(Me._File)
           End If

       End If

       Me.IsDisposed = True

   End Sub

#End Region

End Class

#End Region
#550
Hola

Comparto esta Class cuya finalidad es la de administrar las pistas de una lista multimedia.

Para quien no sepa lo que es una lista multimedia, son unos archivos de texto plano que utilizan los reproductores de archivos multimedia (Video/Audio) para crear listas de reproducción.

Estas son ejemplos de los tipos de listas que soporta mi Class:

M3U:
#EXTM3U

#EXTINF:330,Track1 Title
C:\Track1.avi

C:\Track2.mp4

#EXTINF:5720,Track3 Title
C:\Track3.mp3


PLS:
[playlist]
NumberOfEntries=3
Version=2

File1=C:/Track1.avi

File2=C:/Track2.mp4
Title2=My Track2 Title!
Length2=5720

File3=C:/Track3.mp3
Title3=My Track3 Title!
Length3=330


Características del código:
· Se puede trabajar con dos tipos de listas, M3U y PLS.
· Se puede añadir entradas de pistas con o sin información extendida, así como editar una entrada, eliminar, determinar si existe, o buscar para obtener la información extendida de una pista.
· La mayoría de los métodos que desarrollé tienen overloads para trabajar pasandole o bien la ruta de la pista, o el índice de la pista (primero hay que conocer el índice, claro).

El código en general no creo que me haya quedado muy optimizado, de echo tengo que evitar la recursividad de algún que otro método, pero por el momento está bien y hace su función, aunque si encuentran cualquier fallo o cualquier sugerencia que quieran hacer entonces porfavor comenten.

PD: No he añadido muchos controles de errores, ya que he supuesto que si se le da el uso correcto no debería dar errores (más hallá de los que sí están controlados).

PD2: Al principio me propuse hacerlo todo mediante FileStreams y manteniendo el archivo abierto para denegar el acceso manual al archivo, pero el formato PLS me lo puso muy complicado porque hay que hacer operaciones constantes de búsqueda y modificar un valor tras cada operación así que para no comerme mucho más la cabeza decidí usar un StringBuilder y también listas de Strings, sin más, dejando un poco de lado los permisos de lectura/escritura del archivo del playlist y tambien el rendimiento en general ...los tiempos de ejecución, pero de todas formas recordemos que se trataría de un simple archivo de texto que no debería tener muchas lineas, aunque se optimizase el código no creo que se apreciase la diferencia (en milisegundos xD)...






Estos son algunos ejemplos de uso:

Código (vbnet) [Seleccionar]
       ' **********************************
       ' Instance the PlaylistEditor Class
       ' **********************************
       Dim Playlist As New PlaylistEditor(PlaylistFile:="C:\Playlist.m3u",
                                          PlaylistType:=PlaylistEditor.PlaylistType.M3U,
                                          Append:=False,
                                          FileEncoding:=System.Text.Encoding.Default)

       ' ************************************
       ' Retrieve the instanced object info
       ' ************************************
       MessageBox.Show(Playlist.FilePath)
       MessageBox.Show(Playlist.Type.ToString)
       MessageBox.Show(CStr(Playlist.Append))
       MessageBox.Show(String.Format("Encoding: {0}, CodePage: {1}",
                                     Playlist.FileEncoding.BodyName,
                                     Playlist.FileEncoding.CodePage))

       ' ***************************
       ' Instance a TrackInfo Class
       ' ***************************
       Dim TInfo As New PlaylistEditor.TrackInfo
       With TInfo
           .Path = "C:\Track1.ext"
           .Title = "Track1 Title"
           .Length = TimeSpan.Parse("00:05:30")
       End With

       ' ***************
       ' Add a new track
       ' ***************
       Playlist.Add(TrackInfo:=TInfo)
       Playlist.Add(Path:="C:\Track2.ext", AllowDuplicate:=False)
       Playlist.Add(Path:="C:\Track3.ext", Title:="Track3 Title", Length:=TimeSpan.Parse("01:35:20"))

       ' *************************************************
       ' Sets the extended track info of an existing track
       ' *************************************************
       Dim OldTrackPath As String = "C:\Track3.ext"

       Dim TInfoSet As New PlaylistEditor.TrackInfo
       With TInfoSet
           .Path = "C:\Modified Track3.ext"
           .Title = "My modified Track3 title"
           .Length = Playlist.GetTrack(OldTrackPath).Length
       End With

       Playlist.Set(Path:=OldTrackPath, TrackInfo:=TInfoSet)

       ' ************************
       ' Remove an existing track
       ' ************************
       Playlist.Remove(Path:="C:\Track3.ext")
       Playlist.Remove(TrackIndex:=2I)

       ' ********************************
       ' Determine whether a track exists
       ' ********************************
       MessageBox.Show(Playlist.Exist(Path:="C:\Track3.ext"))
       MessageBox.Show(Playlist.Exist(TrackIndex:=3I))

       ' ************************************************
       ' Count the total amount of tracks in the playlist
       ' ************************************************
       MessageBox.Show(Playlist.Count)

       ' ************************************
       ' Get extended track info from a track
       ' ************************************
       Dim TrackInfo1 As PlaylistEditor.TrackInfo = Playlist.GetTrack(Path:="C:\Track1.ext")
       Dim TrackInfo2 As PlaylistEditor.TrackInfo = Playlist.GetTrack(TrackIndex:=2I)

       ' ******************************************
       ' Get all tracks and its extended track info
       ' ******************************************
       Dim sb As New System.Text.StringBuilder
       Dim Tracks As List(Of PlaylistEditor.TrackInfo) = Playlist.GetTracks()

       For Each Track As PlaylistEditor.TrackInfo In Tracks

           With sb
               .Clear()
               .AppendLine(String.Format("Track Index : {0}", CStr(Track.Index)))
               .AppendLine(String.Format("Track Path  : {0}", Track.Path))
               .AppendLine(String.Format("Track Title : {0}", Track.Title))
               .AppendLine(String.Format("Track Length: {0}", Convert.ToString(Track.Length)))
           End With

           MessageBox.Show(sb.ToString)

       Next Track

#551
Hola

A ver, no se como iniciar este post... porque realmente no sé cual podrá ser el problema, así que simplemente contaré la anécdota tal cual sin dejarme ningún detalle.

Hace unos pocos días realicé un pedido a una tienda, adquirí un disipador + cooler para mi AMD Socket AM3+ (porque el ruido del cooler de fábrica era INSOPORTABLE), y una memoria RAM (simplemente para llenar una ranura más), estos son los productos que compré:

· Cooler Master Hyper 212 EVO
· Kingston HyperX Genesis DDR3 1866 PC3-14900 4GB (1x4GB)CL10

Y esta es la RAM que yo tenia antes de hacer la compra (tengo 2 tarjetas de estas):

· Kingston HyperX Beast DDR3 1866 PC3-14900 8GB 2X4GB CL9

(Porfavor, mirar las especificaciones de las 2 tarjetas por si encontrais algún conflicto)

Vale, hoy me puse a montar el disipa pero es GIGANTE así que la tarjeta RAM que habia en la primera ranura no me cabia y entonces de las dos tarjetas RAM que yo ya tenia tuve que moverlas una ranura a la derecha, y coloqué la nueva RAM a la derecha de estas, osea, así:



Rojo: Disipador
Verde: Ranuras RAM, las 3 de la derecha están ocupadas, la primera está vacía ...u ocupada por el disipador, según se mire xD.

Terminé de colocar todo, encendí el PC y me empezó a pitar!

El pitido era 1 solo, es decir 1 pitido corto, y no se veía el panel de la Bios ni nada, simplemente hacia 1 pitido y nada más ...hasta que lo volviese a encender.

Pensé que pude haberla cagado al instalar el disipador, o la ram, o que me dejé algún cable suelto, yo que sé!, pero me puse a desconectar componentes hasta intentar hallar el problema, y al parecer, repito, AL PARECER se trata de la RAM, pero no la nueva, tocate los... sino la antigua!




La cosa está así según las pruebas que he realizado, lo explicaré con imágenes:

Azul = Kingston HyperX
Verde = Kingston HyperBeast
Blanco = Ranura vacía

o también o también o también

Al encender el PC, después de unos pocos segundos se pone a hacer 1 pitido largo y 3 o 4 cortos, y lo repite 1 vez, luego no hace nada más, no me deja proseguir el Boot y tengo que apagarlo, eso si te deja apagarlo, porque a veces por más que mantenga pulsado el botón de apagado no se apaga xD.


o también

Al encender el PC me hace 1 pitido corto y la BIOS me lanza una pantalla extraña durante 1 segundo (no me da tiempo a leer lo que pone, pero nunca me habia salido dicha pantalla así que me parece que puede haber algún error), pero el Boot prosigue y puedo iniciar sesión (estoy escribiendo ahora mismo gracias a esa configuración de tarjetas).


¿Alguien tiene idea de lo que le ha podido pasar a mi PC?

¿En que página se podía mirar lo que significada "X" cantidad de Beeps al bootear?, ya que si no recuerdo mal, cada Beep corto y largo estaba relacionado con un problema específico.

¿Quizás hay algún conflicto entre la nueva y la vieja RAM?, ¿pero entonces porque si dejo solo la vieja RAM sigue sin funcionar?.

¿Es necesario que exista una tarjeta acoplada en la PRIMERA ranura para que bootee el PC?, ya que eso contestaría a lo de que el PC no me vaya con la antigua RAM (ya que no cabe en la primera ranura así que no la puedo poner ahí)


PD: Eso si, estoy contentisimo con el nuevo disipador, apenas hace ruido.

EDITO:
Respecto a los beepcodes, me he estado informando y parece que para cada bios/uefi es diferente, mi placa base es una:
Asus M5A97 LE R2.0 - 90-MIBJP0-G0EAY0MZ AMD Socket AM3

EDITO 2:

Temperaturas actuales:

CPU: 26º
Placa base: 41º
Gráfica: 41º
HDD's: entre 35º y 45º
#552
Hardware / Duda pasta térmica
9 Julio 2014, 12:37 PM
Hola

Tengo una duda muy básica, ¿la paste térmica, se pone encima de la pasta ya existente?, ¿sin más?.

Es decir, yo me he comprado un AMD que tiene su pasta térmica puesta ya de serie (como es obvio xD) con su ventilador y tal encima, bien, yo me he comprado un ventildor para reemplazar el de serie, que además trae pasta térmica, y yo sé desanclar y montar un ventilador de CPU, pero no se nada al respecto de la pasta térmica, osea de la capa blanca del disipador (porque pasta térmica / disipador es lo mismo no?), ¿es tan sencillo como echar una capa por encima de la pasta que ya trae puesta el chipset?, ¿y como cuanta cantidad de debe poner?, no la quiero cagar, vaya, ¿pasaría algo grave si pongo demasiada pasta sin querer?.

Necesito palabras textuales que me aclaren esta duda, pero además de esto me gustaria que alguien pudiera compartir un video donde enseñen el montaje correcto de la pasta térmica (fotos no, porfavor, que ya vi unas cuantas y sigo sin aclararme).

Gracias por leer,
Esaludos!
#553
Hola

Tengo una CPU AMD FX-8350 Socket AM3+ (942) y hace un ruido insoportable a la hora de reproducir video, o jugar a algún juego, a pesar de haber activado el modo "silencioso" en mi UEFI, hace demasiado ruido... como si fuese una X-Box frita (de las antiguas) xD.

Otro problema relacionado es que, ahora con la calor que hace, la CPU llega a cierta temperatura y se apaga el PC, supongo que la razón de que se apague por si solo sea porque la temp. llega al máximo permitido por el "detector" de fábrica de la CPU, ya que si no me equivoco, todas las CPU tienen un "detector" de temperaturas para apagar el PC si este llega al límite permitido y así prevenir fallos graves por altas temperaturas. (no sé exactamente la temp., ya que sucede cuando estoy inmerso en un juego así que no me da tiempo a comprobar la temp cuando se apaga el PC)

Lo de la temperatura no me resulta muy necesario arreglarlo porque juego poco así que puedo esperar a que llegue el invierno para que no de más fallos, además, a pesar de haber leido un tutorial con imagenes hace tiempo, no se cambiarle la pasta térmica ni tampoco se cuanto vale que te lo hagan en una tienda (me vendría bien conocer ese dato para no ir a preguntarles xD), así que me centraré en el ruido del ventilador, que eso si que es intolerable.


Tengo 3 ventiladores, el de la GPU, el de la CPU, y uno trasero, de todos he comprobado que el ventilador ruidoso es el de la CPU (es el que viene de fábrica).

Así que, ¿alguien me puede recomendar un buen ventilador para un Socker AM3+, que además de ser bueno sea económico y no llegue a los decibelios del sonido que hace una maldita motosierra?

Y otra duda que tengo, ¿cambiarle la pasta térmica tendría algún efecto positivo respecto al ruido del ventilador integrado?.

Y estoy abierto a otro tipo de sugerencias, por ejemplo... ¿necesito más ventiladores adicionales en la parte trasera del PC?, se que eso ayudaría a que se calentase menos pero... ¿haria mucho más ruido?.

¡Gracias!

Saludos.
Elektro.
#554
Buenas

En esta página, al pulsar el botón "Entrar", se carga aleatoriamente (o eso parece) 1 test de 4 posibles tests, bien, mi pregunta es: ¿alguien podría comprobar si se le puede especificar una query en la dirección para mostrar el test que yo quiera de los 4 que son?.

He comprobado las peticiones de tipo GET con Firebug, pero no he encontrado nada, aunque mi ojo no es experto para estas cosas, por eso pido la ayuda de alguien con experiencia...

También me he repasado el código fuente de la página, y me llama la atención el método "cargarExamen", pero ya intenté lo siguiente en vano xD:
https://sedeapl.dgt.gob.es/WEB_EXAM_AUTO/examen/examen.jsp?cargarExamen=1

PD: De paso no me vendría nada mal que alguien me explicase, en caso de poder realizar la query, que herramienta se puede usar para tracear de forma sencilla este tipo de querys o lo que se me ha pasado por alto mirar en Firebug.

Gracias de antemano

Saludos!
#555
DESCRIPCIÓN:

Una amiga me pidió que la ayudase a conseguir mantener la ventana del Skype siempre encima (por sus motivos personales), así que acabé desarrollando una pequeña utilidad con esa finalidad.

NOTA: No llevaré a cabo ninguna sugerencia para esta aplicación, se le pueden añadir mejoras como un icono en el systray, o usar la WinAPI para un mejor método de tección (por el nombre de la Class de la ventana del Chat en lugar de monitorizar el proceso), pero no me resulta necesario.






IMÁGENES:

   






DESCARGA:

http://www.mediafire.com/?6j129hf0t01i3yp

Incluye el código fuente, y compilación
#556
Hace un tiempo estuve indagando acerca de como narices implementar un (decente) algoritmo de ImageMatching, esto significa, identificar la existencia de una imagen en la pantalla, y de paso obtener las coordenadas para futuros usos.

Pues bien, despues de mucho investigar y mucha documentación leida, está claro que un algoritmo casero no puede llegar a compararse en eficacia y rendimiento a un producto (una librería) de renombre que tenga la suficiente experiencia en el ámbito, pues esto no es un simple PixelSearch, es algo mucho más laborioso.

Después de probar en profundidad distintos productos/librerías, encontré Aforge.NET, el cual es muy bueno tanto en su capacidad efectiva como en su velocidad de procesamiento de imagen, aunque no resulta tan rápido como a mi me gustaria y como he visto en algún que otro Software.

Nota: Si alguien conoce alguna librería eficiente y más rápida que Aforge, le agradecería que lo comentase.

Este código necesita la utilización de dicha librería, AForge, y sirve para identificar una imagen en la pantalla y obtener sus coordenadas, algo imprescindible si tienes pensado desarrollar un Bot por reconocimiento de imagen... así que espero que le sirva a alguien de ayuda.

Unos consejos antes de utilizar:
1. Si la imagen es demasiado grande, redimensionala al 40-60% (cuidado, cuando más difuso estén los pixeles puede ser menos efectivo).
2. Si la velocidad no es la esperada, prueba también a convertir la imagen a una escala de grises.

Código (vbnet) [Seleccionar]
    ' Find Image
    ' ( By Elektro )
    '
    ' Usage Examples:
    '
    'Private Sub Test() Handles MyBase.Shown
    '
    '    ' A Desktop Screenshot, in 1920x1080 px. resolution.
    '    Dim DesktopScreenshoot As New Bitmap("C:\Desktop.png")
    '
    '    ' A cutted piece of the screenshot, in 50x50 px. resolution.
    '    Dim PartOfDesktopToFind As New Bitmap("C:\PartOfDesktop.png")
    '
    '    ' Find the part of the image in the desktop, with the specified similarity.
    '    For Each matching As AForge.Imaging.TemplateMatch In
    '        FindImage(BaseImage:=DesktopScreenshoot, ImageToFind:=PartOfDesktopToFind, Similarity:=80.5R) ' 80,5% Similarity.
    '
    '        Dim sb As New System.Text.StringBuilder
    '
    '        sb.AppendFormat("Top-Left Corner Coordinates: {0}", matching.Rectangle.Location.ToString())
    '        sb.AppendLine()
    '        sb.AppendFormat("Similarity Image Percentage: {0}%", (matching.Similarity * 100.0F).ToString("00.00"))
    '
    '        MessageBox.Show(sb.ToString)
    '
    '    Next matching
    '
    'End Sub
    '
    ''' <summary>
    ''' Finds a part of an image inside other image and returns the top-left corner coordinates and it's similarity percent.
    ''' </summary>
    ''' <param name="BaseImage">
    ''' Indicates the base image.
    ''' </param>
    ''' <param name="ImageToFind">
    ''' Indicates the image to find in the base image.
    ''' </param>
    ''' <param name="Similarity">
    ''' Indicates the similarity percentage to compare the images.
    ''' A value of '100' means identical image.
    ''' Note: High percentage values with big images could take several minutes to finish.
    ''' </param>
    ''' <returns>AForge.Imaging.TemplateMatch().</returns>
    Private Function FindImage(ByVal BaseImage As Bitmap,
                               ByVal ImageToFind As Bitmap,
                               ByVal Similarity As Double) As AForge.Imaging.TemplateMatch()

        Dim SingleSimilarity As Single

        ' Translate the readable similarity percent value to Single value.
        Select Case Similarity

            Case Is < 0.1R, Is > 100.0R ' Value is out of range.
                Throw New Exception(String.Format("Similarity value of '{0}' is out of range, range is from '0.1' to '100.0'",
                                                  CStr(Similarity)))

            Case Is = 100.0R ' Identical image comparission.
                SingleSimilarity = 1.0F

            Case Else ' Image comparission with specific similarity.
                SingleSimilarity = Convert.ToSingle(Similarity) / 100.0F

        End Select

        ' Set the similarity threshold to find all matching images with specified similarity.
        Dim tm As New AForge.Imaging.ExhaustiveTemplateMatching(SingleSimilarity)

        ' Return all the found matching images,
        ' it contains the top-left corner coordinates of each one
        ' and matchings are sortered by it's similarity percent.
        Return tm.ProcessImage(BaseImage, ImageToFind)

    End Function
#557
Hola

Para todos los que estén interesados en iniciarse en los Hooks de bajo nivel (en lo cual yo no soy ningún experto) esto les podría servir, ya que considero haberlo dejado muy bien documentado y se puede aprender algo solo leyendo los comentarios XML.

Simplemente es un Hook que intercepta los eventos del ratón, pudiendo suscribirse a ellos, nada más que eso.

Código (vbnet) [Seleccionar]
' ***********************************************************************
' Author           : Elektro
' Last Modified On : 05-13-2014
' ***********************************************************************
' <copyright file="MouseHook.vb" company="Elektro Studios">
'     Copyright (c) Elektro Studios. All rights reserved.
' </copyright>
' ***********************************************************************

#Region " Instructions "

' Go to page:
' Project > Properties > Debug
'
' And uncheck the option:
' Enable the Visual Studio Hosting Process

#End Region

#Region " Usage Examples "

' ''' <summary>
' ''' A low level mouse hook that captures mouse events.
' ''' </summary>
'Private WithEvents MouseEvents As MouseHook = Nothing

' ''' <summary>
' ''' Handles the 'MouseLeftDown' event of the Mouse Hook.
' ''' </summary>
' ''' <param name="MouseLocation">Indicates the mouse [X,Y] coordinates.</param>
'Private Sub MouseEvents_MouseLeftDown(ByVal MouseLocation As Point) Handles MouseEvents.MouseLeftDown
'
'    Debug.WriteLine(String.Format("Mouse Left Down At: x={0}, y={1}", CStr(MouseLocation.X), CStr(MouseLocation.Y)))
'
'End Sub

' ''' <summary>
' ''' Handles the 'MouseLeftUp' event of the Mouse Hook.
' ''' </summary>
' ''' <param name="MouseLocation">Indicates the mouse [X,Y] coordinates.</param>
'Private Sub MouseEvents_MouseLeftUp(ByVal MouseLocation As Point) Handles MouseEvents.MouseLeftUp
'
'    Debug.WriteLine(String.Format("Mouse Left Up At: x={0}, y={1}", CStr(MouseLocation.X), CStr(MouseLocation.Y)))
'
'End Sub

' ''' <summary>
' ''' Handles the 'MouseMove' event of the Mouse Hook.
' ''' </summary>
' ''' <param name="MouseLocation">Indicates the mouse [X,Y] coordinates.</param>
'Private Sub MouseEvents_MouseMove(ByVal MouseLocation As Point) Handles MouseEvents.MouseMove
'
'    Debug.WriteLine(String.Format("Mouse Moved To: x={0}, y={1}", CStr(MouseLocation.X), CStr(MouseLocation.Y)))
'
'End Sub

' ''' <summary>
' ''' Handles the 'Click' event of the 'ButtonStartHook' control.
' ''' </summary>
'Private Sub ButtonStartHook() Handles ButtonStartHook.Click

'    ' Start the Mouse Hook.
'    MouseEvents = New MouseHook

'End Sub

' ''' <summary>
' ''' Handles the 'Click' event of the 'ButtonStopHook' control.
' ''' </summary>
'Private Sub ButtonStopHook() Handles ButtonStopHook.Click

'    ' Stop the Mouse Hook.
'    MouseEvents = Nothing

'End Sub

#End Region

#Region " Imports "

Imports System.ComponentModel
Imports System.Reflection
Imports System.Runtime.InteropServices

#End Region

#Region " MouseHook "

''' <summary>
''' A low level mouse hook class that captures mouse events.
''' </summary>
Public Class MouseHook

#Region " WinAPI "

#Region " Methods "

   ''' <summary>
   ''' Passes the hook information to the next hook procedure in the current hook chain.
   ''' A hook procedure can call this function either before or after processing the hook information.
   ''' For more info see here:
   ''' http://msdn.microsoft.com/en-us/library/windows/desktop/ms644974%28v=vs.85%29.aspx
   ''' </summary>
   ''' <param name="idHook">
   ''' This parameter is ignored.
   ''' </param>
   ''' <param name="nCode">
   ''' The hook code passed to the current hook procedure.
   ''' The next hook procedure uses this code to determine how to process the hook information.
   ''' </param>
   ''' <param name="wParam">
   ''' The wParam value passed to the current hook procedure.
   ''' The meaning of this parameter depends on the type of hook associated with the current hook chain.
   ''' </param>
   ''' <param name="lParam">
   ''' The lParam value passed to the current hook procedure.
   ''' The meaning of this parameter depends on the type of hook associated with the current hook chain.
   ''' </param>
   ''' <returns>
   ''' This value is returned by the next hook procedure in the chain.
   ''' The current hook procedure must also return this value.
   ''' The meaning of the return value depends on the hook type.
   ''' For more information, see the descriptions of the individual hook procedures.
   ''' </returns>
   <DllImport("user32.dll", CallingConvention:=CallingConvention.StdCall, CharSet:=CharSet.Auto)>
   Private Shared Function CallNextHookEx(
          ByVal idHook As Integer,
          ByVal nCode As Integer,
          ByVal wParam As Integer,
          ByVal lParam As MSLLHOOKSTRUCT
   ) As Integer
   End Function

   ''' <summary>
   ''' Installs an application-defined hook procedure into a hook chain.
   ''' You would install a hook procedure to monitor the system for certain types of events.
   ''' These events are associated either with a specific thread
   ''' or with all threads in the same desktop as the calling thread.
   ''' For more info see here:
   ''' http://msdn.microsoft.com/en-us/library/windows/desktop/ms644990%28v=vs.85%29.aspx
   ''' </summary>
   ''' <param name="idHook">
   ''' The type of hook procedure to be installed.
   ''' </param>
   ''' <param name="lpfn">
   ''' A pointer to the hook procedure.
   ''' If the dwThreadId parameter is zero or specifies the identifier of a thread created by a different process,
   ''' the lpfn parameter must point to a hook procedure in a DLL.
   ''' Otherwise, lpfn can point to a hook procedure in the code associated with the current process.
   ''' </param>
   ''' <param name="hInstance">
   ''' A handle to the DLL containing the hook procedure pointed to by the lpfn parameter.
   ''' The hMod parameter must be set to NULL if the dwThreadId parameter specifies a thread created by
   ''' the current process and if the hook procedure is within the code associated with the current process.
   ''' </param>
   ''' <param name="threadId">
   ''' The identifier of the thread with which the hook procedure is to be associated.
   ''' For desktop apps, if this parameter is zero, the hook procedure is associated
   ''' with all existing threads running in the same desktop as the calling thread.
   ''' </param>
   ''' <returns>
   ''' If the function succeeds, the return value is the handle to the hook procedure.
   ''' If the function fails, the return value is NULL.
   ''' </returns>
   <DllImport("user32.dll", CallingConvention:=CallingConvention.StdCall, CharSet:=CharSet.Auto)>
   Private Shared Function SetWindowsHookEx(
          ByVal idHook As HookType,
          ByVal lpfn As MouseProcDelegate,
          ByVal hInstance As IntPtr,
          ByVal threadId As Integer
   ) As Integer
   End Function

   ''' <summary>
   ''' Removes a hook procedure installed in a hook chain by the 'SetWindowsHookEx' function.
   ''' For more info see here:
   ''' http://msdn.microsoft.com/en-us/library/windows/desktop/ms644993%28v=vs.85%29.aspx
   ''' </summary>
   ''' <param name="idHook">
   ''' A handle to the hook to be removed.
   ''' This parameter is a hook handle obtained by a previous call to SetWindowsHookEx.
   ''' </param>
   ''' <returns>
   ''' If the function succeeds, the return value is nonzero.
   ''' If the function fails, the return value is zero.
   ''' </returns>
   <DllImport("user32.dll", CallingConvention:=CallingConvention.StdCall, CharSet:=CharSet.Auto)>
   Private Shared Function UnhookWindowsHookEx(
          ByVal idHook As Integer
   ) As Boolean
   End Function

#End Region

#Region " Enums "

   ''' <summary>
   ''' Indicates a type of Hook procedure to be installed.
   ''' </summary>
   <Description("Enum used in 'idHook' parameter of 'SetWindowsHookEx' function")>
   Private Enum HookType As Integer

       ' **************************************
       ' This enumeration is partially defined.
       ' **************************************

       ''' <summary>
       ''' Installs a hook procedure that monitors low-level mouse input events.
       ''' For more information, see the LowLevelMouseProc hook procedure.
       ''' </summary>
       WH_MOUSE_LL = 14

   End Enum

#End Region

#Region " Structures "

   ''' <summary>
   ''' Contains information about a low-level mouse input event.
   ''' </summary>
   <Description("Structure used in 'lParam' parameter of 'CallNextHookEx' function")>
   Private Structure MSLLHOOKSTRUCT

       ''' <summary>
       ''' The ptThe x- and y-coordinates of the cursor, in screen coordinates.
       ''' </summary>
       Public pt As Point

       ''' <summary>
       ''' If the message is 'WM_MOUSEWHEEL', the high-order word of this member is the wheel delta.
       ''' The low-order word is reserved.
       ''' A positive value indicates that the wheel was rotated forward, away from the user;
       ''' a negative value indicates that the wheel was rotated backward, toward the user.
       ''' One wheel click is defined as 'WHEEL_DELTA', which is '120'.
       ''' </summary>
       Public mouseData As Integer

       ''' <summary>
       ''' The event-injected flag.
       ''' </summary>
       Public flags As Integer

       ''' <summary>
       ''' The time stamp for this message.
       ''' </summary>
       Public time As Integer

       ''' <summary>
       ''' Additional information associated with the message.
       ''' </summary>
       Public dwExtraInfo As Integer

   End Structure

#End Region

#End Region

#Region " Variables "

   ''' <summary>
   '''
   ''' </summary>
   Private MouseHook As Integer

#End Region

#Region " Delegates "

   ''' <summary>
   ''' Delegate MouseProcDelegate
   ''' </summary>
   ''' <returns>System.Int32.</returns>
   Private Delegate Function MouseProcDelegate(
           ByVal nCode As Integer,
           ByVal wParam As Integer,
           ByRef lParam As MSLLHOOKSTRUCT
   ) As Integer

   ''' <summary>
   ''' </summary>
   Private MouseHookDelegate As MouseProcDelegate

#End Region

#Region " Enums "

   ''' <summary>
   ''' Indicates a Windows Message related to a mouse events.
   ''' For more info see here:
   ''' http://msdn.microsoft.com/en-us/library/windows/desktop/ff468877%28v=vs.85%29.aspx
   ''' </summary>
   Private Enum MouseWindowsMessages As Integer

       ''' <summary>
       ''' Posted to a window when the cursor moves.
       ''' If the mouse is not captured, the message is posted to the window that contains the cursor.
       ''' Otherwise, the message is posted to the window that has captured the mouse
       ''' </summary>
       WM_MOUSEMOVE = &H200

       ''' <summary>
       ''' Posted when the user presses the left mouse button while the cursor is in the client area of a window.
       ''' If the mouse is not captured, the message is posted to the window beneath the cursor.
       ''' Otherwise, the message is posted to the window that has captured the mouse
       ''' </summary>
       WM_LBUTTONDOWN = &H201

       ''' <summary>
       ''' Posted when the user releases the left mouse button while the cursor is in the client area of a window.
       ''' If the mouse is not captured, the message is posted to the window beneath the cursor.
       ''' Otherwise, the message is posted to the window that has captured the mouse
       ''' </summary>
       WM_LBUTTONUP = &H202

       ''' <summary>
       ''' Posted when the user double-clicks the left mouse button while the cursor is in the client area of a window.
       ''' If the mouse is not captured, the message is posted to the window beneath the cursor.
       ''' Otherwise, the message is posted to the window that has captured the mouse
       ''' </summary>
       WM_LBUTTONDBLCLK = &H203

       ''' <summary>
       ''' Posted when the user presses the right mouse button while the cursor is in the client area of a window.
       ''' If the mouse is not captured, the message is posted to the window beneath the cursor.
       ''' Otherwise, the message is posted to the window that has captured the mouse
       ''' </summary>
       WM_RBUTTONDOWN = &H204

       ''' <summary>
       ''' Posted when the user releases the right mouse button while the cursor is in the client area of a window.
       ''' If the mouse is not captured, the message is posted to the window beneath the cursor.
       ''' Otherwise, the message is posted to the window that has captured the mouse
       ''' </summary>
       WM_RBUTTONUP = &H205

       ''' <summary>
       ''' Posted when the user double-clicks the right mouse button while the cursor is in the client area of a window.
       ''' If the mouse is not captured, the message is posted to the window beneath the cursor.
       ''' Otherwise, the message is posted to the window that has captured the mouse
       ''' </summary>
       WM_RBUTTONDBLCLK = &H206

       ''' <summary>
       ''' Posted when the user presses the middle mouse button while the cursor is in the client area of a window.
       ''' If the mouse is not captured, the message is posted to the window beneath the cursor.
       ''' Otherwise, the message is posted to the window that has captured the mouse
       ''' </summary>
       WM_MBUTTONDOWN = &H207

       ''' <summary>
       ''' Posted when the user releases the middle mouse button while the cursor is in the client area of a window.
       ''' If the mouse is not captured, the message is posted to the window beneath the cursor.
       ''' Otherwise, the message is posted to the window that has captured the mouse
       ''' </summary>
       WM_MBUTTONUP = &H208

       ''' <summary>
       ''' Posted when the user double-clicks the middle mouse button while the cursor is in the client area of a window.
       ''' If the mouse is not captured, the message is posted to the window beneath the cursor.
       ''' Otherwise, the message is posted to the window that has captured the mouse
       ''' </summary>
       WM_MBUTTONDBLCLK = &H209

       ''' <summary>
       ''' Sent to the active window when the mouse's horizontal scroll wheel is tilted or rotated.
       ''' The DefWindowProc function propagates the message to the window's parent.
       ''' There should be no internal forwarding of the message,
       ''' since DefWindowProc propagates it up the parent chain until it finds a window that processes it.
       ''' </summary>
       WM_MOUSEWHEEL = &H20A

   End Enum

   ''' <summary>
   ''' Indicates the whell direction of the mouse.
   ''' </summary>
   Public Enum WheelDirection

       ''' <summary>
       ''' The wheel is moved up.
       ''' </summary>
       WheelUp

       ''' <summary>
       ''' The wheel is moved down.
       ''' </summary>
       WheelDown

   End Enum

#End Region

#Region " Events "

   ''' <summary>
   ''' Occurs when the mouse moves.
   ''' </summary>
   Public Event MouseMove(ByVal MouseLocation As Point)

   ''' <summary>
   ''' Occurs when the mouse left button is pressed.
   ''' </summary>
   Public Event MouseLeftDown(ByVal MouseLocation As Point)

   ''' <summary>
   ''' Occurs when the mouse left button is released.
   ''' </summary>
   Public Event MouseLeftUp(ByVal MouseLocation As Point)

   ''' <summary>
   ''' Occurs when the mouse left button is double-clicked.
   ''' </summary>
   Public Event MouseLeftDoubleClick(ByVal MouseLocation As Point)

   ''' <summary>
   ''' Occurs when the mouse right button is pressed.
   ''' </summary>
   Public Event MouseRightDown(ByVal MouseLocation As Point)

   ''' <summary>
   ''' Occurs when the mouse right button is released.
   ''' </summary>
   Public Event MouseRightUp(ByVal MouseLocation As Point)

   ''' <summary>
   ''' Occurs when the mouse right button is double-clicked.
   ''' </summary>
   Public Event MouseRightDoubleClick(ByVal MouseLocation As Point)

   ''' <summary>
   ''' Occurs when the mouse middle button is pressed.
   ''' </summary>
   Public Event MouseMiddleDown(ByVal MouseLocation As Point)

   ''' <summary>
   ''' Occurs when the mouse middle button is released.
   ''' </summary>
   Public Event MouseMiddleUp(ByVal MouseLocation As Point)

   ''' <summary>
   ''' Occurs when the mouse middle button is double-clicked.
   ''' </summary>
   Public Event MouseMiddleDoubleClick(ByVal MouseLocation As Point)

   ''' <summary>
   ''' Occurs when [mouse move].
   ''' </summary>
   Public Event MouseWheel(ByVal MouseLocation As Point,
                           ByVal WheelDirection As WheelDirection)

#End Region

#Region " Constructors "

   ''' <summary>
   ''' Initializes a new instance of this class.
   ''' </summary>
   Public Sub New()

       MouseHookDelegate = New MouseProcDelegate(AddressOf MouseProc)

       MouseHook = SetWindowsHookEx(HookType.WH_MOUSE_LL,
                                    MouseHookDelegate,
                                    Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly.GetModules()(0)).ToInt32, 0)
   End Sub

#End Region

#Region " Protected Methods "

   ''' <summary>
   ''' Allows an object to try to free resources
   ''' and perform other cleanup operations before it is reclaimed by garbage collection.
   ''' </summary>
   Protected Overrides Sub Finalize()

       UnhookWindowsHookEx(MouseHook)
       MyBase.Finalize()

   End Sub

#End Region

#Region " Private Methods "

   ''' <summary>
   ''' Processes the mouse windows messages and raises it's corresponding events.
   ''' </summary>
   ''' <returns>System.Int32.</returns>
   Private Function MouseProc(ByVal nCode As Integer,
                              ByVal wParam As Integer,
                              ByRef lParam As MSLLHOOKSTRUCT
   ) As Integer

       If nCode = 0 Then

           Select Case wParam

               Case MouseWindowsMessages.WM_MOUSEMOVE
                   RaiseEvent MouseMove(lParam.pt)

               Case MouseWindowsMessages.WM_LBUTTONDOWN
                   RaiseEvent MouseLeftDown(lParam.pt)

               Case MouseWindowsMessages.WM_LBUTTONUP
                   RaiseEvent MouseLeftUp(lParam.pt)

               Case MouseWindowsMessages.WM_LBUTTONDBLCLK
                   RaiseEvent MouseLeftDoubleClick(lParam.pt)

               Case MouseWindowsMessages.WM_RBUTTONDOWN
                   RaiseEvent MouseRightDown(lParam.pt)

               Case MouseWindowsMessages.WM_RBUTTONUP
                   RaiseEvent MouseRightUp(lParam.pt)

               Case MouseWindowsMessages.WM_RBUTTONDBLCLK
                   RaiseEvent MouseRightDoubleClick(lParam.pt)

               Case MouseWindowsMessages.WM_MBUTTONDOWN
                   RaiseEvent MouseMiddleDown(lParam.pt)

               Case MouseWindowsMessages.WM_MBUTTONUP
                   RaiseEvent MouseMiddleUp(lParam.pt)

               Case MouseWindowsMessages.WM_MBUTTONDBLCLK
                   RaiseEvent MouseMiddleDoubleClick(lParam.pt)

               Case MouseWindowsMessages.WM_MOUSEWHEEL
                   Dim wDirection As WheelDirection
                   If lParam.mouseData < 0 Then
                       wDirection = WheelDirection.WheelDown
                   Else
                       wDirection = WheelDirection.WheelUp
                   End If
                   RaiseEvent MouseWheel(lParam.pt, wDirection)

           End Select

       End If

       Return CallNextHookEx(MouseHook, nCode, wParam, lParam)

   End Function

#End Region

End Class

#End Region
#558
Hola

Desarrollé este Snippet para que dibuja una forma cuadrada/rectangular sobre la pantalla para seleccionar un área de la imagen en movimiento, y devuelve los datos de la estructura del rectángulo seleccionado para, posteriormente, poder capturar esa región de la imagen.

Hay 2 formas (que yo sepa al menos) de llevar esto a cabo, una es "congelando" la imagen, y la otra es en tiempo real, yo opté por la segunda opción, a pesar de ser mucho más complicada es lo que se adaptaba a mis necesidades.

Espero que puedan sacar algo de provecho en este código.

Código (vbnet) [Seleccionar]
' ***********************************************************************
' Author           : Elektro
' Last Modified On : 06-03-2014
' ***********************************************************************
' <copyright file="RegionSelector.vb" company="Elektro Studios">
'     Copyright (c) Elektro Studios. All rights reserved.
' </copyright>
' ***********************************************************************

#Region " Usage Examples "

'Public Class Form1

'    Dim SelectedRegion As Rectangle = Rectangle.Empty
'    Dim RegionSelectorIsWorking As Boolean = False

'    Private Sub Button_Click() Handles Button1.Click
'        GetScreenRegion()
'    End Sub

'    Public Sub GetScreenRegion()

'        Dim Callback As RegionSelector.RegionSelectedDelegate

'        Dim Selector As New RegionSelector(BorderColor:=Color.YellowGreen,
'                                           BorderSize:=3,
'                                           backgroundcolor:=Color.YellowGreen,
'                                           BackgroundOpacity:=0.06R)

'        Select Case RegionSelectorIsWorking

'            Case True ' Only one selection at once!
'                Exit Sub

'            Case Else
'                RegionSelectorIsWorking = True
'                Callback = New RegionSelector.RegionSelectedDelegate(AddressOf SelectionFinished)

'                With Selector
'                    .Callback = Callback
'                    .Show()
'                End With

'        End Select

'        ' Don't do any stuff here... do it in Rectangle Drawn...

'    End Sub

'    Private Sub SelectionFinished(ByVal Region As Rectangle)

'        RegionSelectorIsWorking = False ' Allow draw again.
'        Me.SelectedRegion = Region

'        Dim sb As New System.Text.StringBuilder
'        With sb
'            .AppendLine("Selected Area")
'            .AppendLine()
'            .AppendLine("· Size")
'            .AppendLine(String.Format("Width: {0}", CStr(SelectedRegion.Width)))
'            .AppendLine(String.Format("Height: {0}", CStr(SelectedRegion.Height)))
'            .AppendLine()
'            .AppendLine("· Coordinates")
'            .AppendLine(String.Format("Top: {0}", CStr(SelectedRegion.Top)))
'            .AppendLine(String.Format("Left: {0}", CStr(SelectedRegion.Left)))
'            .AppendLine(String.Format("Right: {0}", CStr(SelectedRegion.Right)))
'            .AppendLine(String.Format("Bottom: {0}", CStr(SelectedRegion.Bottom)))
'            .AppendLine()
'        End With

'        MessageBox.Show(sb.ToString)

'    End Sub

'End Class

#End Region

''' <summary>
''' Selects a region on the Screen.
''' </summary>
Public NotInheritable Class RegionSelector : Inherits Form

#Region " Delegates "

   ''' <summary>
   ''' Delegate RegionSelectedDelegate.
   ''' </summary>
   ''' <param name="Region">The region.</param>
   Public Delegate Sub RegionSelectedDelegate(ByVal Region As Rectangle)

#End Region

#Region " Properties "

   ''' <summary>
   ''' Callback to be invoked when drawing is done...
   ''' </summary>
   ''' <value>Delegate of Region Selected</value>
   Public Property Callback As RegionSelectedDelegate = Nothing

   ''' <summary>
   ''' Gets or sets the border size of the region selector.
   ''' </summary>
   ''' <value>The size of the border.</value>
   Public Property BorderSize As Integer = 2

   ''' <summary>
   ''' Gets or sets the border color of the region selector.
   ''' </summary>
   ''' <value>The color of the border.</value>
   Public Property BorderColor As Color = Color.Red

   ''' <summary>
   ''' Gets or sets the background color of the region selector.
   ''' </summary>
   ''' <value>The color of the border.</value>
   Public Property BackgroundColor As Color = Color.RoyalBlue

   ''' <summary>
   ''' Gets or sets the background opacity of the region selector.
   ''' </summary>
   ''' <value>The color of the border.</value>
   Public Property BackgroundOpacity As Double = 0.08R

   ''' <summary>
   ''' Gets the rectangle that contains the selected region.
   ''' </summary>
   Public ReadOnly Property SelectedRegion As Rectangle
       Get
           Return Me.DrawRect
       End Get
   End Property

#End Region

#Region " Objects "

   ''' <summary>
   ''' Indicates the initial location when the mouse left button is clicked.
   ''' </summary>
   Private InitialLocation As Point = Point.Empty

   ''' <summary>
   ''' The rectangle where to draw the region.
   ''' </summary>
   Public DrawRect As Rectangle = Rectangle.Empty

   ''' <summary>
   ''' The Graphics object to draw on the screen.
   ''' </summary>
   Private ScreenGraphic As Graphics = Graphics.FromHwnd(IntPtr.Zero)

   ''' <summary>
   ''' Indicates the Rectangle Size.
   ''' </summary>
   Dim DrawSize As Size

   ''' <summary>
   ''' Indicates the draw form.
   ''' </summary>
   Dim DrawForm As Form

   ''' <summary>
   ''' Indicates whether the RegionSelector is busy drawing the rectangle.
   ''' </summary>
   Public IsDrawing As Boolean = False

#End Region

#Region " Constructors "

   ''' <summary>
   ''' Initializes a new instance of the <see cref="RegionSelector"/> class.
   ''' </summary>
   Public Sub New()
   End Sub

   ''' <summary>
   ''' Initializes a new instance of the <see cref="RegionSelector" /> class.
   ''' </summary>
   ''' <param name="BorderColor">Indicates the border color of the region selector.</param>
   ''' <param name="BorderSize">Indicates the border size of the region selector.</param>
   ''' <param name="BackgroundColor">Indicates the background color of the region selector.</param>
   ''' <param name="BackgroundOpacity">Indicates the background opacity size of the region selector.</param>
   Public Sub New(Optional ByVal BorderColor As Color = Nothing,
                  Optional ByVal BorderSize As Integer = 2,
                  Optional ByVal BackgroundColor As Color = Nothing,
                  Optional ByVal BackgroundOpacity As Double = 0.1R)

       If BorderColor = Nothing _
       OrElse BorderColor = Color.Transparent Then
           BorderColor = Color.Red
       End If

       If BackgroundColor = Nothing _
       OrElse BackgroundColor = Color.Transparent Then
           BackgroundColor = Color.Black
       End If

       Me.BorderSize = BorderSize
       Me.BorderColor = BorderColor
       Me.BackgroundOpacity = BackgroundOpacity
       Me.BackgroundColor = BackgroundColor

   End Sub

#End Region

#Region " Event Handlers "

   ''' <summary>
   ''' Handles the Load event of the RegionSelector.
   ''' </summary>
   ''' <param name="sender">The source of the event.</param>
   ''' <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
   Private Sub RegionSelector_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load

       Me.SuspendLayout()

       Me.AutoScaleMode = AutoScaleMode.None
       Me.BackColor = Me.BackgroundColor
       Me.BackgroundImageLayout = ImageLayout.None
       Me.CausesValidation = False
       Me.ClientSize = New Size(0, 0)
       Me.ControlBox = False
       Me.Cursor = Cursors.Cross
       Me.DoubleBuffered = True
       Me.FormBorderStyle = FormBorderStyle.None
       Me.MaximizeBox = False
       Me.MinimizeBox = False
       Me.Name = "RegionSelector"
       Me.Opacity = Me.BackgroundOpacity
       Me.ShowIcon = False
       Me.ShowInTaskbar = False
       Me.SizeGripStyle = SizeGripStyle.Hide
       Me.StartPosition = FormStartPosition.CenterScreen
       Me.TopMost = False
       Me.WindowState = FormWindowState.Maximized

       Me.ResumeLayout(False)

       Me.DrawForm = New DrawingRegionClass(Me)
       With DrawForm
           .AutoScaleMode = AutoScaleMode.None
           .BackColor = Color.Tomato
           .BackgroundImageLayout = ImageLayout.None
           .ControlBox = False
           .FormBorderStyle = FormBorderStyle.None
           .MaximizeBox = False
           .MinimizeBox = False
           .ShowIcon = False
           .ShowInTaskbar = False
           .SizeGripStyle = SizeGripStyle.Hide
           .StartPosition = FormStartPosition.CenterScreen
           .TopLevel = True
           .TopMost = True
           .TransparencyKey = Color.Tomato
           .WindowState = FormWindowState.Maximized
       End With

       Me.AddOwnedForm(Me.DrawForm)
       Me.DrawForm.Show()

   End Sub

   ''' <summary>
   ''' Raises the <see cref="E:System.Windows.Forms.Control.MouseDown" /> event.
   ''' </summary>
   ''' <param name="e">A <see cref="T:System.Windows.Forms.MouseEventArgs" /> that contains the event data.</param>
   Protected Overrides Sub OnMouseDown(ByVal e As MouseEventArgs)

       If e.Button = MouseButtons.Left Then
           Me.InitialLocation = e.Location
           Me.IsDrawing = True
       End If

   End Sub

   ''' <summary>
   ''' Raises the <see cref="E:System.Windows.Forms.Control.MouseUp" /> event.
   ''' </summary>
   ''' <param name="e">A <see cref="T:System.Windows.Forms.MouseEventArgs" /> that contains the event data.</param>
   Protected Overrides Sub OnMouseUp(ByVal e As MouseEventArgs)

       Me.IsDrawing = False
       Callback.Invoke(SelectedRegion)
       Me.Close() ' Must be called last.

   End Sub

   ''' <summary>
   ''' Raises the <see cref="E:System.Windows.Forms.Control.MouseMove" /> event.
   ''' </summary>
   ''' <param name="e">A <see cref="T:System.Windows.Forms.MouseEventArgs" /> that contains the event data.</param>
   Protected Overrides Sub OnMouseMove(ByVal e As MouseEventArgs)

       If Me.IsDrawing Then

           Me.DrawSize = New Size(e.X - Me.InitialLocation.X, e.Y - Me.InitialLocation.Y)
           Me.DrawRect = New Rectangle(Me.InitialLocation, Me.DrawSize)

           If Me.DrawRect.Height < 0 Then
               Me.DrawRect.Height = Math.Abs(Me.DrawRect.Height)
               Me.DrawRect.Y -= Me.DrawRect.Height
           End If

           If Me.DrawRect.Width < 0 Then
               Me.DrawRect.Width = Math.Abs(Me.DrawRect.Width)
               Me.DrawRect.X -= Me.DrawRect.Width
           End If

           Me.DrawForm.Invalidate()

       End If

   End Sub

#End Region

End Class

''' <summary>
''' Class DrawingRegionClass. This class cannot be inherited.
''' </summary>
Friend NotInheritable Class DrawingRegionClass : Inherits Form

   Private DrawParent As RegionSelector

   Public Sub New(ByVal Parent As Form)

       Me.DrawParent = Parent

   End Sub

   Protected Overrides Sub OnPaintBackground(ByVal e As PaintEventArgs)

       Dim Bg As Bitmap
       Dim Canvas As Graphics

       If Me.DrawParent.IsDrawing Then

           Bg = New Bitmap(Width, Height)
           Canvas = Graphics.FromImage(Bg)
           Canvas.Clear(Color.Tomato)

           Using pen As New Pen(Me.DrawParent.BorderColor, Me.DrawParent.BorderSize)
               Canvas.DrawRectangle(pen, Me.DrawParent.DrawRect)
           End Using

           Canvas.Dispose()
           e.Graphics.DrawImage(Bg, 0, 0, Width, Height)
           Bg.Dispose()

       Else
           MyBase.OnPaintBackground(e)
       End If

   End Sub

End Class



Complemento adicional:

Código (vbnet) [Seleccionar]
    ' Take Region ScreenShot
    ' ( By Elektro )
    '
    ' Usage Examples :
    '
    ' Dim RegionScreenShot As Bitmap = TakeRegionScreenShot(New Point(0, 0), New Size(256, 256))
    ' Dim RegionScreenShot As Bitmap = TakeRegionScreenShot(New Rectangle With {.Location = Point.Empty, .Size = New Size(256, 256)})
    ' PictureBox1.BackgroundImage = RegionScreenShot
    ' RegionScreenShot.Save("C:\RegionScreenShot.png", Imaging.ImageFormat.Png)
    '
    ''' <summary>
    ''' Takes an image screenshot of an specific screen region.
    ''' </summary>
    ''' <param name="Coordinates">
    ''' The X-coordinate is the point at the upper-left corner of the region.
    ''' The Y-coordinate is the point at the upper-left corner of the region.
    ''' </param>
    ''' <param name="Size">Indicates the size of the area to be transferred.</param>
    ''' <param name="PixelFormat">Indicates the Bitmap pixel format.</param>
    ''' <returns>Bitmap.</returns>
    Private Function TakeRegionScreenShot(ByVal Coordinates As Point,
                                          ByVal [Size] As Size,
                                          Optional ByVal [PixelFormat] As Imaging.PixelFormat =
                                                                          Imaging.PixelFormat.Format24bppRgb) As Bitmap

        Using ScreenImage As New Bitmap([Size].Width, [Size].Height, [PixelFormat])

            Using ScreenGraphics As Graphics = Graphics.FromImage(ScreenImage)

                ScreenGraphics.CopyFromScreen(Coordinates, Point.Empty, ScreenImage.Size)

            End Using ' ScreenGraphics

            Return CType(ScreenImage.Clone, Bitmap)

        End Using ' ScreenImage

    End Function

    ''' <summary>
    ''' Takes an image screenshot of an specific screen region.
    ''' </summary>
    ''' <param name="Region">Indicates a Rectangle structure that contains the region coordinates and the size.</param>
    ''' <param name="PixelFormat">Indicates the Bitmap pixel format.</param>
    ''' <returns>Bitmap.</returns>
    Private Function TakeRegionScreenShot(ByVal [Region] As Rectangle,
                                          Optional ByVal [PixelFormat] As Imaging.PixelFormat =
                                                                          Imaging.PixelFormat.Format24bppRgb) As Bitmap

        Return TakeRegionScreenShot([Region].Location, [Region].Size, [PixelFormat])

    End Function
#559
Bueno pues empecé haciendo un código muy sencillo (quiero decir, muy pequeño) y acabé expandiendo su funcionalidad...

Se trata de una función que cuenta los caracteres de agrupación dentro de un String, comprueba si hay agrupaciones abiertas o vacias, y la cantidad de agrupaciones abiertas y cerradas hay, y obtiene sus índices de posición en el string, la función devuelve todos estos datos gracias a una Class personalizado para la ocasión.

No es gran cosa, simplemente quise compartirlo.

Espero que a alguien le ayude.

Código (vbnet) [Seleccionar]
   ' Count Agrupations In String
   ' // By Elektro
   '
   ' Example Usages :
   '
   'Private Sub Test()
   '
   '    Dim InputStrings As String() =
   '        {
   '            "(This) is (good)",
   '            "This (is (good))",
   '            "This is good",
   '            "This is (bad))",
   '            "This is (bad",
   '            "This is bad)",
   '            "This is bad)("
   '        }
   '
   '    Dim AgrupationChars As New Tuple(Of Char, Char)("(", ")")
   '
   '    For Each InputString As String In InputStrings
   '
   '        Dim Info As AgrupationCharsInfo = Me.CountAgrupationsInString(AgrupationChars, InputString)
   '
   '        Dim sb As New System.Text.StringBuilder
   '
   '        With sb
   '
   '            .AppendLine(String.Format("Input String: {0}", Info.InputString))
   '            .AppendLine(String.Format("Agrupation Characters: {0}{1}", Info.AgrupationChars.Item1,
   '                                                                       Info.AgrupationChars.Item2))
   '
   '            .AppendLine()
   '            .AppendLine(String.Format("String has closed agrupations?: {0}", Info.StringHasClosedAgrupations))
   '            .AppendLine(String.Format("String has opened agrupations?: {0}", Info.StringHasOpenedAgrupations))
   '
   '            .AppendLine()
   '            .AppendLine(String.Format("Closed Agrupations Count: {0}", Info.CountClosedAgrupations))
   '            .AppendLine(String.Format("Opened Agrupations Count: {0}", Info.CountOpenedAgrupations))
   '
   '            .AppendLine()
   '            .AppendLine("Closed Agrupations Indexes:")
   '            For Each Item As Tuple(Of Integer, Integer) In Info.ClosedAgrupationsIndex
   '                .AppendLine(String.Format("Start: {0}, End: {1}",
   '                                          CStr(Item.Item1), CStr(Item.Item2)))
   '            Next Item
   '
   '            .AppendLine()
   '            .AppendLine(String.Format("Opened Agrupations Indexes: {0}",
   '                                      String.Join(", ", Info.OpenedAgrupationsIndex)))
   '
   '        End With '/ sb
   '
   '        MessageBox.Show(sb.ToString, "Agrupations Information",
   '                        MessageBoxButtons.OK, MessageBoxIcon.Information)
   '
   '    Next InputString
   '
   'End Sub

   ''' <summary>
   ''' Retrieves info about the closed and opened agrupation characters inside a String.
   ''' </summary>
   ''' <param name="AgrupationChars">Indicates the characters to determine agrupations.</param>
   ''' <param name="InputString">Indicates the string where to count the agrupations.</param>
   ''' <returns>AgrupationCharsInfo.</returns>
   ''' <exception cref="System.Exception">'InputString' parameter cannot be an empty String..</exception>
   Public Function CountAgrupationsInString(ByVal AgrupationChars As Tuple(Of Char, Char),
                                            ByVal InputString As String) As AgrupationCharsInfo

       If String.IsNullOrEmpty(InputString) OrElse String.IsNullOrWhiteSpace(InputString) Then
           Throw New Exception("'InputString' parameter cannot be an empty String.")
       End If

       Dim CharStack As New Stack(Of Integer)
       Dim Result As New AgrupationCharsInfo

       With Result

           .InputString = InputString
           .AgrupationChars = New Tuple(Of Char, Char)(AgrupationChars.Item1, AgrupationChars.Item2)

           For i As Integer = 0 To InputString.Length - 1

               Select Case InputString(i)

                   Case .AgrupationChars.Item1
                       CharStack.Push(i)
                       .OpenedAgrupationsIndex.Add(i)
                       .CountOpenedAgrupations += 1

                   Case .AgrupationChars.Item2
                       Select Case CharStack.Count

                           Case Is = 0
                               .CountOpenedAgrupations += 1
                               .OpenedAgrupationsIndex.Add(i)

                           Case Else
                               .CountClosedAgrupations += 1
                               .CountOpenedAgrupations -= 1
                               .ClosedAgrupationsIndex.Add(Tuple.Create(Of Integer, Integer)(CharStack.Pop, i))
                               .OpenedAgrupationsIndex.RemoveAt(.OpenedAgrupationsIndex.Count - 1)

                       End Select '/ CharStack.Count

               End Select '/ InputString(i)

           Next i

           .StringHasClosedAgrupations = .CountClosedAgrupations <> 0
           .StringHasOpenedAgrupations = .CountOpenedAgrupations <> 0

       End With '/ Result

       Return Result

   End Function

   ''' <summary>
   ''' Stores info about closed and opened agrupations of chars in a String.
   ''' </summary>
   Public NotInheritable Class AgrupationCharsInfo

       ''' <summary>
       ''' Indicates the input string.
       ''' </summary>
       ''' <value>The input string.</value>
       Public Property InputString As String = String.Empty

       ''' <summary>
       ''' Indicates the agrupation characters.
       ''' </summary>
       ''' <value>The agrupation characters.</value>
       Public Property AgrupationChars As Tuple(Of Char, Char) = Nothing

       ''' <summary>
       ''' Determines whether the input string contains closed agrupation.
       ''' </summary>
       Public Property StringHasClosedAgrupations As Boolean = False

       ''' <summary>
       ''' Determines whether the input string contains opened agrupations.
       ''' </summary>
       Public Property StringHasOpenedAgrupations As Boolean = False

       ''' <summary>
       ''' Indicates the total amount of closed agrupations.
       ''' </summary>
       ''' <value>The closed agrupations count.</value>
       Public Property CountClosedAgrupations As Integer = 0

       ''' <summary>
       ''' Indicates the total amount of opened agrupations.
       ''' </summary>
       ''' <value>The opened agrupations count.</value>
       Public Property CountOpenedAgrupations As Integer = 0

       ''' <summary>
       ''' Indicates the closed agrupations index positions in the string.
       ''' </summary>
       ''' <value>The closed agrupations index positions.</value>
       Public Property ClosedAgrupationsIndex As New List(Of Tuple(Of Integer, Integer))

       ''' <summary>
       ''' Indicates the opened agrupations index positions in the string.
       ''' </summary>
       ''' <value>The opened agrupations index positions.</value>
       Public Property OpenedAgrupationsIndex As New List(Of Integer)

   End Class '/ AgrupationCharsInfo
#560






DESCRIPCIÓN:

Una simple aplicacición para subir imagenes (de forma anonima) usando la API de imgur.

La aplicación permite arrastrar y soltar archivos al Form, así como iniciar el programa cargando una imagen mediante argumentos commandline,
y el instalador que viene incluido en la descarga permite asociar los archivos de imagen soportados para automatizar aún más la tarea.

Nota para programadores:
Los eventos y los controles de errores en la Class ImgurAPI (así como los event-handlers suscritos a dichos eventos, en el Form principal) es algo que dejé inacabado y en fase de pruebas.






IMÁGENES:

(lo sé, es un poco feo)

   






DESCARGA:
-> http://www.mediafire.com/?12bdq6o65owy8lt

Incluye source, compilación, instalador, y portable.[/s]
#561
Elektro ErrorDialog




Descripción:

Esto es simplemente un Form propio para controlar excepciones, lo pueden añadir a sus proyectos como una plantilla.




Imágenes:

(En tiempo de ejecución)



(En diseño)





Inspiración:

Para desarrollar este Form me inspiré en la idea y en el diseño del desarrollador de la aplicación "WinToolkit" (Legolash2o), aunque su diálogo está escrito en C#...y no he visto el source, pero me gustó la idea y el diseño, además de esto examiné a fondo y comparé otros diseños y códigos fuente de la página CodeProject.






Demostración:
[youtube=640,360]http://www.youtube.com/watch?v=rIt_4FrdjMM[/youtube]




Ejemplos de uso:

(Ejemplo de uso básico)
Código (VBNET) [Seleccionar]
   Private Shadows Sub Shown(sender As Object, e As EventArgs) _
   Handles MyBase.Shown

       Try
           Dim Url As New Uri(String.Empty)

       Catch ex As Exception

           Using ErrorDialog As New ErrorDialog(ex, sender)
               ErrorDialog.ShowDialog()
           End Using

       End Try

   End Sub


(Ejemplo de uso avanzado)
Código (VBNET) [Seleccionar]
Public Class Form1

   Public Sub New()

       ' This call is required by the designer.
       InitializeComponent()

       ' Catches Managed Exceptions.
       AddHandler AppDomain.CurrentDomain.FirstChanceException, AddressOf Application_ManagedException

       ' Catches Unhandled Exceptions.
       AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf Application_UnhandledException

       ' Catches Thread Exceptions.
       AddHandler Application.ThreadException, AddressOf Application_ThreadException

   End Sub

   ''' <summary>
   ''' Handles the 'UnhandledException' event of the Application.
   ''' </summary>
   ''' <param name="sender">The source of the event.</param>
   ''' <param name="e">The <see cref="UnhandledExceptionEventArgs"/> instance containing the event data.</param>
   Private Sub Application_UnhandledException(ByVal sender As Object, ByVal e As UnhandledExceptionEventArgs)

       Using ErrorDialog As New ErrorDialog(DirectCast(e.ExceptionObject, Exception), Me)
           ErrorDialog.ShowDialog()
       End Using

   End Sub

   ''' <summary>
   ''' Handles the 'FirstChanceException' event of the Application.
   ''' </summary>
   ''' <param name="sender">The source of the event.</param>
   ''' <param name="e">The <see cref="Runtime.ExceptionServices.FirstChanceExceptionEventArgs" /> instance containing the event data.</param>
   Private Sub Application_ManagedException(ByVal sender As Object, ByVal e As Runtime.ExceptionServices.FirstChanceExceptionEventArgs)

       Using ErrorDialog As New ErrorDialog(e.Exception, Me)
           ErrorDialog.ShowDialog()
       End Using

   End Sub

   ''' <summary>
   ''' Handles the 'ThreadException' event of the Application.
   ''' </summary>
   ''' <param name="sender">The source of the event.</param>
   ''' <param name="e">The <see cref="Threading.ThreadExceptionEventArgs"/> instance containing the event data.</param>
   Private Sub Application_ThreadException(sender As Object, e As Threading.ThreadExceptionEventArgs)

       Using ErrorDialog As New ErrorDialog(e.Exception, Me)
           ErrorDialog.ShowDialog()
       End Using

   End Sub

End Class





Descarga:

http://www.mediafire.com/download/f6caca6bcc9wbwc/Elektro+ErrorDialog.rar
#562
6.0
· Introducción al BootMenu

El BootMenu es un menú que aparece al bootear un PC (durango la fase POST) al pulsar una tecla específica (dependiendo dle PC, puede ser Escape, Delete, F10, F11, F12, etc.) y nos da una serie de opciones:


Bien, pues en esta parte del tutorial ¡aprenderemos a crear un BootMenu para arrancar un DVD de Windows!:



¿Que herramientas necesitaremos?
· EasyBoot > http://www.ezbsystems.com/easyboot/
· Una ISO de Windows.
· Opcionalmente, imágenes de aplicaciones bootables (ISO, IMG, BIF).
· Opcionalmente, una VM para testear el Bootmenu.






6.1
· Imágenes Bootables y software para Windows

Hay varias utilidades para diseñar y crear un Bootmenu bajo Windows, algunas son:
· YUMI
· SARDU
· XBoot
· Aero Studio 2008
· Ultimate BootCD
· EasyBoot

De entre todas ellas he escogido para este tutorial EasyBoot y esta parte de la guia será como un pequeño tutorial básico para dicha aplicación, ya que es la que mejor relación tiene de personalización y facilidad de uso, pero si quieren probar un editor más personalizable y complejo les recomiendo Aero Studio 2008.

El Software que podemos añadir al Bootmenu debe ser Bootable, este Software se distribuye en imagenes IMG (disquettes), imagenes ISO (CD's) o imágenes BIF. (pero quien sepa hacerlo también puede crear un entorno WinPE para añadir cualquier software).

Estas son algunas aplicaciones Bootables:
· EaseUS Partition Master WinPE Edition
 Software para manejar las particiones.

· Darik's Boot and Nuke (DBAN)
 Software para wipear un disco duro (ZeroFill, rellenarlo con ceros todos los sectores para destruir cualquier información recuperable con herramientas como Recuva)

· Kon-Boot
 Software para resetear la contraseña de la cuenta de Windows.

· Norton Ghost
 Software para clonar discos duros y otras operaciones de backup.

· FreeDos
 Sistema operativo orientado a DOS y compatible con discos NTFS.

· PassMark MemTest86
 Software para testear los dispositivos RAM del sistema.

· Hiren's BootCD

· Avira Rescue Disk

· Acronis

· Microsoft DART (Diagnostics And Recovery Tools)
 Este Software va incluido en el paquete MODP (Microsoft Desktop Optimization Pack) actualmente solo es descargable para subscriptores de MODP (pero no hace falta decir que también es descargable por otras vías...como torrents), requiere tener instalado el entorno WinPE (que se puede instalar desde el WAIK/WADK) y obviamente necesitamos usar la versión esecífica para la imagen de Windows que queramos recuperar, es decir, por ejemplo, un DART 8.1 no va a funcionar para recuperar Windows 7. En este ejemplo yo usaré el DART 8.1 (para Windows 8.1) que viene incluido en el MODP 2013 R2, la ISO bootable de DART se debe crear desde el propio DART.

 DART Este es el entorno WinRE (Windows Recovery Environment) de cualquier SO Windows (Ese menú que al bootear nos da unas opciones de recuperación del SO), pero es un entorno modificado y más avanzado, con las siguientes opciones de recuperación (para Windows 8.1):





PD: Con dichas utilidades no será necesario añadir otras imagenes Bootables a nuestro Bootmenu como DBAN o Kon-Boot.






6.2
· Crear el Bootmenu usando EasyBoot (Imagenes Bootables)

Instalamos EasyBoot (yo lo haré en la ruta C:\EasyBot), lo abrimos, y nos aparecerá una plantilla por defecto del Bootmenu:


En la ventana movil de la izquierda nos aparecen todas las opciones personalizables, y en la ventana principal es donde podemos previsualizar las imágenes y los controles (además de moverlos y redimensionarlos, cosa que podemos hacer en las dos ventanas)

Lo primero que haremos es añadir las imagenes bootables y los archivos de instalación de Windows, esto hay que hacerlo de forma manual.

Supongo que ya tienen una ISO de Windows 7/8, así que deben extraer el contenido de la ISO a la carpeta C:\EasyBot\Disk1 (el archivo desatendido también, si lo tuvieran), entonces deberiamos obtener una estructura de archivos así:


Ahora nos dirigimos a la carpeta C:\EasyBot\Disk1\EzBoot y veremos un archivo con nombre "bootmgr", lo eliminamos, y copiamos en esta carpeta el archivo "bootmgr" y "bootmgr.efi" (en caso de haberlo) del DVD de Windows:


En la misma carpeta creamos una carpeta con el nombre "Bootable Tools":


Adentro de la nueva carpeta añadimos las imágenes Bootables que hayamos descargado previamente (si no tenemos ninguna nos saltamos este paso y eliminamos la carpeta que hemos creado):







6.3
· Crear el Bootmenu usando EasyBoot (Bitmaps)

Ahora vamos a reemplazar las imagenes del menú, para hacerlo volvemos a la carpeta anterior y vemos que hay 4 imágenes:


La imagen BACK.bmp se utiliza como fondo del Bootmenú, la imagen logo.bmp se muestra justo antes de cargar el Bootmenu, las otras dos imagenes no nos interesan en este tutorial.

Las imágenes son Bitmaps y deben tener unas dimensiones de 640x480 y una profundidad de 256 colores (se pemite optimizar el color de las imagenes usando el método de Floyd Steinberg), la imagen eblogo.bmp tiene unas dimensiones de 320x200.

Las reemplazamos:


Y reiniciamos el programa:


Ahora ya estamos listos para poder hacer el resto de modificaciones desde la inaterface del programa.







6.4
· Crear el Bootmenu usando EasyBoot (Controles)

Un Bootmenu está compuesto por 3 controles, Botones, Eqtiquetas (Labels), y Layouts.
Nota: No confundir un label con el texto de un botón.




La interface de edición de controles del programa no es muy amistosa, así que voy a explicarlo:
· Para seleccionar un control hacemos click izquierdo.
· Para mover un control debemos hacer doble click sobre él, y para soltar el control hacemos click derecho.
· Para redimensionar un control debemos hacer triple-click, y terminar haciendo click derecho.
· Para crear un control de un tipo específico, primero seleccionamos la pestaña del control (en el menú de la izquierda), y luego hacemos click derecho en el menú de previsualización.
· Si queremos cancelar una operación usamos la tecla ESCAPE antes de terminar.


Ok, seleccionamos el label de arriba del todo (el del título) para editarlo en el menú de la izquierda:



Seleccionamos los layouts para colorearlos:



Seleccionamos los botones para cambiarles el nombre y colorearlos:




Por último, creamos un nuevo botón con el texto "[5] Salir", lo añadimos abajo de los demás botones, y agrandamos el tamaño del layout de detrás.


Si lo hemos hecho todo bien tendremos algo así:








6.5
· Crear el Bootmenu usando EasyBoot (Menues)

Bien, ahora repasemos los menues...

En la pestaña "Archivo" marcamos estas opciones:


En "Tiempo de espera" podemos especificar el tiempo de espera para que el Bootmenu escoja una opción por defecto.
En "Tecla Aceleradora" podemos especificar si una opción del menú se debe seleccionar o si además se debe ejecutar al pulsar la tecla asociada a esa opción.
En "Tipo de menú" podemos especificar si se trata de un submenu, en este ejemplo estamos haciendo un único menú de una página.

En la pestaña "Disposición" podemos personalizar las propiedades de los layouts:


1 = Las coordenadas y el tamaño del control.
2 = Los colores del control.
3 = El borde del control..
4 = El orden de las capas.

En la pestña "Texto" podemos personalizar las propiedades de los Labels:



1 = Las coordenadas y el tamaño del control.
2 = El color de texto.
3 = La alineación del texto en el "Canvas".
4 = El texto del control.
5 = El orden de las capas.

En la pestña "Menú" podemos personalizar las propiedades de los Botones:



1 = El comando asociado al botón.
2 = El texto del control.
3 = Los colores del control.
4 = Las coordenadas y el tamaño del control.
5 = Indica si el botón es la opción por defecto, esto quiere decir, que si el tiempo de espera se agota, esta opción es la que se ejecutará.
6 = Indica la tecla con la que podemos Seleccionar/ejecutar la opción.
7 = El orden de los botones.

En la pestaña "Miscelaneos" podemos personalizar otras características del Bootmenu:



1 = Especificar una tecla para ejecutar un comando.
2 = Especifica el comando que se ejecutará al presionar la tecla.
3 = El orden de los comandos.
4 = Especifica si se debe mostrar una barra de progreso (sirve para indicar el progreso de la cuenta atrás).
5 = La colorización de la ProgressBar.
6 = Las coordenadas y el tamaño de la ProgressBar.
7 = Determina si se debe mostrar la cuenta atrás (el label del contador).
8 = Las coordenadas del label de la cuenta atrás.
9 = La colorización del label de la cuenta atrás.






6.6
· Crear el Bootmenu usando EasyBoot (Comandos)

Solo nos falta asociar los comandos a nuestros botones.

Cada botón debe tener un comando asociado para saber que imagen debe Bootear.

El comando para Bootear una imagen es RUN, seguido de la ruta relativa de nuestra imagen.
Nota: No es necesario encerrar rutas con espacios en el nombre.

Ejemplo:
Run Bootable Images\WinPE.iso




Otros comandos que conozco son:

run bootmgr: Inicia la instalación de Windows.
reboot: Reinicia el PC.
shutown: Apaga el PC.
quit: Sale del Bootmenu.
swap;boot 80: Bootea la primera unidad de disco duro (para salir del Bootmenu e iniciar Windows con normalidad).
swap;boot 0: Bootea la primera unidad de disquette.
bootinfotable;run IMAGEN.bif: Bootea una imagen BIF.

Entonces, seleccionamos los 4 primeros botones que deben Bootear una imagen, y especificamos los comandos (por orden):


Comando boton 1: Run bootmgr
Comando botón 2: Run Bootable Tools\MemTest86.iso
Comando botón 3: Run Bootable Tools\Kon-Boot.img
Comando botón 4: Run Bootable Tools\DART.iso

Seleccionamos el último botón:


Y especificamos el comando swap;boot 80 para proseguir el booteo del SO Host con normalidad.
Marcamos el botón como la opción por defecto, esto es necesario porque la instalación de Windows reinicia el PC varias veces... y así saldrá del BootMenu con normalidad y proseguirá con la instalación.






6.7
· Finalizar el Bootmenu usando EasyBoot

Nos dirigimos a la pestaña "Archivo" del menú de la ventana de la izquierda, clickamos en la opción "Hacer ISO"

Dejamos todas las opciones como están.
Y en las 2 últimas opciones de abajo, especificamos la etiqueta del DVD, y la ruta donde guardar nuestra nueva ISO:


Y clickamos en el botón "Hacer":


Por último, sugiero testear la ISO en una máquina virtual.








6.8
· Plantillas para EasyBoot


Aquí dejo el proyecto que he creado para el ejemplo:
http://www.mediafire.com/download/djggak2vjbq2u9n/Windows_8.1_Blue_Space_Edition.rar


Y otro proyecto que tengo:
http://www.mediafire.com/download/nqwjgswr9n3igno/Windows_8.1_BootMenu_by_Elektro.rar



Nota: No incluyen las imágenes Bootables.


¡ Video Demostración !

[youtube=640,360]http://www.youtube.com/watch?v=IWdOnKQ53gU[/youtube]

( Si te pone que el video no está disponbile, clicka en "Verlo en Youtube" )
#563
Este Script sirve para automatizar la tarea de montar una imagen WIM de Windows y reemplazar recursos de imágenes (bmp/ico) en las librerías de recursos de la instalación de Windows, así como también sirve para reemplazar archivos.

Ejemplo de los recursos a los que me refiero:



Se necesitan unos requisitos y dependencias para usar este Script:
· Saber de lo que estoy hablando.
· Conocer el nombre de los recursos que quieres reemplazar y disponer de tus imágenes ya modificados (obviamente).
· Dism e ImageX (WAIK/WADK).
· Anolis Resourcer > http://www.anol.is/resourcer/


Las instrucciones de uso y un extenso tutorial lo publiqué en este otro tema: http://foro.elhacker.net/windows/guia_de_personalizacion_de_imagenes_de_implementacion_de_windows_wim_parte_4-t412468.0.html así que lo haré de nuevo de manera resumida: solo tienen que escribir en un archivo de texto delimitando por puntoycomas los recursos que quieren reemplazar, el nombre del recurso y el índice, así como los archivos que quieran reemplazar, y configurar las variables documentadas del Script (La ubicación de la imagen, el directorio de montaje, etc...)

Nota: Ver el ejemplo del archivo delimitado dentro del enlace de abajo o en las instrucciones extendidas del enlace de arriba.

Todo lo necesario está incluido en este archivo comprimido:
http://www.mediafire.com/download/ktzms7i09qt4n2b/wim+resource+replacer+0.2.rar

Imágenes:


(Código corregido, el otro que subí estaba incompleto)
WIM Resource Replacer.cmd
Código (dos) [Seleccionar]
@Echo OFF



REM =================
REM Console Settings:
REM =================

Title WIM Resource Replacer - By Elektro
Mode Con Cols=150 Lines=50
CHCP 1252 1>NUL & REM Windows-1252, Spanish-Latin.



REM =====
REM Info:
REM =====

Echo+
Echo  --------------------------------------------------------------------------------------------------
Echo  This script mounts a Windows Image ^(WIM^) and then replaces image resources inside resource files
Echo  --------------------------------------------------------------------------------------------------
Echo+



REM ====================
REM User defined values:
REM ====================

REM This value indicates whether the Windows Image should be mounted.
REM True  = 'DISM' will try to mount the 'WIM' image.
REM False = 'DISM' will not try to mount the WIM image.
REM Set this value to 'FALSE' if the 'WIM' image is already mounted in the specified mount directory,
REM Otherwise, keep it as 'TRUE'.
Set "MountImage=True"

REM This value indicates whether the Windows Image should be unmounted at the end.
REM True  = 'DISM' will try to unmount the 'WIM' image.
REM False = 'DISM' will not try to unmount the WIM image.
REM Set this value to 'FALSE' if you want to keep the image mounted to make other changes,
REM Otherwise, keep it as 'TRUE'.
Set "UnmountImage=True"

REM This value indicates whether the Windows Image should be rebuilt at the end.
REM True  = 'ImageX' will try to rebuild the 'WIM' image.
REM False = 'ImageX' will keep the 'WIM' image as is.
REM Set this value to 'FALSE' if you want to keep the image with normal size to make other changes,
REM Otherwise, keep it as 'TRUE'.
Set "Rebuild=True"

REM This value indicates whether the Windows Image should be cleaned-up at the end.
REM True  = 'Dism' will try to CleanUp the 'WIM' image components.
REM False = 'Dism' will keep the 'WIM' image as is.
REM Set this value to 'FALSE' if you want to keep the image with normal size to make other changes,
REM Otherwise, keep it as 'TRUE'.
Set "CleanUp=True"

REM This value indicates the 'WIM' image to be mounted.
Set "WindowsImage=%UserProfile%\Desktop\win 8 .1\win\sources\Boot.wim"

REM This value indicates the Image Index of the 'WIM' image.
Set "ImageIndex=2"

REM This value indicates the directory where to mount the 'WIM' image.
Set "MountDir=%HomeDrive%\WinBootMount"

REM This value indicates the ubication of Anolis Resourcer 'Anolis.exe' file.
Set "Anolis=%CD%\Tools\Anolis.exe"

REM This value indicates the textfile that contains the Recource files to replace.
Set "ResourceList=%CD%\Resources.txt"

REM This value indicates the ubication of 'ImageX.exe' file.
Set "ImageX=%CD%\Tools\Dism\ImageX.exe"

REM This value indicates the ubication of a custom 'DISM.exe' file if needed.
REM Default ubication: "%SystemRoot%\System32\Dism.exe"
Set "Dism=%CD%\Tools\Dism\Dism.exe"

REM This value indicates the ubication of the logfile that will record 'DISM' errors.
Set "DismLogfile=%CD%\%~n0 DISM.log"

REM This value indicates the logging-level of the 'DISM' process.
REM 1 = Errors only
REM 2 = Errors and warnings
REM 3 = Errors, warnings, and informational
REM 4 = All of the information listed previously, plus debug output
Set /A "DismLogLevel=2"

REM This value indicates the ubication of the logfile that will record Main information.
Set "Logfile=%CD%\%~n0.log"



REM =====
REM Main:
REM =====

:: Call Methods.
Call :CheckErrors
Call :CreateLogs
Call :CreateMountDir
Call :GetWIMSizeBefore
Call :StartTimer
Call :Mount
CLS
Call :ParseResources
Call :Unmount
Call :StopTimer
Call :GetWIMSizeAfter
Call :EndLog
Pause&Exit



REM ========
REM Methods:
REM ========

:CreateLogs
:: Create the 'DISM' logfile with 'ANSI' encoding,
:: this is necessary to record a non-default 'DISM' loglevel such as '1' or '2'.
Echo+ >"%Logfile%"

:: Create the Main Logfile and record starting info on it.
(
Echo+
Echo    WIM Resource Replacer
Echo ===========================
Echo   %DATE% ^| %TIME:~0,-3%
Echo /\/\/\/\/\/\/\/\/\/\/\/\/\/
Echo+
Echo [i] Mount Image?...: %MountImage%
Echo [i] Unmount Image?.: %UnmountImage%
Echo [i] CleanUp Image?.: %CleanUp%
Echo [i] Rebuild Image?.: %Rebuild%
Echo+
Echo [i] Windows Image..: %WindowsImage%
Echo [i] Image Index....: %ImageIndex%
Echo [i] Mount Directory: %MountDir%
Echo+
Echo [i] ImageX Path....: %ImageX%
Echo [i] Dism Path......: %Dism%
Echo [i] Dism Log File..: %DismLogfile%
Echo [i] Dism Log Level.: %DismLogLevel%
Echo+
Echo [i] Anolis Path....: %Anolis%
Echo [i] Resource List..: %ResourceList%
Echo [i] Log File.......: %LogFile%
Echo+
Echo ===========================
)>"%Logfile%"

:: Display starting log info.
Type "%Logfile%"

:: Continue writting log.
(
Echo+
Echo Resource conflicts:
Echo ===================
Echo+
)>>"%LogFile%"

Goto:EOF


:EndLog
(
Echo+
Echo [i] Done!
Echo [i] WIM Size Before....: %WIMSizeBefore%
Echo [i] WIM Size After.....: %WIMSizeAfter%
Echo [i] Resources Success..: %ResourceSuccessCount% files.
Echo [i] Resources Failed...: %ResourceFailsCount% files.
Echo [i] Resources Not Found: %ResourceNotFoundCount% files.
Echo [i] Files Added........: %FilesAddedCount% files.
Echo [i] Files Failed.......: %FilesFailsCount% files.
Echo [i] Files Not Found....: %FilesNotFoundCount% files.
Echo [i] Elapsed Time.......: %ElapsedTime%
Echo+
)>>"%LogFile%"

:: Display ending information.
CLS
Type "%LogFile%"
Goto:EOF


:CreateMountDir
:: Create the mount directory.
(
If Not Exist "%MountDir%" If /I "%MountImage%" EQU "True" (
MkDir "%MountDir%" 2>NUL
)
) || (
Echo+
Echo [x] Error trying to create the directory "%MountDir%" to mount the Windows Image.
Echo [i] Ensure that you have Admin rights to create the directory.
Echo [i] Ensure that the directory name does not contains illegal characters.
Echo+
Pause&Exit
)
Goto:EOF


:Mount
:: Mount the Windows Image into the directory.
Echo+
Echo [+] Mounting WIM Image...
If /I "%MountImage%" EQU "True" (

"%Dism%" /Mount-Image /ImageFile:"%WindowsImage%" /Index:"%ImageIndex%" /MountDir:"%MountDir%" /English /LogPath:"%DismLogfile%" /LogLevel:"%DismLogLevel%" || (
Echo+
Echo [x] Error mounting the Image Index "%ImageIndex%" in "%MountDir%"
Echo [i] Ensure that the Image Index exist.
Echo [i] Ensure that you have Admin rights to write inside the directory.
Echo [i] Ensure that the directory is not already mounted.
Echo [i] Ensure that the directory is fully empty.
Echo+
REM Try to unmount the failed image and discard changes.
If /I "%UnmountImage%" EQU "True" (
Echo [+] Unmounting and discarding changes...
"%Dism%" /Unmount-WIM /Discard /MountDir:"%MountDir%"
)
Pause&Exit
)

)
Goto:EOF


:CleanUp
Echo [+] CleaningUp WIM Image...
"%Dism%" /CleanUp-Image /StartComponentCleanUp /Image:"%MountDir%" /English /LogPath:"%DismLogfile%" /LogLevel:"%DismLogLevel%" /Quiet
Echo+
Goto:EOF


:Unmount
:: Unmount the Windows Image commiting changes.
Echo [+] Unmounting WIM Image...
If /I "%UnmountImage%" EQU "True" (
"%Dism%" /Unmount-WIM /Commit /MountDir:"%MountDir%" /English /LogPath:"%DismLogfile%" /LogLevel:"%DismLogLevel%"
)
Goto:EOF


:Rebuild
If /I "%Rebuild%" EQU "False" (Goto:EOF)

Echo+
Echo [+] Rebuilding WIM image...

("%ImageX%" /Compress Maximum /Export "%WindowsImage%" "*" "%TEMP%\Rebuilt Image.wim" /Check) && (
Del /Q /F "%WindowsImage%" 1>NUL
Move /Y "%TEMP%\Rebuilt Image.wim" "%WindowsImage%" 1>NUL
) || (
Echo [x] Error rebuilding Image "%WindowsImage%" to "%TEMP%\Rebuilt Image.wim".
)

Goto :EOF


:StartTimer
Set "StartingDate=%Date%"
Set "StarttingTime=%Time:~0,-3%"
Goto :EOF


:StopTimer
(
Echo Minutes = DateDiff^("n", "%StartingDate% %StarttingTime%", Now^)
Echo WScript.Echo Minutes ^& " Minutes"
)>"%TEMP%\%~n0 MinuteDiff.vbs"

For /F "Tokens=*" %%# In (
'Cscript.exe /Nologo "%TEMP%\%~n0 MinuteDiff.vbs"'
) Do (
Set "ElapsedTime=%%#"
)

Goto:EOF


:WriteConvertBytesScript
If Exist "%TEMP%\%~n0 Convert Bytes.vbs" (Goto:EOF)
(
Echo Suffix = Array^("Bytes", "KB", "MB", "GB", "TB"^)
Echo+
Echo Function Convert^(Bytes^)
Echo Convert = convert0^(Bytes, 0^)
Echo End Function
Echo+
Echo Function Convert0^(Bytes, Level^)
Echo If Bytes ^>= 1024 Then
Echo Bytes = Round^(Bytes / 1024, 2^)
Echo Level = Level + 1
Echo Convert0 = Convert0^(Bytes, Level^)
Echo End If
Echo Convert0 = Bytes ^& " " ^& Suffix^(Level^)
Echo End Function
Echo+
Echo WScript.Echo Convert^(WScript.Arguments^(0^)^)
)>"%TEMP%\%~n0 Convert Bytes.vbs"
Goto:EOF


:GetWIMSizeBefore
Call :WriteConvertBytesScript
For %%# in ("%WindowsImage%") Do (Set "WIMSizeBefore=%%~z#")
For /F "Tokens=*" %%# In (
'Cscript.exe /Nologo "%TEMP%\%~n0 Convert Bytes.vbs" "%WIMSizeBefore%"'
) Do (
Set "WIMSizeBefore=%%#"
)
Del /Q "%TEMP%\%~n0 Convert Bytes.vbs"
Goto:EOF


:GetWIMSizeAfter
Call :WriteConvertBytesScript
For %%# in ("%WindowsImage%") Do (Set "WIMSizeAfter=%%~z#")
For /F "Tokens=*" %%# In (
'Cscript.exe /Nologo "%TEMP%\%~n0 Convert Bytes.vbs" "%WIMSizeAfter%"'
) Do (
Set "WIMSizeAfter=%%#"
)
Del /Q "%TEMP%\%~n0 Convert Bytes.vbs"
Goto:EOF


:TakeOwn
(
Takeown.exe /F "%~f1"
ICacls.exe "%~f1" /Grant "%UserName%":"F"
Attrib.exe -R -A -S -H -I "%~f1"
)>NUL || (Exit /B 1)
Goto:EOF


:ParseResources
Set /A "ResourceSuccessCount=0"
Set /A "ResourceFailsCount=0"
Set /A "ResourceNotFoundCount=0"
Set /A "FilesAddedCount=0"
Set /A "FilesFailsCount=0"
Set /A "FilesNotFoundCount=0"

For /F "UseBackQ Tokens=1,2,* Delims=;" %%a In ("%ResourceList%") Do (

If /I "%%~xa" EQU ".dll" (Call :ReplaceResource "%MountDir%\%%~a" "%%~b" "%%~c")
If /I "%%~xa" NEQ ".dll" (Call :CopyFile        "%MountDir%\%%~a" "%%~b")

)
Goto:EOF


:CopyFile
If Not Exist "%~2" (
Echo Can't locate file to copy from: "%~2">>"%LogFile%"
Set /A "FilesNotFoundCount+=1"
Goto:EOF
)

Call :TakeOwn "%~f1" || (
Echo Unable to grant file permissions in file: "%~1">>"%Logfile%"
Set /A "FilesFailsCount+=1"
Goto:EOF
)

Echo [o] Copying "%~2" to "%~1"
Copy /Y "%~f2" "%~f1" 1>NUL || (
Echo Unable to copy file "%~2">>"%Logfile%"
Set /A "FilesFailsCount+=1"
Goto:EOF
)
Set /A "FilesAddedCount+=1"
Goto:EOF


:ReplaceResource
If Not Exist "%~f3" (
Echo Can't locate the resource to copy from: "%~3">>"%LogFile%"
Set /A "ResourceNotFoundCount+=1"
Goto:EOF
)

If Not Exist "%~f1" (
Echo Can't locate the resource file to edit "%~1">>"%Logfile%"
Set /A "ResourceNotFoundCount+=1"
Goto:EOF
)

Call :TakeOwn "%~f1" || (
Echo Unable to grant file permissions in file: "%~1">>"%Logfile%"
Set /A "ResourceFailsCount+=1"
Goto:EOF
)

Echo [o] Replacing resource with name "%~2" in resource file "%~f1", with "%~3".

If /I "%~x3" EQU ".bmp" (
Start /W "Anolis" "%Anolis%" -op:upd -src:"%~f1" -type:Bitmap -name:"%~2" -lang:1033 -file:"%~f3")
)
If /I "%~x3" EQU ".ico" (
Start /W "Anolis" "%Anolis%" -op:upd -src:"%~f1" -type:Icon -name:"%~2" -lang:1033 -file:"%~f3")
)
Set /A "ResourceSuccessCount+=1"
Goto:EOF



REM ====================
REM File Error Controls:
REM ====================

:CheckErrors
:: WIM File Error-Check.
If /I "MountImage" EQU "True" If Not Exist "%WindowsImage%" (
Echo [x] Windows Image not found at: "%WindowsImage%" | MORE
Pause&Exit
)

:: ResourceList File Error-Check.
If Not Exist "%ResourceList%" (
Echo [x] Resource-List file not found in: "%ResourceList%" | MORE
Pause&Exit
)

:: 'DISM.exe' File Error-Check.
If Not Exist "%DISM%" (
Echo [x] 'DISM' process not found at: "%DISM%" | MORE
Pause&Exit
)

:: 'ImageX.exe' File Error-Check.
If Not Exist "%ImageX%" (
Echo [x] 'ImageX' process not found at: "%ImageX%" | MORE
Pause&Exit
)

:: 'MountImage' Value check.
If /I "%MountImage%" NEQ "True" If /I "%MountImage%" NEQ "False" (
Echo [x] Error parsing parameter 'MountImage',
Echo     value '%MountImage%' is not a Boolean value.
Pause&Exit
)

:: 'UnmountImage' Value check.
If /I "%UnmountImage%" NEQ "True" If /I "%UnmountImage%" NEQ "False" (
Echo [x] Error parsing parameter 'UnmountImage',
Echo     value '%UnmountImage%' is not a Boolean value.
Pause&Exit
)

:: 'Rebuild' Value check.
If /I "%Rebuild%" NEQ "True" If /I "%Rebuild%" NEQ "False" (
Echo [x] Error parsing parameter 'Rebuild',
Echo     value '%Rebuild%' is not a Boolean value.
Pause&Exit
)

:: 'CleanUp' Value check.
If /I "%CleanUp%" NEQ "True" If /I "%CleanUp%" NEQ "False" (
Echo [x] Error parsing parameter 'CleanUp',
Echo     value '%CleanUp%' is not a Boolean value.
Pause&Exit
)

:: 'DismLogLevel' Value check.
Echo "%DismLogLevel%"| Findstr.exe "^\"[^1-4]\"$" 1>NUL 2>&1 || (
Echo [x] Error parsing parameter 'DismLogLevel',
Echo     value '%DismLogLevel%' is not in range '1-4'.
Pause&Exit
)

:: Anolis Resourcer File Error-Check.
If Not Exist "%Anolis%" (
Echo [x] Anolis process not found in: "%Anolis%" | MORE
Pause&Exit
)

Goto:EOF

#564
Este Script sirve para automatizar la tarea de montar una imagen WIM de Windows y eliminar paquetes de la instalación de Windows.

Se necesitan unos requisitos y dependencias para usar este Script:
· Saber de lo que estoy hablando.
· Conocer el nombre de los paquetes que quieres elimiar (obviamente).
· Dism e ImageX (WAIK/WADK).
· win6x_registry_tweak > http://www.msfn.org/board/topic/152688-win6x-registry-tweak/


Las instrucciones de uso y un extenso tutorial lo publiqué en este otro tema: http://foro.elhacker.net/windows/guia_de_personalizacion_de_imagenes_de_implementacion_de_windows_wim_parte_5-t412551.0.html así que lo haré de nuevo de manera resumida: solo tienen que escribir en un archivo de texto los paquetes que quieren eliminar, y configurar las variables documentadas del Script (La ubicación de la imagen, el directorio de montaje, etc...)


Todo lo necesario está incluido en este archivo comprimido:
http://www.mediafire.com/download/mq7o7q7brq6h4ca/WIM_Package_Uninstaller.rar

Imágenes:



WIM Package Uninstaller.cmd
Código (dos) [Seleccionar]
@Echo OFF



REM =================
REM Console Settings:
REM =================

Title WIM Package Uninstaller - By Elektro
Mode Con Cols=150 Lines=50
CHCP 1252 1>NUL & REM Windows-1252, Spanish-Latin.



REM =====
REM Info:
REM =====

Echo+
Echo  ----------------------------------------------------------------------------------
Echo  This script mounts a Windows Image ^(WIM^) and then removes pre-installed packages
Echo  ----------------------------------------------------------------------------------
Echo+



REM ====================
REM User defined values:
REM ====================

REM This value indicates whether the Windows Image should be mounted.
REM True  = 'DISM' will try to mount the 'WIM' image.
REM False = 'DISM' will not try to mount the WIM image.
REM Set this value to 'FALSE' if the 'WIM' image is already mounted in the specified mount directory,
REM Otherwise, keep it as 'TRUE'.
Set "MountImage=True"

REM This value indicates whether the Windows Image should be unmounted at the end.
REM True  = 'DISM' will try to unmount the 'WIM' image.
REM False = 'DISM' will not try to unmount the WIM image.
REM Set this value to 'FALSE' if you want to keep the image mounted to make other changes,
REM Otherwise, keep it as 'TRUE'.
Set "UnmountImage=True"

REM This value indicates whether the Windows Image should be rebuilt at the end.
REM True  = 'ImageX' will try to rebuild the 'WIM' image.
REM False = 'ImageX' will keep the 'WIM' image as is.
REM Set this value to 'FALSE' if you want to keep the image with normal size to make other changes,
REM Otherwise, keep it as 'TRUE'.
Set "Rebuild=True"

REM This value indicates the 'WIM' image to be mounted.
Set "WindowsImage=%UserProfile%\Desktop\win 8 .1\win\sources\install.wim"

REM This value indicates the Image Index of the 'WIM' image.
Set "ImageIndex=1"

REM This value indicates the directory where to mount the 'WIM' image.
Set "MountDir=%HomeDrive%\WinMount"

REM This value indicates the textfile that contains the names of the packages to remove.
Set "PackageList=%CD%\Packages.txt"

REM This value indicates the ubication of the 'WIM Registry Tweak Tool.exe' file.
Set "WIMRegistryTweakTool=%CD%\Tools\WIM Registry Tweak Tool\WIM Registry Tweak Tool.exe"

REM This value indicates the ubication of 'ImageX.exe' file.
Set "ImageX=%CD%\Tools\Dism\ImageX.exe"

REM This value indicates the ubication of a custom 'DISM.exe' file if needed.
REM Default ubication: "%SystemRoot%\System32\Dism.exe"
Set "Dism=%CD%\Tools\Dism\Dism.exe"

REM This value indicates the ubication of the logfile that will record 'DISM' errors.
Set "DismLogfile=%CD%\%~n0 DISM.log"

REM This value indicates the logging-level of the 'DISM' process.
REM 1 = Errors only
REM 2 = Errors and warnings
REM 3 = Errors, warnings, and informational
REM 4 = All of the information listed previously, plus debug output
Set /A "DismLogLevel=2"

REM This value indicates the ubication of the logfile that will record Main information.
Set "Logfile=%CD%\%~n0.log"



REM =====
REM Main:
REM =====

:: Call Methods.
Call :CheckErrors
Call :CreateLogs
Call :CreateMountDir
Call :GetWIMSizeBefore
Call :StartTimer
Call :Mount
CLS
Call :ParsePackages
CLS
Call :CleanUp
Call :Unmount
Call :Rebuild
Call :StopTimer
Call :GetWIMSizeAfter
Call :EndLog
Pause&Exit



REM ========
REM Methods:
REM ========


:CreateLogs

:: Create the 'DISM' logfile with 'ANSI' encoding,
:: this is necessary to record a non-default 'DISM' loglevel such as '1' or '2'.
Echo+ >"%DismLogfile%"


:: Create the Main logfile and record starting info on it.
Echo+ >"%Logfile%"
(
Echo+
Echo   WIM Package Uninstaller
Echo ===========================
Echo   %DATE% ^| %TIME:~0,-3%
Echo /\/\/\/\/\/\/\/\/\/\/\/\/\/
Echo+
Echo [i] Mount Image?...: %MountImage%
Echo [i] Unmount Image?.: %UnmountImage%
Echo+
Echo [i] Windows Image..: %WindowsImage%
Echo [i] Image Index....: %ImageIndex%
Echo [i] Mount Directory: %MountDir%
Echo+
Echo [i] ImageX Path....: %ImageX%
Echo [i] Dism Path......: %Dism%
Echo [i] Dism Log File..: %DismLogfile%
Echo [i] Dism Log Level.: %DismLogLevel%
Echo+
Echo [i] WIMRegistryTool: %WIMRegistryTweakTool%
Echo [i] Package List...: %PackageList%
Echo [i] Log File.......: %Logfile%
Echo+
Echo ===========================
)>"%Logfile%"

:: Display starting log info.
Type "%Logfile%"

:: Continue writting log.
(
Echo+
Echo Package conflicts:
Echo ==================
Echo+
)>>"%LogFile%"
Goto:EOF


:EndLog
(
Echo+
Echo [i] Done!
Echo [i] WIM Image Size Before........: %WIMSizeBefore%
Echo [i] WIM Image Size After.........: %WIMSizeAfter%
Echo [i] Packages Successfully Removed: %PackagesRemovedCount% Packages.
Echo [i] Packages Failed To Remove....: %PackagesFailedCount% Packages.
Echo [i] Packages Not Found...........: %PackagesNotFoundCount% Packages.
Echo [i] Elapsed Time.................: %ElapsedTime%
Echo+
)>>"%LogFile%"

:: Display ending information.
CLS
Type "%LogFile%"
Goto:EOF


:CreateMountDir
:: Create the mount directory.
(
If Not Exist "%MountDir%" If /I "%MountImage%" EQU "True" (
MkDir "%MountDir%" 2>NUL
)
) || (
Echo+
Echo [x] Error trying to create the directory "%MountDir%" to mount the Windows Image.
Echo [i] Ensure that you have Admin rights to create the directory.
Echo [i] Ensure that the directory name does not contains illegal characters.
Echo+
Pause&Exit
)
Goto:EOF


:Mount
:: Mount the Windows Image into the directory.
Echo+
Echo [+] Mounting WIM Image...
If /I "%MountImage%" EQU "True" (

"%Dism%" /Mount-Image /ImageFile:"%WindowsImage%" /Index:"%ImageIndex%" /MountDir:"%MountDir%" /English /LogPath:"%DismLogfile%" /LogLevel:"%DismLogLevel%" || (
Echo+
Echo [x] Error mounting the Image Index "%ImageIndex%" in "%MountDir%"
Echo [i] Ensure that the Image Index exist.
Echo [i] Ensure that you have Admin rights to write inside the directory.
Echo [i] Ensure that the directory is not already mounted.
Echo [i] Ensure that the directory is fully empty.
Echo+
REM Try to unmount the failed image and discard changes.
If /I "%UnmountImage%" EQU "True" (
Echo [+] Unmounting and discarding changes...
"%Dism%" /Unmount-WIM /Discard /MountDir:"%MountDir%"
)
Pause&Exit
)

)
Goto:EOF


:CleanUp
Echo [+] CleaningUp WIM Image...
"%Dism%" /CleanUp-Image /StartComponentCleanUp /Image:"%MountDir%" /English /LogPath:"%DismLogfile%" /LogLevel:"%DismLogLevel%" /Quiet
Echo+
Goto:EOF


:Unmount
:: Unmount the Windows Image commiting changes.
Echo [+] Unmounting WIM Image...
If /I "%UnmountImage%" EQU "True" (
"%Dism%" /Unmount-WIM /Commit /MountDir:"%MountDir%" /English /LogPath:"%DismLogfile%" /LogLevel:"%DismLogLevel%"
)
Goto:EOF


:Rebuild
If /I "%Rebuild%" EQU "False" (Goto:EOF)

Echo+
Echo [+] Rebuilding WIM image...

("%ImageX%" /Compress Maximum /Export "%WindowsImage%" "*" "%TEMP%\Rebuilt Image.wim" /Check) && (
Del /Q /F "%WindowsImage%" 1>NUL
Move /Y "%TEMP%\Rebuilt Image.wim" "%WindowsImage%" 1>NUL
) || (
Echo [x] Error rebuilding Image "%WindowsImage%" to "%TEMP%\Rebuilt Image.wim".
)

Goto :EOF


:StartTimer
Set "StartingDate=%Date%"
Set "StarttingTime=%Time:~0,-3%"
Goto :EOF


:StopTimer
(
Echo Minutes = DateDiff^("n", "%StartingDate% %StarttingTime%", Now^)
Echo WScript.Echo Minutes ^& " Minutes"
)>"%TEMP%\%~n0 MinuteDiff.vbs"

For /F "Tokens=*" %%# In (
'Cscript.exe /Nologo "%TEMP%\%~n0 MinuteDiff.vbs"'
) Do (
Set "ElapsedTime=%%#"
)

Goto:EOF


:WriteConvertBytesScript
If Exist "%TEMP%\%~n0 Convert Bytes.vbs" (Goto:EOF)
(
Echo Suffix = Array^("Bytes", "KB", "MB", "GB", "TB"^)
Echo+
Echo Function Convert^(Bytes^)
Echo Convert = convert0^(Bytes, 0^)
Echo End Function
Echo+
Echo Function Convert0^(Bytes, Level^)
Echo If Bytes ^>= 1024 Then
Echo Bytes = Round^(Bytes / 1024, 2^)
Echo Level = Level + 1
Echo Convert0 = Convert0^(Bytes, Level^)
Echo End If
Echo Convert0 = Bytes ^& " " ^& Suffix^(Level^)
Echo End Function
Echo+
Echo WScript.Echo Convert^(WScript.Arguments^(0^)^)
)>"%TEMP%\%~n0 Convert Bytes.vbs"
Goto:EOF


:GetWIMSizeBefore
Call :WriteConvertBytesScript
For %%# in ("%WindowsImage%") Do (Set "WIMSizeBefore=%%~z#")
For /F "Tokens=*" %%# In (
'Cscript.exe /Nologo "%TEMP%\%~n0 Convert Bytes.vbs" "%WIMSizeBefore%"'
) Do (
Set "WIMSizeBefore=%%#"
)
Del /Q "%TEMP%\%~n0 Convert Bytes.vbs"
Goto:EOF


:GetWIMSizeAfter
Call :WriteConvertBytesScript
For %%# in ("%WindowsImage%") Do (Set "WIMSizeAfter=%%~z#")
For /F "Tokens=*" %%# In (
'Cscript.exe /Nologo "%TEMP%\%~n0 Convert Bytes.vbs" "%WIMSizeAfter%"'
) Do (
Set "WIMSizeAfter=%%#"
)
Del /Q "%TEMP%\%~n0 Convert Bytes.vbs"
Goto:EOF


:ParsePackages

Set /A "PackagesRemovedCount=0"
Set /A "PackagesFailedCount=0"
Set /A "PackagesNotFoundCount=0"

:: Unhide packages and take registry ownership.
"%WIMRegistryTweakTool%" /p "%MountDir%"
Echo+

:: Remove Packages.
For /F "UseBackQ Tokens=* Delims=" %%# In ("%PackageList%") Do (

Echo [+] Removing package: %%~#

"%Dism%" /Remove-Package /PackageName:"%%~#" /Image:"%MountDir%" /English /LogPath:"%DismLogfile%" /LogLevel:"%DismLogLevel%" /Quiet 1>NUL
    Call Set /A "ExitCode=%%Errorlevel%%"

    (Call Echo "%%ExitCode%%"| Findstr.exe "^\"0\"$" 1>NUL 2>&1) && (
    Call Set /A "PackagesRemovedCount+=1"
    )

(Call Echo "%%ExitCode%%"| Findstr.exe "^\"5\"$" 1>NUL 2>&1) && (
Call Set /A "PackagesFailedCount+=1"
Echo Failed to remove package: %%~#>>"%LogFile%"
)

(Call Echo "%%ExitCode%%"| Find.exe "-2146498555" 1>NUL 2>&1) && (
Call Set /A "PackagesNotFoundCount+=1"
Echo Package is not installed: %%~#>>"%LogFile%"
)

)
Goto:EOF



REM ===============
REM Error Controls:
REM ===============

:CheckErrors
:: WIM File Error-Check.
If /I "MountImage" EQU "True" If Not Exist "%WindowsImage%" (
Echo [x] Windows Image not found at: "%WindowsImage%" | MORE
Pause&Exit
)

:: PackageList File Error-Check.
If Not Exist "%PackageList%" (
Echo [x] PackageList not found at: "%PackageList%" | MORE
Pause&Exit
)

:: 'DISM.exe' File Error-Check.
If Not Exist "%DISM%" (
Echo [x] 'DISM' process not found at: "%DISM%" | MORE
Pause&Exit
)

:: 'ImageX.exe' File Error-Check.
If Not Exist "%ImageX%" (
Echo [x] 'ImageX' process not found at: "%ImageX%" | MORE
Pause&Exit
)

:: 'WIM Registry Tweak Tool.exe' File Error-Check.
If Not Exist "%WIMRegistryTweakTool%" (
Echo [x] 'WIM Registry Tweak Tool' process not found at: "%WIMRegistryTweakTool%" | MORE
Pause&Exit
)

:: 'MountImage' Value check.
If /I "%MountImage%" NEQ "True" If /I "%MountImage%" NEQ "False" (
Echo [x] Error parsing parameter 'MountImage',
Echo     value '%MountImage%' is not a Boolean value.
Pause&Exit
)

:: 'UnmountImage' Value check.
If /I "%UnmountImage%" NEQ "True" If /I "%UnmountImage%" NEQ "False" (
Echo [x] Error parsing parameter 'UnmountImage',
Echo     value '%UnmountImage%' is not a Boolean value.
Pause&Exit
)

:: 'Rebuild' Value check.
If /I "%Rebuild%" NEQ "True" If /I "%Rebuild%" NEQ "False" (
Echo [x] Error parsing parameter 'Rebuild',
Echo     value '%Rebuild%' is not a Boolean value.
Pause&Exit
)

:: 'DismLogLevel' Value check.
Echo "%DismLogLevel%"| Findstr.exe "^\"[^1-4]\"$" 1>NUL 2>&1 || (
Echo [x] Error parsing parameter 'DismLogLevel',
Echo     value '%DismLogLevel%' is not in range '1-4'.
Pause&Exit
)

Goto:EOF

#565
Este Script sirve para automatizar la tarea de montar una imagen WIM de Windows y desactivar características de la instalación de Windows.

Se necesitan unos requisitos y dependencias para usar este Script:
· Saber de lo que estoy hablando.
· Conocer el nombre de las características que quieres elimiar (obviamente).
· Dism e ImageX (WAIK/WADK).


Las instrucciones de uso y un extenso tutorial lo publiqué en este otro tema: http://foro.elhacker.net/windows/guia_de_personalizacion_de_imagenes_de_implementacion_de_windows_wim_parte_5-t412551.0.html así que lo haré de nuevo de manera resumida: solo tienen que escribir en un archivo de texto el nombre de las características que quieren desactivar, y configurar las variables documentadas del Script (La ubicación de la imagen, el directorio de montaje, etc...)


Todo lo necesario está incluido en este archivo comprimido:
http://www.mediafire.com/download/lq4sc56ri59klod/WIM_Feature_Uninstaller.rar


Imágenes:



WIM Feature Uninstaller.cmd
Código (dos) [Seleccionar]
@Echo OFF



REM =================
REM Console Settings:
REM =================

Title WIM Feature Uninstaller - By Elektro
Mode Con Cols=150 Lines=50
CHCP 1252 1>NUL & REM Windows-1252, Spanish-Latin.



REM =====
REM Info:
REM =====

Echo+
Echo  -----------------------------------------------------------------------------
Echo  This script mounts a Windows Image ^(WIM^) and then disables Windows features
Echo  -----------------------------------------------------------------------------
Echo+



REM ====================
REM User defined values:
REM ====================

REM This value indicates whether the Windows Image should be mounted.
REM True  = 'DISM' will try to mount the 'WIM' image.
REM False = 'DISM' will not try to mount the WIM image.
REM Set this value to 'FALSE' if the 'WIM' image is already mounted in the specified mount directory,
REM Otherwise, keep it as 'TRUE'.
Set "MountImage=True"

REM This value indicates whether the Windows Image should be unmounted at the end.
REM True  = 'DISM' will try to unmount the 'WIM' image.
REM False = 'DISM' will not try to unmount the WIM image.
REM Set this value to 'FALSE' if you want to keep the image mounted to make other changes,
REM Otherwise, keep it as 'TRUE'.
Set "UnmountImage=True"

REM This value indicates whether the Windows Image should be rebuilt at the end.
REM True  = 'ImageX' will try to rebuild the 'WIM' image.
REM False = 'ImageX' will keep the 'WIM' image as is.
REM Set this value to 'FALSE' if you want to keep the image with normal size to make other changes,
REM Otherwise, keep it as 'TRUE'.
Set "Rebuild=True"

REM This value indicates the 'WIM' image to be mounted.
Set "WindowsImage=%UserProfile%\Desktop\win 8 .1\win\sources\install.wim"

REM This value indicates the Image Index of the 'WIM' image.
Set "ImageIndex=1"

REM This value indicates the directory where to mount the 'WIM' image.
Set "MountDir=%HomeDrive%\WinMount"

REM This value indicates the textfile that contains the names of the features to disable.
Set "FeatureList=%CD%\Features.txt"

REM This value indicates the ubication of 'ImageX.exe' file.
Set "ImageX=%CD%\Tools\Dism\ImageX.exe"

REM This value indicates the ubication of a custom 'DISM.exe' file if needed.
REM Default ubication: "%SystemRoot%\System32\Dism.exe"
Set "Dism=%CD%\Tools\Dism\Dism.exe"

REM This value indicates the ubication of the logfile that will record 'DISM' errors.
Set "DismLogfile=%CD%\%~n0 DISM.log"

REM This value indicates the logging-level of the 'DISM' process.
REM 1 = Errors only
REM 2 = Errors and warnings
REM 3 = Errors, warnings, and informational
REM 4 = All of the information listed previously, plus debug output
Set /A "DismLogLevel=2"

REM This value indicates the ubication of the logfile that will record Main information.
Set "Logfile=%CD%\%~n0.log"



REM =====
REM Main:
REM =====

:: Call Methods.
Call :CheckErrors
Call :CreateLogs
Call :CreateMountDir
Call :GetWIMSizeBefore
Call :StartTimer
Call :Mount
CLS
Call :ParseFeatures
CLS
Call :CleanUp
Call :Unmount
Call :Rebuild
Call :StopTimer
Call :GetWIMSizeAfter
Call :EndLog
Pause&Exit



REM ========
REM Methods:
REM ========


:CreateLogs

:: Create the 'DISM' logfile with 'ANSI' encoding,
:: this is necessary to record a non-default 'DISM' loglevel such as '1' or '2'.
Echo+ >"%DismLogfile%"


:: Create the Main logfile and record starting info on it.
Echo+ >"%Logfile%"
(
Echo+
Echo   WIM Feature Uninstaller
Echo ===========================
Echo   %DATE% ^| %TIME:~0,-3%
Echo /\/\/\/\/\/\/\/\/\/\/\/\/\/
Echo+
Echo [i] Mount Image?...: %MountImage%
Echo [i] Unmount Image?.: %UnmountImage%
Echo+
Echo [i] Windows Image..: %WindowsImage%
Echo [i] Image Index....: %ImageIndex%
Echo [i] Mount Directory: %MountDir%
Echo+
Echo [i] ImageX Path....: %ImageX%
Echo [i] Dism Path......: %Dism%
Echo [i] Dism Log File..: %DismLogfile%
Echo [i] Dism Log Level.: %DismLogLevel%
Echo+
Echo [i] Feature List...: %FeatureList%
Echo [i] Log File.......: %Logfile%
Echo+
Echo ===========================
)>"%Logfile%"

:: Display starting log info.
Type "%Logfile%"

:: Continue writting log.
(
Echo+
Echo Feature conflicts:
Echo ==================
Echo+
)>>"%LogFile%"
Goto:EOF


:EndLog
(
Echo+
Echo [i] Done!
Echo [i] WIM Image Size Before.........: %WIMSizeBefore%
Echo [i] WIM Image Size After..........: %WIMSizeAfter%
Echo [i] Features Successfully Disabled: %FeaturesRemovedCount% Packages.
Echo [i] Features Failed To Disable....: %FeaturesFailedCount% Packages.
Echo [i] Features Not Found............: %FeaturesNotFoundCount% Packages.
Echo [i] Elapsed Time..................: %ElapsedTime%
Echo+
)>>"%LogFile%"

:: Display ending information.
CLS
Type "%LogFile%"
Goto:EOF


:CreateMountDir
:: Create the mount directory.
(
If Not Exist "%MountDir%" If /I "%MountImage%" EQU "True" (
MkDir "%MountDir%" 2>NUL
)
) || (
Echo+
Echo [x] Error trying to create the directory "%MountDir%" to mount the Windows Image.
Echo [i] Ensure that you have Admin rights to create the directory.
Echo [i] Ensure that the directory name does not contains illegal characters.
Echo+
Pause&Exit
)
Goto:EOF


:Mount
:: Mount the Windows Image into the directory.
Echo+
Echo [+] Mounting WIM Image...
If /I "%MountImage%" EQU "True" (

"%Dism%" /Mount-Image /ImageFile:"%WindowsImage%" /Index:"%ImageIndex%" /MountDir:"%MountDir%" /English /LogPath:"%DismLogfile%" /LogLevel:"%DismLogLevel%" || (
Echo+
Echo [x] Error mounting the Image Index "%ImageIndex%" in "%MountDir%"
Echo [i] Ensure that the Image Index exist.
Echo [i] Ensure that you have Admin rights to write inside the directory.
Echo [i] Ensure that the directory is not already mounted.
Echo [i] Ensure that the directory is fully empty.
Echo+
REM Try to unmount the failed image and discard changes.
If /I "%UnmountImage%" EQU "True" (
Echo [+] Unmounting and discarding changes...
"%Dism%" /Unmount-WIM /Discard /MountDir:"%MountDir%"
)
Pause&Exit
)

)
Goto:EOF


:CleanUp
Echo [+] CleaningUp WIM Image...
"%Dism%" /CleanUp-Image /StartComponentCleanUp /Image:"%MountDir%" /English /LogPath:"%DismLogfile%" /LogLevel:"%DismLogLevel%" /Quiet
Echo+
Goto:EOF


:Unmount
:: Unmount the Windows Image commiting changes.
Echo [+] Unmounting WIM Image...
If /I "%UnmountImage%" EQU "True" (
"%Dism%" /Unmount-WIM /Commit /MountDir:"%MountDir%" /English /LogPath:"%DismLogfile%" /LogLevel:"%DismLogLevel%"
)
Goto:EOF


:Rebuild
If /I "%Rebuild%" EQU "False" (Goto:EOF)

Echo+
Echo [+] Rebuilding WIM image...

("%ImageX%" /Compress Maximum /Export "%WindowsImage%" "*" "%TEMP%\Rebuilt Image.wim" /Check) && (
Del /Q /F "%WindowsImage%" 1>NUL
Move /Y "%TEMP%\Rebuilt Image.wim" "%WindowsImage%" 1>NUL
) || (
Echo [x] Error rebuilding Image "%WindowsImage%" to "%TEMP%\Rebuilt Image.wim".
)

Goto :EOF


:StartTimer
Set "StartingDate=%Date%"
Set "StarttingTime=%Time:~0,-3%"
Goto :EOF


:StopTimer
(
Echo Minutes = DateDiff^("n", "%StartingDate% %StarttingTime%", Now^)
Echo WScript.Echo Minutes ^& " Minutes"
)>"%TEMP%\%~n0 MinuteDiff.vbs"

For /F "Tokens=*" %%# In (
'Cscript.exe /Nologo "%TEMP%\%~n0 MinuteDiff.vbs"'
) Do (
Set "ElapsedTime=%%#"
)

Goto:EOF


:WriteConvertBytesScript
If Exist "%TEMP%\%~n0 Convert Bytes.vbs" (Goto:EOF)
(
Echo Suffix = Array^("Bytes", "KB", "MB", "GB", "TB"^)
Echo+
Echo Function Convert^(Bytes^)
Echo Convert = convert0^(Bytes, 0^)
Echo End Function
Echo+
Echo Function Convert0^(Bytes, Level^)
Echo If Bytes ^>= 1024 Then
Echo Bytes = Round^(Bytes / 1024, 2^)
Echo Level = Level + 1
Echo Convert0 = Convert0^(Bytes, Level^)
Echo End If
Echo Convert0 = Bytes ^& " " ^& Suffix^(Level^)
Echo End Function
Echo+
Echo WScript.Echo Convert^(WScript.Arguments^(0^)^)
)>"%TEMP%\%~n0 Convert Bytes.vbs"
Goto:EOF


:GetWIMSizeBefore
Call :WriteConvertBytesScript
For %%# in ("%WindowsImage%") Do (Set "WIMSizeBefore=%%~z#")
For /F "Tokens=*" %%# In (
'Cscript.exe /Nologo "%TEMP%\%~n0 Convert Bytes.vbs" "%WIMSizeBefore%"'
) Do (
Set "WIMSizeBefore=%%#"
)
Del /Q "%TEMP%\%~n0 Convert Bytes.vbs"
Goto:EOF


:GetWIMSizeAfter
Call :WriteConvertBytesScript
For %%# in ("%WindowsImage%") Do (Set "WIMSizeAfter=%%~z#")
For /F "Tokens=*" %%# In (
'Cscript.exe /Nologo "%TEMP%\%~n0 Convert Bytes.vbs" "%WIMSizeAfter%"'
) Do (
Set "WIMSizeAfter=%%#"
)
Del /Q "%TEMP%\%~n0 Convert Bytes.vbs"
Goto:EOF


:ParseFeatures

Set /A "FeaturesRemovedCount=0"
Set /A "FeaturesFailedCount=0"
Set /A "FeaturesNotFoundCount=0"

:: Disable Features.
For /F "UseBackQ Tokens=* Delims=" %%# In ("%FeatureList%") Do (

Echo [+] Disabling Feature: %%~#

"%Dism%" /Disable-Feature /FeatureName:"%%~#" /Image:"%MountDir%" /English /LogPath:"%DismLogfile%" /LogLevel:"%DismLogLevel%" /Quiet 1>NUL
   Call Set /A "ExitCode=%%Errorlevel%%"

   (Call Echo "%%ExitCode%%"| Findstr.exe "^\"0\"$" 1>NUL 2>&1) && (
    Call Set /A "FeaturesRemovedCount+=1"
   )

(Call Echo "%%ExitCode%%"| Findstr.exe "^\"5\"$" 1>NUL 2>&1) && (
Call Set /A "FeaturesFailedCount+=1"
Echo Failed to disable feature: %%~#>>"%LogFile%"
)

(Call Echo "%%ExitCode%%"| Find.exe "-2146498548" 1>NUL 2>&1) && (
Call Set /A "FeaturesNotFoundCount+=1"
Echo Feature is not found.....: %%~#>>"%LogFile%"
)

)
Goto:EOF



REM ===============
REM Error Controls:
REM ===============

:CheckErrors

:: WIM File Error-Check.
If /I "MountImage" EQU "True" If Not Exist "%WindowsImage%" (
Echo [x] Windows Image not found at: "%WindowsImage%" | MORE
Pause&Exit
)

:: FeatureList File Error-Check.
If Not Exist "%FeatureList%" (
Echo [x] FeatureList not found at: "%FeatureList%" | MORE
Pause&Exit
)

:: 'DISM.exe' File Error-Check.
If Not Exist "%DISM%" (
Echo [x] 'DISM' process not found at: "%DISM%" | MORE
Pause&Exit
)

:: 'ImageX.exe' File Error-Check.
If Not Exist "%ImageX%" (
Echo [x] 'ImageX' process not found at: "%ImageX%" | MORE
Pause&Exit
)

:: 'MountImage' Value check.
If /I "%MountImage%" NEQ "True" If /I "%MountImage%" NEQ "False" (
Echo [x] Error parsing parameter 'MountImage',
Echo     value '%MountImage%' is not a Boolean value.
Pause&Exit
)

:: 'UnmountImage' Value check.
If /I "%UnmountImage%" NEQ "True" If /I "%UnmountImage%" NEQ "False" (
Echo [x] Error parsing parameter 'UnmountImage',
Echo     value '%UnmountImage%' is not a Boolean value.
Pause&Exit
)

:: 'Rebuild' Value check.
If /I "%Rebuild%" NEQ "True" If /I "%Rebuild%" NEQ "False" (
Echo [x] Error parsing parameter 'Rebuild',
Echo     value '%Rebuild%' is not a Boolean value.
Pause&Exit
)

:: 'DismLogLevel' Value check.
Echo "%DismLogLevel%"| Findstr.exe "^\"[^1-4]\"$" 1>NUL 2>&1 || (
Echo [x] Error parsing parameter 'DismLogLevel',
Echo     value '%DismLogLevel%' is not in range '1-4'.
Pause&Exit
)

Goto:EOF

#566
Filesize Truncator

Este Script trunca el tamaño de los archivos que estén en el directorio de trabajo actual y en sus subdirectorios.
Nota: El directorio y otras propiedades se pueden modificar en las variables documentadas del código.

En realidad lo que hace es eliminar permanentemente el archivo, y luego se crea un archivo de 0 bytes con el mismo nombre y en la misma ubicación que el que se borró.

Esto es util por ejemplo si necesitamos crear una estructura de carpetas y archivos pero estos pesan demasiado tamaño y solo necesitamos mantener los nombres de los archivos y sus ubicaciones...

El Script tiene 2 métodos de búsqueda de archivos, el modo normal y el modo que incluye archivos ocultos.

Imágenes:




Source:
Código (dos) [Seleccionar]
@Echo OFF



REM =================
REM Console Settings:
REM =================

Title Filesize Truncator - By Elektro
Mode Con Cols=150 Lines=50
CHCP 1252 1>NUL & REM Windows-1252, Spanish-Latin.



REM =====
REM Info:
REM =====

Echo+
Echo  ------------------------------------------------------------------------------------------------------------
Echo  This script will truncate to Zero the size of the files inside the working directory and it's subdirectories
Echo  ------------------------------------------------------------------------------------------------------------
Echo  Take extreme caution, truncating the filesize has the same effect as deleting the file !!
Echo  -----------------------------------------------------------------------------------------
Echo+



REM ====================
REM User defined values:
REM ====================

REM This value indicates the directory where to list it's file structure.
Set "WorkingDir=%CD%"

REM This value indicates the ubication of the logfile that will record info.
Set "Logfile=%CD%\%~n0.log"

REM This value indicates the File-Extensions to exclude during the process.
REM ( Use an ';' delimiter to separate multiple extensions )
Set "ExcludeExts=.bat;.cmd"

REM This value indicates the filenames to exclude during the process.
REM ( Use an ';' delimiter to separate multiple filenames )
Set "ExcludeNames=%~nx0;Files.txt;Files2List.log"

REM This value indicates the files to exclude during the process.
REM ( Use an ';' delimiter to separate multiple files )
Set "ExcludeFiles=%Logfile%"

REM This value indicates how the hidden files are threated when listing the file structure.
REM  True = List files and also files with the 'hidden' attribute.
REM False = List only normal files without the 'hidden' attribute.
Set "IncludeHiddenFiles=True"



REM =====
REM Main:
REM =====

:: Warning question.
Call :CreateLog
Echo+
Choice /C "YN" /M "This will delete the files, you want to continue?"
If %ErrorLevel% NEQ 1 (Exit)
Echo+

:: Call Methods.
Call :CheckErrors
Call :StartTimer
Call :TruncateFiles "%IncludeHiddenFiles%"
Call :StopTimer
Call :EndLog
Pause&Exit



REM ========
REM Methods:
REM ========

:CreateLog
:: Create the Script Logfile and record starting info on it.
FSutil.exe File CreateNew "%LogFile%" "0" 1>NUL
(
Echo+
Echo    Filesize Truncator
Echo =========================
Echo   %DATE% ^| %TIME:~0,-3%
Echo /\/\/\/\/\/\/\/\/\/\/\/\/
Echo+
Echo [i] Working Directory...: %WorkingDir%
Echo [i] Include Hidden Files: %IncludeHiddenFiles%
Echo [i] Excluded Extensions.: %ExcludeExts%
Echo [i] Excluded Filenames..: %ExcludeNames%
Echo [i] Excluded Files......: %ExcludeFiles%
Echo [i] Log file............: %LogFile%
Echo+
Echo =========================
)>"%LogFile%"

:: Display starting log info.
Type "%LogFile%" | MORE

:: Continue writting log.
(
Echo+
Echo Excluded Files:
Echo ===============
Echo+
)>>"%LogFile%"

Goto:EOF


:EndLog
(
Echo+
Echo [i] Done!
Echo [i] Truncated Files: %TruncatedFileCount% files.
Echo [i] Excluded Files.: %ExcludedFileCount% files.
Echo [i] Elapsed Time...: %ElapsedTime%
Echo+
)>>"%LogFile%"

:: Display ending information.
CLS
Type "%LogFile%"
Goto:EOF


:StartTimer
Set "StartingDate=%Date%"
Set "StarttingTime=%Time:~0,-3%"
Goto :EOF


:StopTimer
(
Echo Minutes = DateDiff^("n", "%StartingDate% %StarttingTime%", Now^)
Echo WScript.Echo Minutes ^& " Minutes"
)>"%TEMP%\%~n0 MinuteDiff.vbs"

For /F "Tokens=*" %%# In (
'Cscript.exe /Nologo "%TEMP%\%~n0 MinuteDiff.vbs"'
) Do (
Set "ElapsedTime=%%#"
)

Goto:EOF


:TakeOwn
(
Takeown.exe /F "%~f1"
ICacls.exe "%~f1" /Grant "%UserName%":"F"
Attrib.exe -R -A -S -H -I "%~f1"
)>NUL || (Exit /B 1)
Goto:EOF


:TruncateFiles
Echo [+] Truncating files with size greater than Zero, this operation could take some minutes long, please wait...
If /I "%~1" EQU "True"  (Call :TruncateHiddenFiles)
If /I "%~1" EQU "False" (Call :TruncateNormalFiles)
Goto:EOF


:TruncateNormalFiles
FOR /R "%WorkingDir%" %%# in ("*") DO (

If %%~z# NEQ 0 (

Set "Exclude="

If Defined ExcludeExts (
(
Echo "%ExcludeExts%" | Find.exe /I "%%~x#" 1>NUL 2>&1
) && (
Call Set "Exclude=True"
)
)

If Defined ExcludeNames (
(
Echo "%ExcludeNames%" | Find.exe /I "%%~nx#" 1>NUL 2>&1
) && (
Call Set "Exclude=True"
)
)

If Defined ExcludeFiles (
(
Echo "%ExcludeFiles%" | Find.exe /I "%%~f#" 1>NUL 2>&1
) && (
Call Set "Exclude=True"
)
)

If Not Defined Exclude (
Set "File=%%~f#"
Call Echo [.] Truncating: %%File:%WorkingDir%=.%%
Call :TakeOwn "%%~f#"
Del /Q "%%~f#"
FSUtil.exe File CreateNew "%%~f#" "0" 1>NUL
Set /A "TruncatedFileCount+=1"
) Else (
Set "File=%%~f#"
Call Echo %%File:%WorkingDir%=.%%>>"%LogFile%"
Set /A "ExcludedFileCount+=1"
)
)
)
Goto:EOF


:TruncateHiddenFiles
FOR /F "Tokens=* Delims=" %%# in ('Dir /B /S /A-D "%WorkingDir%\*"') DO (

If %%~z# NEQ 0 (

Set "Exclude="

If Defined ExcludeExts (
(
Echo "%ExcludeExts%" | Find.exe /I "%%~x#" 1>NUL 2>&1
) && (
Call Set "Exclude=True"
)
)

If Defined ExcludeNames (
(
Echo "%ExcludeNames%" | Find.exe /I "%%~nx#" 1>NUL 2>&1
) && (
Call Set "Exclude=True"
)
)

If Defined ExcludeFiles (
(
Echo "%ExcludeFiles%" | Find.exe /I "%%~f#" 1>NUL 2>&1
) && (
Call Set "Exclude=True"
)
)

If Not Defined Exclude (
Set "File=%%~f#"
Call Echo [.] Truncating: %%File:%WorkingDir%=.%%
Call :TakeOwn "%%~f#"
Del /Q "%%~f#"
FSUtil.exe File CreateNew "%%~f#" "0" 1>NUL
Set /A "TruncatedFileCount+=1"
) Else (
Set "File=%%~f#"
Call Echo %%File:%WorkingDir%=.%%>>"%LogFile%"
Set /A "ExcludedFileCount+=1"
)

)
)
Goto:EOF



REM ===============
REM Error Controls:
REM ===============

:CheckErrors
:: 'IncludeHiddenFiles' Value check.
If /I "%IncludeHiddenFiles%" NEQ "True" If /I "%IncludeHiddenFiles%" NEQ "False" (
Echo [x] Error parsing parameter 'IncludeHiddenFiles',
Echo     value '%IncludeHiddenFiles%' is not a Boolean value.
Pause&Exit
)

Goto:EOF


Saludos
#567
5.0
· Introducción a las características/paquetes de Windows




Windows instala consigo muchas características, algunas son visibles y configurables para el usuario como Windows Media Player e Internet Explorer, pero otras son completamente ocultas por seguridad, como drivers, codecs, Telnet, Reconocimiento de voz, y muchas otras cosas más internas, estas características se distribuyen dentro de "paquetes" los cuales están catalogados y se pueden instalar y/o desinstalar dentro de una imagen WIM, paquetes y características se tratan por separado.


· ¿Que herramientas necesitaremos?
·DISM, para el montaje de la imagen y la eliminación de paquetes y características.
· WIM Registry Tweak Tool, para tomar privilegios necesarios en el Hive montado.






5.1
· Obtener información sobre los paquetes

Primero deben usar DISM para montar la imagen Install.wim del DVD de Windows en un directorio (recuerden montar el índice de imagen que quieren manipular), en el punto 3.2 del tutorial está explicado el procedimiento de montaje usando DISM.

En este ejemplo montaré el índice 1 de mi imagen WIM del DVD original de Windows 8.1, que hace referencia a la edición "Windows 8.1 (Core)", la sintaxis del comando es esta:
Dism.exe /Mount-Image /imageFile:".\Install.wim" /Index:"1" /MountDir:"C:\WinMount"



Seguídamente, para obtener los paquetes visibles y que están instalados en dicha edición/imagen usamos DISM de nuevo usando esta sintaxis:
Dism.exe /Get-Packages /Image:"Directorio de montaje"

El parámetro /Get-Packages indica que se trata de una operación de obtención de información.
En el parámetro /Image debemos indicar el directorio donde previamente hemos montado la imagen WIM.

Ejemplo:
Dism.exe /Get-Packages /Image:"C:\WinMount" /Format:Table



También podemos usar la utilidad WIM Registry Tweak Tool para desocultar los paquetes ocultos y obtener los paquetes, usaremos esta sintaxis:
"WIM Registry Tweak Tool.exe" /p "Directorio de montaje" /l

Ejemplo:
"WIM Registry Tweak Tool.exe" /p "C:\WinMount" /l



Esto nos creará un archivo "Packages.txt" en el directorio de trabajo del WIM Registry Tweak Tool con los nombres de los paquetes existentes:

Packages.txt
Adobe-Flash-For-Windows-Package~31bf3856ad364e35~amd64~~6.3.9600.16384
Microsoft-Windows-InternetExplorer-Optional-Package~31bf3856ad364e35~amd64~es-ES~11.0.9600.16384
Microsoft-Windows-InternetExplorer-Optional-Package~31bf3856ad364e35~amd64~~11.0.9600.16384
Microsoft-Windows-InternetExplorer-Package-shell~31bf3856ad364e35~amd64~es-ES~6.3.9600.16384
Microsoft-Windows-InternetExplorer-Package-shell~31bf3856ad364e35~amd64~~6.3.9600.16384
Microsoft-Windows-InternetExplorer-Package-ua~31bf3856ad364e35~amd64~es-ES~6.3.9600.16384
Microsoft-Windows-InternetExplorer-Package-ua~31bf3856ad364e35~amd64~~6.3.9600.16384
Microsoft-Windows-InternetExplorer-Package~31bf3856ad364e35~amd64~es-ES~11.0.9600.16384
Microsoft-Windows-InternetExplorer-Package~31bf3856ad364e35~amd64~~11.0.9600.16384
...



Nota: Los nombres de los paquetes también los pueden encontrar en el directorio montado: ...\Windows\Servicing\Packages






5.2
· Obtener información sobre las características

Nota: Lista de características de Windows 8.1: http://technet.microsoft.com/en-us/library/dn328991.aspx

Para obtener las carcterísticas que están habilitadas en la imagen de Windows usaremos DISM.

Sintaxis
Dism.exe /Get-Features /Image:"Directorio de montaje" /Format:Table

Ejemplo:
Dism.exe /Get-Features /Image:"C:\WinMount" /Format:Table








5.3
· Eliminar paquetes

Aqui deben tener MUCHO cuidado, ya que muchos paquetes son esenciales para el correcto funcionamiento de windows (Ej: Drivers, NET Framework, etc...), pero una gran mayoria son inutiles y muchos de nosotros no los querremos tener instalados, pudiendo así ahorrar espacio de instalación y consumo de RAM.

Nota: Los archivos asociados a los paquetes no se eliminan del directorio WinSXS, simplemente dejarán una señal de desinstalación pendiente para cuando vayamos a instalar Windows.

La complejidad para eliminar un paquete puede variar, si tienen más de un índice en una imagen Install.wim es muy probable que los paquetes dependan de otras ediciones (índices) y no se pueden eliminar, además DISM puede dar un error de acceso denegado al montar los Hives del registro, así que para asegurarnos de que todo sale bien, primero utilizaremos la utilidad WIM Registry Tweak Tool para montar el registro y tomar los privilegios necesarios de Admin:

Ejecutaremos WIM Registry Tweak Tool usando esta sintaxis:
"WIM Registry Tweak Tool.exe" /p "Directorio de montaje"

Ejemplo:
"WIM Registry Tweak Tool.exe" /p "C:\WinMount"



Ahora ya estamos listos para desinstalar los pquetes que queramos usando DISM (También pueden hacerlo con WIM Registry Tweak Tool, pero es más seguro DISM).

Ejecutaremos DISM con esta sintaxis:
Dism.exe /Remove-Package /PackageName:"Nombre de la característica" /Imaage:"Directorio de montaje"

Ejemplo:
Dism.exe /Remove-Package /PackageName:"microsoft-windows-internetexplorer-optional-package~31bf3856ad364e35~amd64~~119600.16384" /Image:"C:\WinMount"



Listo!






5.4
· Desactivar características

El procedimiento para desactivar características es casi identico al de eliminar paquetes pero sin las mayores dificultades que tiene este otro, y con la diferencia además de que no corren ningún riesgo grave en el funcionamiento del SO por desactivar una característica (siempre la pueden volver a habilitar).

Para desactivar una característica de Windows, ejecutamos DISM usando la siguiente sintaxis:
Dism.exe /Image:"Directorio de montaje" /Disable-Feature /FeatureName:"Nombre de característica"

Ejemplo:
Dism.exe /Image:"C:\WinMount" /Disable-Feature /FeatureName:"WindowsMediaPlayer"







5.5
· Finalizando la eliminación de paquetes y desactivación de características

El último paso que debemos tener en cuenta es desmontar la imagen y aplicar los cambios realizados,
esto lo haremos utilizando DISM con la siguiente sintaxis:
Dism.exe /Unmount-Wim /Commit /MountDir:"Directorio de montaje"

Ejemplo:
Dism.exe /Unmount-Wim /Commit /MountDir:"C:\WinMount"



Nota: Opcionalmente podemos usar la utilidad ImageX para reconstruir la imagen WIM, el manejo de esta operación está explicada en el punto 3.4 del tutorial.






5.6
· Automatizar la eliminación de paquetes

He desarrollado un modo mediante el cual solo necesitan escribir los nombres de los paquetes que quieren eliminar en un archivo de texto y usar un Script Batch, el cual se encargará de Montar, tomar privilegios, eliminar, desmontar y reconstruir, todo de forma automatizada.

Todo lo necesario está incluido en este archivo comprimido:
http://www.mediafire.com/download/mq7o7q7brq6h4ca/WIM_Package_Uninstaller.rar


Una imagen de muestra:



Instrucciones:
Deben crear un archivo llamado "Packages.txt" y añadir los nombres de los paquetes que desenan eliminar (1 nombre por linea).

Ejemplo:
Packages.txt
microsoft-windows-miracast-driver-package~31bf3856ad364e35~amd64~~6.3.9600.16384
microsoft-windows-mobilepc-client-basic-package~31bf3856ad364e35~amd64~es-es~6.3.9600.16384
microsoft-windows-vpnplugins-package~31bf3856ad364e35~amd64~~6.3.9600.16384
microsoft-windows-webcamexperience-package~31bf3856ad364e35~amd64~~6.3.9600.16384


Seguídamente utilizan este Script.

Nota: Deben configurar los valores de las variables que están documentadas en la cabecera del código.

WIM Package Uninstaller.cmd
Código (dos) [Seleccionar]
@Echo OFF



REM =================
REM Console Settings:
REM =================

Title WIM Package Uninstaller - By Elektro
Mode Con Cols=150 Lines=50
CHCP 1252 1>NUL & REM Windows-1252, Spanish-Latin.



REM =====
REM Info:
REM =====

Echo+
Echo  ----------------------------------------------------------------------------------
Echo  This script mounts a Windows Image ^(WIM^) and then removes pre-installed packages
Echo  ----------------------------------------------------------------------------------
Echo+



REM ====================
REM User defined values:
REM ====================

REM This value indicates whether the Windows Image should be mounted.
REM True  = 'DISM' will try to mount the 'WIM' image.
REM False = 'DISM' will not try to mount the WIM image.
REM Set this value to 'FALSE' if the 'WIM' image is already mounted in the specified mount directory,
REM Otherwise, keep it as 'TRUE'.
Set "MountImage=True"

REM This value indicates whether the Windows Image should be unmounted at the end.
REM True  = 'DISM' will try to unmount the 'WIM' image.
REM False = 'DISM' will not try to unmount the WIM image.
REM Set this value to 'FALSE' if you want to keep the image mounted to make other changes,
REM Otherwise, keep it as 'TRUE'.
Set "UnmountImage=True"

REM This value indicates whether the Windows Image should be rebuilt at the end.
REM True  = 'ImageX' will try to rebuild the 'WIM' image.
REM False = 'ImageX' will keep the 'WIM' image as is.
REM Set this value to 'FALSE' if you want to keep the image with normal size to make other changes,
REM Otherwise, keep it as 'TRUE'.
Set "Rebuild=True"

REM This value indicates the 'WIM' image to be mounted.
Set "WindowsImage=%UserProfile%\Desktop\win 8 .1\win\sources\install.wim"

REM This value indicates the Image Index of the 'WIM' image.
Set "ImageIndex=1"

REM This value indicates the directory where to mount the 'WIM' image.
Set "MountDir=%HomeDrive%\WinMount"

REM This value indicates the textfile that contains the names of the packages to remove.
Set "PackageList=%CD%\Packages.txt"

REM This value indicates the ubication of the 'WIM Registry Tweak Tool.exe' file.
Set "WIMRegistryTweakTool=%CD%\Tools\WIM Registry Tweak Tool\WIM Registry Tweak Tool.exe"

REM This value indicates the ubication of 'ImageX.exe' file.
Set "ImageX=%CD%\Tools\Dism\ImageX.exe"

REM This value indicates the ubication of a custom 'DISM.exe' file if needed.
REM Default ubication: "%SystemRoot%\System32\Dism.exe"
Set "Dism=%CD%\Tools\Dism\Dism.exe"

REM This value indicates the ubication of the logfile that will record 'DISM' errors.
Set "DismLogfile=%CD%\%~n0 DISM.log"

REM This value indicates the logging-level of the 'DISM' process.
REM 1 = Errors only
REM 2 = Errors and warnings
REM 3 = Errors, warnings, and informational
REM 4 = All of the information listed previously, plus debug output
Set /A "DismLogLevel=2"

REM This value indicates the ubication of the logfile that will record Main information.
Set "Logfile=%CD%\%~n0.log"



REM =====
REM Main:
REM =====

:: Call Methods.
Call :CheckErrors
Call :CreateLogs
Call :CreateMountDir
Call :GetWIMSizeBefore
Call :StartTimer
Call :Mount
CLS
Call :ParsePackages
CLS
Call :CleanUp
Call :Unmount
Call :Rebuild
Call :StopTimer
Call :GetWIMSizeAfter
Call :EndLog
Pause&Exit



REM ========
REM Methods:
REM ========


:CreateLogs

:: Create the 'DISM' logfile with 'ANSI' encoding,
:: this is necessary to record a non-default 'DISM' loglevel such as '1' or '2'.
Echo+ >"%DismLogfile%"


:: Create the Main logfile and record starting info on it.
Echo+ >"%Logfile%"
(
Echo+
Echo   WIM Package Uninstaller
Echo ===========================
Echo   %DATE% ^| %TIME:~0,-3%
Echo /\/\/\/\/\/\/\/\/\/\/\/\/\/
Echo+
Echo [i] Mount Image?...: %MountImage%
Echo [i] Unmount Image?.: %UnmountImage%
Echo+
Echo [i] Windows Image..: %WindowsImage%
Echo [i] Image Index....: %ImageIndex%
Echo [i] Mount Directory: %MountDir%
Echo+
Echo [i] ImageX Path....: %ImageX%
Echo [i] Dism Path......: %Dism%
Echo [i] Dism Log File..: %DismLogfile%
Echo [i] Dism Log Level.: %DismLogLevel%
Echo+
Echo [i] Package List...: %PackageList%
Echo [i] Log File.......: %Logfile%
Echo+
Echo ===========================
)>"%Logfile%"

:: Display starting log info.
Type "%Logfile%"

:: Continue writting log.
(
Echo+
Echo Package conflicts:
Echo ==================
Echo+
)>>"%LogFile%"
Goto:EOF


:EndLog
(
Echo+
Echo [i] Done!
Echo [i] WIM Image Size Before........: %WIMSizeBefore%
Echo [i] WIM Image Size After.........: %WIMSizeAfter%
Echo [i] Packages Successfully Removed: %PackagesRemovedCount% Packages.
Echo [i] Packages Failed To Remove....: %PackagesFailedCount% Packages.
Echo [i] Packages Not Found...........: %PackagesNotFoundCount% Packages.
Echo [i] Elapsed Time.................: %ElapsedTime%
Echo+
)>>"%LogFile%"

:: Display ending information.
CLS
Type "%LogFile%"
Goto:EOF


:CreateMountDir
:: Create the mount directory.
(
If Not Exist "%MountDir%" If /I "%MountImage%" EQU "True" (
MkDir "%MountDir%" 2>NUL
)
) || (
Echo+
Echo [x] Error trying to create the directory "%MountDir%" to mount the Windows Image.
Echo [i] Ensure that you have Admin rights to create the directory.
Echo [i] Ensure that the directory name does not contains illegal characters.
Echo+
Pause&Exit
)
Goto:EOF


:Mount
:: Mount the Windows Image into the directory.
Echo+
Echo [+] Mounting WIM Image...
If /I "%MountImage%" EQU "True" (

"%Dism%" /Mount-Image /ImageFile:"%WindowsImage%" /Index:"%ImageIndex%" /MountDir:"%MountDir%" /English /LogPath:"%DismLogfile%" /LogLevel:"%DismLogLevel%" || (
Echo+
Echo [x] Error mounting the Image Index "%ImageIndex%" in "%MountDir%"
Echo [i] Ensure that the Image Index exist.
Echo [i] Ensure that you have Admin rights to write inside the directory.
Echo [i] Ensure that the directory is not already mounted.
Echo [i] Ensure that the directory is fully empty.
Echo+
REM Try to unmount the failed image and discard changes.
If /I "%UnmountImage%" EQU "True" (
Echo [+] Unmounting and discarding changes...
"%Dism%" /Unmount-WIM /Discard /MountDir:"%MountDir%"
)
Pause&Exit
)

)
Goto:EOF


:CleanUp
Echo [+] CleaningUp WIM Image...
"%Dism%" /CleanUp-Image /StartComponentCleanUp /Image:"%MountDir%" /English /LogPath:"%DismLogfile%" /LogLevel:"%DismLogLevel%" /Quiet
Echo+
Goto:EOF


:Unmount
:: Unmount the Windows Image commiting changes.
Echo [+] Unmounting WIM Image...
If /I "%UnmountImage%" EQU "True" (
"%Dism%" /Unmount-WIM /Commit /MountDir:"%MountDir%" /English /LogPath:"%DismLogfile%" /LogLevel:"%DismLogLevel%"
)
Goto:EOF


:Rebuild
If /I "%Rebuild%" EQU "False" (Goto:EOF)

Echo+
Echo [+] Rebuilding WIM image...

("%ImageX%" /Compress Maximum /Export "%WindowsImage%" "*" "%TEMP%\Rebuilt Image.wim" /Check) && (
Del /Q /F "%WindowsImage%" 1>NUL
Move /Y "%TEMP%\Rebuilt Image.wim" "%WindowsImage%" 1>NUL
) || (
Echo [x] Error rebuilding Image "%WindowsImage%" to "%TEMP%\Rebuilt Image.wim".
)

Goto :EOF


:StartTimer
Set "StartingDate=%Date%"
Set "StarttingTime=%Time:~0,-3%"
Goto :EOF


:StopTimer
(
Echo Minutes = DateDiff^("n", "%StartingDate% %StarttingTime%", Now^)
Echo WScript.Echo Minutes ^& " Minutes"
)>"%TEMP%\%~n0 MinuteDiff.vbs"

For /F "Tokens=*" %%# In (
'Cscript.exe /Nologo "%TEMP%\%~n0 MinuteDiff.vbs"'
) Do (
Set "ElapsedTime=%%#"
)

Goto:EOF


:WriteConvertBytesScript
If Exist "%TEMP%\%~n0 Convert Bytes.vbs" (Goto:EOF)
(
Echo Suffix = Array^("Bytes", "KB", "MB", "GB", "TB"^)
Echo+
Echo Function Convert^(Bytes^)
Echo Convert = convert0^(Bytes, 0^)
Echo End Function
Echo+
Echo Function Convert0^(Bytes, Level^)
Echo If Bytes ^>= 1024 Then
Echo Bytes = Round^(Bytes / 1024, 2^)
Echo Level = Level + 1
Echo Convert0 = Convert0^(Bytes, Level^)
Echo End If
Echo Convert0 = Bytes ^& " " ^& Suffix^(Level^)
Echo End Function
Echo+
Echo WScript.Echo Convert^(WScript.Arguments^(0^)^)
)>"%TEMP%\%~n0 Convert Bytes.vbs"
Goto:EOF


:GetWIMSizeBefore
Call :WriteConvertBytesScript
For %%# in ("%WindowsImage%") Do (Set "WIMSizeBefore=%%~z#")
For /F "Tokens=*" %%# In (
'Cscript.exe /Nologo "%TEMP%\%~n0 Convert Bytes.vbs" "%WIMSizeBefore%"'
) Do (
Set "WIMSizeBefore=%%#"
)
Del /Q "%TEMP%\%~n0 Convert Bytes.vbs"
Goto:EOF


:GetWIMSizeAfter
Call :WriteConvertBytesScript
For %%# in ("%WindowsImage%") Do (Set "WIMSizeAfter=%%~z#")
For /F "Tokens=*" %%# In (
'Cscript.exe /Nologo "%TEMP%\%~n0 Convert Bytes.vbs" "%WIMSizeAfter%"'
) Do (
Set "WIMSizeAfter=%%#"
)
Del /Q "%TEMP%\%~n0 Convert Bytes.vbs"
Goto:EOF


:ParsePackages

Set /A "PackagesRemovedCount=0"
Set /A "PackagesFailedCount=0"
Set /A "PackagesNotFoundCount=0"

:: Unhide packages and take registry ownership.
"%WIMRegistryTweakTool%" /p "%MountDir%"
Echo+

:: Remove Packages.
For /F "UseBackQ Tokens=* Delims=" %%# In ("%PackageList%") Do (

Echo [+] Removing package: %%~#

"%Dism%" /Remove-Package /PackageName:"%%~#" /Image:"%MountDir%" /English /LogPath:"%DismLogfile%" /LogLevel:"%DismLogLevel%" /Quiet 1>NUL
   Call Set /A "ExitCode=%%Errorlevel%%"

   (Call Echo "%%ExitCode%%"| Findstr.exe "^\"0\"$" 1>NUL 2>&1) && (
    Call Set /A "PackagesRemovedCount+=1"
   )

(Call Echo "%%ExitCode%%"| Findstr.exe "^\"5\"$" 1>NUL 2>&1) && (
Call Set /A "PackagesFailedCount+=1"
Echo Failed to remove package: %%~#>>"%LogFile%"
)

(Call Echo "%%ExitCode%%"| Find.exe "-2146498555" 1>NUL 2>&1) && (
Call Set /A "PackagesNotFoundCount+=1"
Echo Package is not installed: %%~#>>"%LogFile%"
)

)
Goto:EOF



REM ====================
REM File Error Controls:
REM ====================

:CheckErrors
:: WIM File Error-Check.
If /I "MountImage" EQU "True" If Not Exist "%WindowsImage%" (
Echo [x] Windows Image not found at: "%WindowsImage%" | MORE
Pause&Exit
)

:: PackageList File Error-Check.
If Not Exist "%PackageList%" (
Echo [x] PackageList not found at: "%PackageList%" | MORE
Pause&Exit
)

:: 'DISM.exe' File Error-Check.
If Not Exist "%DISM%" (
Echo [x] 'DISM' process not found at: "%DISM%" | MORE
Pause&Exit
)

:: 'ImageX.exe' File Error-Check.
If Not Exist "%ImageX%" (
Echo [x] 'ImageX' process not found at: "%ImageX%" | MORE
Pause&Exit
)

:: 'WIM Registry Tweak Tool.exe' File Error-Check.
If Not Exist "%WIMRegistryTweakTool%" (
Echo [x] 'WIM Registry Tweak Tool' process not found at: "%WIMRegistryTweakTool%" | MORE
Pause&Exit
)


Goto:EOF



Que lo disfruten! ...e intenten no joder Windows eliminando paquetes esenciales para el SO!






5.7
· Automatizar la desactivación de características

Todo lo necesario está incluido en este archivo comprimido:
http://www.mediafire.com/download/lq4sc56ri59klod/WIM_Feature_Uninstaller.rar


Una imagen de muestra:



Instrucciones:
Deben crear un archivo de texto con el nombre "Features.txt" y añadir los nombres de las características que que quieren deshabilitar, 1 nombre por cada linea.

Ejemplo:
Features.txt
DirectPlay
FaxServicesClientPackage
Internet-Explorer-Optional-amd64
Microsoft-Windows-MobilePC-LocationProvider-INF
MicrosoftWindowsPowerShellV2
MicrosoftWindowsPowerShellV2Root
Printing-Foundation-InternetPrinting-Client
Printing-XPSServices-Features
WindowsMediaPlayer
Xps-Foundation-Xps-Viewer



Seguídamente deben usar este Script que he desarrollado el cual se encarga de hacer todas las tareas necesarias.

Nota: Deben configurar los valores de las variables que están documentadas en la cabecera del código.

WIM Feature Uninstaller.cmd
Código (dos) [Seleccionar]
@Echo OFF



REM =================
REM Console Settings:
REM =================

Title WIM Feature Uninstaller - By Elektro
Mode Con Cols=150 Lines=50
CHCP 1252 1>NUL & REM Windows-1252, Spanish-Latin.



REM =====
REM Info:
REM =====

Echo+
Echo  -----------------------------------------------------------------------------
Echo  This script mounts a Windows Image ^(WIM^) and then disables Windows features
Echo  -----------------------------------------------------------------------------
Echo+



REM ====================
REM User defined values:
REM ====================

REM This value indicates whether the Windows Image should be mounted.
REM True  = 'DISM' will try to mount the 'WIM' image.
REM False = 'DISM' will not try to mount the WIM image.
REM Set this value to 'FALSE' if the 'WIM' image is already mounted in the specified mount directory,
REM Otherwise, keep it as 'TRUE'.
Set "MountImage=True"

REM This value indicates whether the Windows Image should be unmounted at the end.
REM True  = 'DISM' will try to unmount the 'WIM' image.
REM False = 'DISM' will not try to unmount the WIM image.
REM Set this value to 'FALSE' if you want to keep the image mounted to make other changes,
REM Otherwise, keep it as 'TRUE'.
Set "UnmountImage=True"

REM This value indicates whether the Windows Image should be rebuilt at the end.
REM True  = 'ImageX' will try to rebuild the 'WIM' image.
REM False = 'ImageX' will keep the 'WIM' image as is.
REM Set this value to 'FALSE' if you want to keep the image with normal size to make other changes,
REM Otherwise, keep it as 'TRUE'.
Set "Rebuild=True"

REM This value indicates the 'WIM' image to be mounted.
Set "WindowsImage=%UserProfile%\Desktop\win 8 .1\win\sources\install.wim"

REM This value indicates the Image Index of the 'WIM' image.
Set "ImageIndex=1"

REM This value indicates the directory where to mount the 'WIM' image.
Set "MountDir=%HomeDrive%\WinMount"

REM This value indicates the textfile that contains the names of the features to disable.
Set "FeatureList=%CD%\Features.txt"

REM This value indicates the ubication of 'ImageX.exe' file.
Set "ImageX=%CD%\Tools\Dism\ImageX.exe"

REM This value indicates the ubication of a custom 'DISM.exe' file if needed.
REM Default ubication: "%SystemRoot%\System32\Dism.exe"
Set "Dism=%CD%\Tools\Dism\Dism.exe"

REM This value indicates the ubication of the logfile that will record 'DISM' errors.
Set "DismLogfile=%CD%\%~n0 DISM.log"

REM This value indicates the logging-level of the 'DISM' process.
REM 1 = Errors only
REM 2 = Errors and warnings
REM 3 = Errors, warnings, and informational
REM 4 = All of the information listed previously, plus debug output
Set /A "DismLogLevel=2"

REM This value indicates the ubication of the logfile that will record Main information.
Set "Logfile=%CD%\%~n0.log"



REM =====
REM Main:
REM =====

:: Call Methods.
Call :CheckErrors
Call :CreateLogs
Call :CreateMountDir
Call :GetWIMSizeBefore
Call :StartTimer
Call :Mount
CLS
Call :ParseFeatures
CLS
Call :CleanUp
Call :Unmount
Call :Rebuild
Call :StopTimer
Call :GetWIMSizeAfter
Call :EndLog
Pause&Exit



REM ========
REM Methods:
REM ========


:CreateLogs

:: Create the 'DISM' logfile with 'ANSI' encoding,
:: this is necessary to record a non-default 'DISM' loglevel such as '1' or '2'.
Echo+ >"%DismLogfile%"


:: Create the Main logfile and record starting info on it.
Echo+ >"%Logfile%"
(
Echo+
Echo   WIM Feature Uninstaller
Echo ===========================
Echo   %DATE% ^| %TIME:~0,-3%
Echo /\/\/\/\/\/\/\/\/\/\/\/\/\/
Echo+
Echo [i] Mount Image?...: %MountImage%
Echo [i] Unmount Image?.: %UnmountImage%
Echo+
Echo [i] Windows Image..: %WindowsImage%
Echo [i] Image Index....: %ImageIndex%
Echo [i] Mount Directory: %MountDir%
Echo+
Echo [i] Dism Path......: %Dism%
Echo [i] Dism Log File..: %DismLogfile%
Echo [i] Dism Log Level.: %DismLogLevel%
Echo+
Echo [i] Feature List...: %FeatureList%
Echo [i] Log File.......: %Logfile%
Echo+
Echo ===========================
)>"%Logfile%"

:: Display starting log info.
Type "%Logfile%"

:: Continue writting log.
(
Echo+
Echo Feature conflicts:
Echo ==================
Echo+
)>>"%LogFile%"
Goto:EOF


:EndLog
(
Echo+
Echo [i] Done!
Echo [i] WIM Image Size Before.........: %WIMSizeBefore%
Echo [i] WIM Image Size After..........: %WIMSizeAfter%
Echo [i] Features Successfully Disabled: %FeaturesRemovedCount% Packages.
Echo [i] Features Failed To Disable....: %FeaturesFailedCount% Packages.
Echo [i] Features Not Found............: %FeaturesNotFoundCount% Packages.
Echo [i] Elapsed Time..................: %ElapsedTime%
Echo+
)>>"%LogFile%"

:: Display ending information.
CLS
Type "%LogFile%"
Goto:EOF


:CreateMountDir
:: Create the mount directory.
(
If Not Exist "%MountDir%" If /I "%MountImage%" EQU "True" (
MkDir "%MountDir%" 2>NUL
)
) || (
Echo+
Echo [x] Error trying to create the directory "%MountDir%" to mount the Windows Image.
Echo [i] Ensure that you have Admin rights to create the directory.
Echo [i] Ensure that the directory name does not contains illegal characters.
Echo+
Pause&Exit
)
Goto:EOF


:Mount
:: Mount the Windows Image into the directory.
Echo+
Echo [+] Mounting WIM Image...
If /I "%MountImage%" EQU "True" (

"%Dism%" /Mount-Image /ImageFile:"%WindowsImage%" /Index:"%ImageIndex%" /MountDir:"%MountDir%" /English /LogPath:"%DismLogfile%" /LogLevel:"%DismLogLevel%" || (
Echo+
Echo [x] Error mounting the Image Index "%ImageIndex%" in "%MountDir%"
Echo [i] Ensure that the Image Index exist.
Echo [i] Ensure that you have Admin rights to write inside the directory.
Echo [i] Ensure that the directory is not already mounted.
Echo [i] Ensure that the directory is fully empty.
Echo+
REM Try to unmount the failed image and discard changes.
If /I "%UnmountImage%" EQU "True" (
Echo [+] Unmounting and discarding changes...
"%Dism%" /Unmount-WIM /Discard /MountDir:"%MountDir%"
)
Pause&Exit
)

)
Goto:EOF


:CleanUp
Echo [+] CleaningUp WIM Image...
"%Dism%" /CleanUp-Image /StartComponentCleanUp /Image:"%MountDir%" /English /LogPath:"%DismLogfile%" /LogLevel:"%DismLogLevel%" /Quiet
Echo+
Goto:EOF


:Unmount
:: Unmount the Windows Image commiting changes.
Echo [+] Unmounting WIM Image...
If /I "%UnmountImage%" EQU "True" (
"%Dism%" /Unmount-WIM /Commit /MountDir:"%MountDir%" /English /LogPath:"%DismLogfile%" /LogLevel:"%DismLogLevel%"
)
Goto:EOF


:Rebuild
If /I "%Rebuild%" EQU "False" (Goto:EOF)

Echo+
Echo [+] Rebuilding WIM image...

("%ImageX%" /Compress Maximum /Export "%WindowsImage%" "*" "%TEMP%\Rebuilt Image.wim" /Check) && (
Del /Q /F "%WindowsImage%" 1>NUL
Move /Y "%TEMP%\Rebuilt Image.wim" "%WindowsImage%" 1>NUL
) || (
Echo [x] Error rebuilding Image "%WindowsImage%" to "%TEMP%\Rebuilt Image.wim".
)

Goto :EOF


:StartTimer
Set "StartingDate=%Date%"
Set "StarttingTime=%Time:~0,-3%"
Goto :EOF


:StopTimer
(
Echo Minutes = DateDiff^("n", "%StartingDate% %StarttingTime%", Now^)
Echo WScript.Echo Minutes ^& " Minutes"
)>"%TEMP%\%~n0 MinuteDiff.vbs"

For /F "Tokens=*" %%# In (
'Cscript.exe /Nologo "%TEMP%\%~n0 MinuteDiff.vbs"'
) Do (
Set "ElapsedTime=%%#"
)

Goto:EOF


:WriteConvertBytesScript
If Exist "%TEMP%\%~n0 Convert Bytes.vbs" (Goto:EOF)
(
Echo Suffix = Array^("Bytes", "KB", "MB", "GB", "TB"^)
Echo+
Echo Function Convert^(Bytes^)
Echo Convert = convert0^(Bytes, 0^)
Echo End Function
Echo+
Echo Function Convert0^(Bytes, Level^)
Echo If Bytes ^>= 1024 Then
Echo Bytes = Round^(Bytes / 1024, 2^)
Echo Level = Level + 1
Echo Convert0 = Convert0^(Bytes, Level^)
Echo End If
Echo Convert0 = Bytes ^& " " ^& Suffix^(Level^)
Echo End Function
Echo+
Echo WScript.Echo Convert^(WScript.Arguments^(0^)^)
)>"%TEMP%\%~n0 Convert Bytes.vbs"
Goto:EOF


:GetWIMSizeBefore
Call :WriteConvertBytesScript
For %%# in ("%WindowsImage%") Do (Set "WIMSizeBefore=%%~z#")
For /F "Tokens=*" %%# In (
'Cscript.exe /Nologo "%TEMP%\%~n0 Convert Bytes.vbs" "%WIMSizeBefore%"'
) Do (
Set "WIMSizeBefore=%%#"
)
Del /Q "%TEMP%\%~n0 Convert Bytes.vbs"
Goto:EOF


:GetWIMSizeAfter
Call :WriteConvertBytesScript
For %%# in ("%WindowsImage%") Do (Set "WIMSizeAfter=%%~z#")
For /F "Tokens=*" %%# In (
'Cscript.exe /Nologo "%TEMP%\%~n0 Convert Bytes.vbs" "%WIMSizeAfter%"'
) Do (
Set "WIMSizeAfter=%%#"
)
Del /Q "%TEMP%\%~n0 Convert Bytes.vbs"
Goto:EOF


:ParseFeatures

Set /A "FeaturesRemovedCount=0"
Set /A "FeaturesFailedCount=0"
Set /A "FeaturesNotFoundCount=0"

:: Disable Features.
For /F "UseBackQ Tokens=* Delims=" %%# In ("%FeatureList%") Do (

Echo [+] Disabling Feature: %%~#

"%Dism%" /Disable-Feature /FeatureName:"%%~#" /Image:"%MountDir%" /English /LogPath:"%DismLogfile%" /LogLevel:"%DismLogLevel%" /Quiet 1>NUL
   Call Set /A "ExitCode=%%Errorlevel%%"

   (Call Echo "%%ExitCode%%"| Findstr.exe "^\"0\"$" 1>NUL 2>&1) && (
    Call Set /A "FeaturesRemovedCount+=1"
   )

(Call Echo "%%ExitCode%%"| Findstr.exe "^\"5\"$" 1>NUL 2>&1) && (
Call Set /A "FeaturesFailedCount+=1"
Echo Failed to disable feature: %%~#>>"%LogFile%"
)

(Call Echo "%%ExitCode%%"| Find.exe "-2146498548" 1>NUL 2>&1) && (
Call Set /A "FeaturesNotFoundCount+=1"
Echo Feature is not found.....: %%~#>>"%LogFile%"
)

)
Goto:EOF



REM ====================
REM File Error Controls:
REM ====================

:CheckErrors

:: WIM File Error-Check.
If /I "MountImage" EQU "True" If Not Exist "%WindowsImage%" (
Echo [x] Windows Image not found at: "%WindowsImage%" | MORE
Pause&Exit
)

:: FeatureList File Error-Check.
If Not Exist "%FeatureList%" (
Echo [x] FeatureList not found at: "%FeatureList%" | MORE
Pause&Exit
)

:: 'DISM.exe' File Error-Check.
If Not Exist "%DISM%" (
Echo [x] 'DISM' process not found at: "%DISM%" | MORE
Pause&Exit
)

:: 'ImageX.exe' File Error-Check.
If Not Exist "%ImageX%" (
Echo [x] 'ImageX' process not found at: "%ImageX%" | MORE
Pause&Exit
)

Goto:EOF
#568
Scripting / [APORTE] [BATCH] Folders2List
12 Abril 2014, 00:31 AM
Hola

Este Script es el hermano de este otro Script, genera un archivo de texto que contiene la lista de estructura de carpetas del directorio de trabajo y de sus subdirectorios, el directorio de trabajo se puede modificar en las variables del Script, y la lista de capetas se registra usando la ruta relativa de los archivos de dicho directorio de trabajo.

El Script tiene 2 métodos de listar las carpetas, que son: 1. Listado normal, y 2. Listado incluyendo carpetas ocultas.
El Script tiene la funcionalidad de medir el tiempo transcurrido de la operación.

Todo lo que he mencionado se puede configurar en las variables que están documentadas con comentarios de ayuda en el código.

· Una imagen de muestra:


· El código:

Folders2List.cmd
Código (dos) [Seleccionar]
@Echo OFF



REM =================
REM Console Settings:
REM =================

Title Folders2List - By Elektro
Mode Con Cols=150 Lines=50
CHCP 1252 1>NUL & REM Windows-1252, Spanish-Latin.



REM =====
REM Info:
REM =====

Echo+
Echo  ------------------------------------------------------------------------------------------------------------------------------------
Echo  This script writes a textfile containing the relative paths of the folder structure at the working directory and it's subdirectories
Echo  ------------------------------------------------------------------------------------------------------------------------------------
Echo+



REM ====================
REM User defined values:
REM ====================

REM This value indicates the directory where to list it's folder structure.
Set "WorkingDir=%CD%"

REM This value indicates the resulting folder list.
Set "OutputFile=%CD%\Folders.txt"

REM This value indicates how the hidden folders are threated when listing the folder structure.
REM  True = List folders and also folders with the 'hidden' attribute.
REM False = List only normal folders without the 'hidden' attribute.
Set "IncludeHiddenFolders=True"



REM =====
REM Main:
REM =====

:: Display starting info.
Echo [i] Working Directory...: %WorkingDir%
Echo [i] Output file.........: %OutputFile%
Echo [i] Include Hidden Files: %IncludeHiddenFolders%
Echo+

:: Call Methods.
Call :CheckErrors
Call :StartTimer
Call :ListFolders "%IncludeHiddenFolders%"
Call :StopTimer

:: Finish.
Echo [i] Done!           | MORE
Echo [i] Listed Folders: %FolderCount% folders.
Echo [i] Elapsed Time..: %ElapsedTime%
Echo+
Pause&Exit



REM ========
REM Methods:
REM ========

:StartTimer
Set "StartingDate=%Date%"
Set "StarttingTime=%Time:~0,-3%"
Goto :EOF


:StopTimer
(
Echo Minutes = DateDiff^("n", "%StartingDate% %StarttingTime%", Now^)
Echo WScript.Echo Minutes ^& " Minutes"
)>"%TEMP%\%~n0 MinuteDiff.vbs"

For /F "Tokens=*" %%# In (
'Cscript.exe /Nologo "%TEMP%\%~n0 MinuteDiff.vbs"'
) Do (
Set "ElapsedTime=%%#"
)

Goto:EOF


:ListFolders
Echo [+] Collecting folders, this operation could take some minutes long, please wait...
If /I "%~1" EQU "True"  (Call :ListHiddenFolders)
If /I "%~1" EQU "False" (Call :ListNormalFolders)
Goto:EOF


:ListNormalFolders
(FOR /D /R "%WorkingDir%" %%# in ("*") DO (
Set "Folder=%%~f#"
Call Echo %%Folder:%WorkingDir%=.%%
Set /A "FolderCount+=1"
))>"%OutputFile%"
Goto:EOF


:ListHiddenFolders
(FOR /F "Tokens=* Delims=" %%# in ('Dir /B /S /AD "%WorkingDir%\*"') DO (
Set "Folder=%%~f#"
Call Echo %%Folder:%WorkingDir%=.%%
Set /A "FolderCount+=1"
))>"%OutputFile%"
Goto:EOF



REM ===============
REM Error Controls:
REM ===============

:CheckErrors
:: 'IncludeHiddenFolders' Value check.
If /I "%IncludeHiddenFolders%" NEQ "True" If /I "%IncludeHiddenFolders%" NEQ "False" (
Echo [x] Error parsing parameter 'IncludeHiddenFolders',
Echo     value '%IncludeHiddenFolders%' is not a Boolean value.
Pause&Exit
)

Goto:EOF
#569
Scripting / [APORTE] [BATCH] Files2List
11 Abril 2014, 23:34 PM
Hola

He escrito este Script el cual genera un archivo de texto que contiene la lista de archivos con la estructura de archivos del directorio de trabajo y de sus subdirectorios, el directorio de trabajo se puede modificar en las variables del Script, y la lista de archivos en el archivo de listado se registra usando rutas relativa de los archivos de dicho directorio de trabajo.

¿Porque en Batch si siempre me estoy quejando de este "lenguaje"?, para recordar viejos tiempos y porque tuve que escribirlo y testearlo diréctamente desde una VM, con otro lenguaje habria sido aún más coñazo estar testeando de la VM al PC host y viceversa.

Bueno, el script tiene 3 métodos de exclusión de archivos, que son: 1. Por extensión, 2. Por nombres, o 3. Por ruta absoluta, esta última está limitada a la capacidad de caracteres que puede tener un String en Batch (Int32).
El Script tiene 2 métodos de listar los archivos, que son: 1. Listado normal, y 2. Listado incluyendo archivos ocultos.
El Script también tiene capacidad de registrar unformación básica en un Log, y la funcionalidad de medir el tiempo transcurrido de la operación.

Todo lo que he mencionado se puede configurar en las variables que están documentadas con comentarios de ayuda en el código.

Nota: Al explotar la limitada capacidad de Batch añadiendo varias funcionalidades adicionales a un código, este se vuelve demasiado lento, ya que Batch por naturaleza es MUY lento para trabajar, así que ya aviso, si no necesitan excluir archivos entonces no asignen ningún valor en las variables de exclusión.

PD: En el log se guardan las rutas relativas de los archivos que hayan sido excluidas:

Files2List.log
CitarExcluded Files:
===============

.\Filesize Truncator.bat
.\Folders2List.bat
.\Windows\WinSxS\Get Manifests.bat


· Una imagen de muestra:



· El código:

Files2List.cmd
Código (dos) [Seleccionar]
@Echo OFF



REM =================
REM Console Settings:
REM =================

Title Files2List - By Elektro
Mode Con Cols=150 Lines=50
CHCP 1252 1>NUL & REM Windows-1252, Spanish-Latin.



REM =====
REM Info:
REM =====

Echo+
Echo  ----------------------------------------------------------------------------------------------------------------------------------
Echo  This script writes a textfile containing the relative paths of the file structure at the working directory and it's subdirectories
Echo  ----------------------------------------------------------------------------------------------------------------------------------
Echo+



REM ====================
REM User defined values:
REM ====================

REM This value indicates the directory where to list it's file structure.
Set "WorkingDir=%CD%"

REM This value indicates the resulting file list.
Set "OutputFile=%CD%\Files.txt"

REM This value indicates the ubication of the logfile that will record info.
Set "Logfile=%CD%\%~n0.log"

REM This value indicates the File-Extensions to exclude during the process.
REM ( Use an ';' delimiter to separate multiple extensions )
Set "ExcludeExts=.bat;.cmd"

REM This value indicates the filenames to exclude during the process.
REM ( Use an ';' delimiter to separate multiple filenames )
Set "ExcludeNames=%~nx0"

REM This value indicates the files to exclude during the process.
REM ( Use an ';' delimiter to separate multiple files )
Set "ExcludeFiles=%OutputFile%;%Logfile%"

REM This value indicates how the hidden files are threated when listing the file structure.
REM  True = List files and also files with the 'hidden' attribute.
REM False = List only normal files without the 'hidden' attribute.
Set "IncludeHiddenFiles=True"



REM =====
REM Main:
REM =====

:: Call Methods.
Call :CheckErrors
Call :CreateLog
Call :StartTimer
Call :ListFiles "%IncludeHiddenFiles%"
Call :StopTimer
Call :EndLog
Pause&Exit



REM ========
REM Methods:
REM ========

:CreateLog
:: Create the Script Logfile and record starting info on it.
FSutil.exe File CreateNew "%LogFile%" "0" 1>NUL
(
Echo+
Echo       Files 2 List
Echo =========================
Echo   %DATE% ^| %TIME:~0,-3%
Echo /\/\/\/\/\/\/\/\/\/\/\/\/
Echo+
Echo [i] Working Directory...: %WorkingDir%
Echo [i] Include Hidden Files: %IncludeHiddenFiles%
Echo+
Echo [i] Excluded Extensions.: %ExcludeExts%
Echo [i] Excluded Filenames..: %ExcludeNames%
Echo [i] Excluded Files......: %ExcludeFiles%
Echo+
Echo [i] Output file.........: %OutputFile%
Echo [i] Log file............: %LogFile%
Echo+
Echo =========================
)>"%LogFile%"

:: Display starting log info.
Type "%LogFile%" | MORE

:: Continue writting log.
(
Echo+
Echo Excluded Files:
Echo ===============
Echo+
)>>"%LogFile%"

Goto:EOF


:EndLog
(
Echo+
Echo [i] Done!           | MORE
Echo [i] Listed Files..: %ListedFileCount% files.
Echo [i] Excluded Files: %ExcludedFileCount% files.
Echo [i] Elapsed Time..: %ElapsedTime%
Echo+
)>>"%LogFile%"

:: Display ending information.
CLS
Type "%LogFile%"
Goto:EOF


:StartTimer
Set "StartingDate=%Date%"
Set "StarttingTime=%Time:~0,-3%"
Goto :EOF


:StopTimer
(
Echo Minutes = DateDiff^("n", "%StartingDate% %StarttingTime%", Now^)
Echo WScript.Echo Minutes ^& " Minutes"
)>"%TEMP%\%~n0 MinuteDiff.vbs"

For /F "Tokens=*" %%# In (
'Cscript.exe /Nologo "%TEMP%\%~n0 MinuteDiff.vbs"'
) Do (
Set "ElapsedTime=%%#"
)

Goto:EOF


:ListFiles
Echo [+] Collecting files, this operation could take some minutes long, please wait...
If /I "%~1" EQU "True"  (Call :ListHiddenFiles)
If /I "%~1" EQU "False" (Call :ListNormalFiles)
Goto:EOF


:ListNormalFiles
(FOR /R "%WorkingDir%" %%# in ("*") DO (

Set "Exclude="

If Defined ExcludeExts (
(
Echo "%ExcludeExts%" | Find.exe /I "%%~x#" 1>NUL 2>&1
) && (
Call Set "Exclude=True"
)
)

If Defined ExcludeNames (
(
Echo "%ExcludeNames%" | Find.exe /I "%%~nx#" 1>NUL 2>&1
) && (
Call Set "Exclude=True"
)
)

If Defined ExcludeFiles (
(
Echo "%ExcludeFiles%" | Find.exe /I "%%~f#" 1>NUL 2>&1
) && (
Call Set "Exclude=True"
)
)

If Not Defined Exclude (
Set "File=%%~f#"
Call Echo %%File:%WorkingDir%=.%%
Set /A "ListedFileCount+=1"
) Else (
Set "File=%%~f#"
Call Echo %%File:%WorkingDir%=.%%>>"%LogFile%"
Set /A "ExcludedFileCount+=1"
)

))>"%OutputFile%"
Goto :EOF


:ListHiddenFiles
(FOR /F "Tokens=* Delims=" %%# in ('Dir /B /S /A-D "%WorkingDir%\*"') DO (

Set "Exclude="

If Defined ExcludeExts (
(
Echo "%ExcludeExts%" | Find.exe /I "%%~x#" 1>NUL 2>&1
) && (
Call Set "Exclude=True"
)
)

If Defined ExcludeNames (
(
Echo "%ExcludeNames%" | Find.exe /I "%%~nx#" 1>NUL 2>&1
) && (
Call Set "Exclude=True"
)
)

If Defined ExcludeFiles (
(
Echo "%ExcludeFiles%" | Find.exe /I "%%~f#" 1>NUL 2>&1
) && (
Call Set "Exclude=True"
)
)

If Not Defined Exclude (
Set "File=%%~f#"
Call Echo %%File:%WorkingDir%=.%%
Set /A "ListedFileCount+=1"
) Else (
Set "File=%%~f#"
Call Echo %%File:%WorkingDir%=.%%>>"%LogFile%"
Set /A "ExcludedFileCount+=1"
)

))>"%OutputFile%"
Goto:EOF



REM ===============
REM Error Controls:
REM ===============

:CheckErrors
:: 'IncludeHiddenFiles' Value check.
If /I "%IncludeHiddenFiles%" NEQ "True" If /I "%IncludeHiddenFiles%" NEQ "False" (
Echo [x] Error parsing parameter 'IncludeHiddenFiles',
Echo     value '%IncludeHiddenFiles%' is not a Boolean value.
Pause&Exit
)

Goto:EOF


Espero que a alguien le sirva de utilidad.

Saludos!
#570
4.0
· Personalizando la estética de la instalación de Windows



Ahora que ya sabemos automatizar la instalación de Windows... hagámosla bonita, ¿no?, cambiemosle todas las "florituras" y colores  >:D.

En esta parte del tutorial aprenderemos a personalizar las imágenes que usa el instalador de Windows, y de esta manera lo pondré punto y final a la personalización de la instalación, ya llegaremos a lo verdaderamente interesante en los siguientes volumenes del tutorial ;).

Nota: Se aconseja un cierto nivel de conocimientos sobre la edición de imágenes BMP (Bitmap) y sus transparencias, y opcionalmente conocimientos de archivos ICO (Iconos).

Nota: Vuelvo a recordar que este tutorial está basado y orientado en una imagen ISO de Windows 8.1 x64.


· ¿Que herramientas necesitaremos?
 Un editor de recursos, recomiendo la aplicación Restorator 2009, puero pueden usar Resource Hacker, Anolis Resourcer, o su herramienta favorita.
 Un editor de imágenes, recomiendo la aplicación Photoshop, pero pueden usar Microsoft Paint , cualquier otro e incluso pueden descargar imágenes (válidas) de Internet.
 Opcional: Un grabador de imágenes ISO para testear nuestra instalación personalizada, recomiendo la herramienta OSCDIMG que se encuentra ubicada en %WinKit%\oscdimg\oscdimg.exe
 Opcional: Una máquina virtual para testear la ISO, recomiendo la aplicación VirtualBox.






4.1
· Ubicación de los recursos de imágenes de la instalación

Dentro del DVD de Windows hay 3 librerías que contienen imágenes Bitmap e Iconos:
· ...\Sources\spwizimg.dll
· ...\Sources\w32uiimg.dll
· ...\Sources\arunimg.dll

Y el archivo Bitmap ubicado en ...\Sources\Background.bmp

Aparte, los mismos archivos se encuentran dentro de la imagen Boot.wim en las mismas ubicaciones, y esos archivos dentro de la imagen son las que debemos modificar.

Dentro de la imagen Boot.wim además hay otro archivo Bitmap ubicado en ...\Windows\System32\Setup.bmp

Nota: Si queremos hacer una modificación muy básica entonces solo debemos tener en cuenta la librería spwizimg.dll


Este es el contenido de las 3 librerías:

Nota: Los números son el nombre del recurso.


· spwizimg.dll

Bitmaps:



· w32uiimg.dll

Bitmaps:


Iconos:



· arunimg.dll

Bitmaps:


Iconos:








4.2
· Identificando los recursos de imagen que utiliza el instalador


Estos son los nombres de algunos recursos Bitmap que se usan en la instalación de Windows, en el punto 3.1 del tutorial pueden enlazar el nombre del recurso para saber en que librería se encuentra.























4.3
· Modificando los recursos de imágenes

Pueden modificar los recursos de las librerías que se encuentran en el DVD de Windows, pero les recuerdo que los recursos que nos interesan modificar son los de las librerías que se encuentran dentro de la imagen Boot.wim (la cual ya expliqué como se puede montar en el punto 3.2 del tutorial), se encuentran en el índice de imagen 2.

En este punto la verdad es que no puedo ayudar mucho ni creo poder dar explicaciones útiles, es cosa tuya saber como editar una imagen y reemplazarla con un editor de recursos, si no sabes... ¿para que leiste hasta aquí?. ¡ ánimo !






4.3
· Automatizar la tarea de personalización de recursos de imágenes

...¿Te creiste que no iba a ayudar? >:D
Al empezar este tutorial dije que iba a proporcionar todas mis herramientas y creaciones en todos los temas, así que si te parece algo complicado la edición de recursos entonces estás de suerte!

Voy a explicar una manera muy sencilla de automatizar todo este tutorial utilizando un Script Batch y un archivo de texto, pero antes que nada quiero comentarles que en este enlace pueden descargar todo lo necesario que voy a comentar, y un ejemplo completo con imagenes y PSD's, para los que no les guste leer instrucciones largas :P

http://www.mediafire.com/download/bf17fpnjpqi30fd/WIM_Resource_Replacer.zip

Actualizado:
http://www.mediafire.com/download/ktzms7i09qt4n2b/wim+resource+replacer+0.2.rar


Estas son las instrucciones:

Por un lado deben descargar el editor de recursos Anolis Resourcer, ¿porque?, porque es con el que yo manejo de manera commandline :P
Lo pueden descargar aquí: http://anolis.codeplex.com/releases/view/32286

Por otro lado deben conocer las ubicaciones de las librerías que quieren modificar y/o archivos que quieren reemplazar, en el caso de las librerías deben conocer también los nombres de los recursos que quieren modificar (los tienen en el punto 4.1 del tutorial), y obviamente también deben tener las imagenes modificadas.

Conociendo y teniendo los archivos necesarios que acabo de mencionar, deben crear un archivo de texto delimitado por puntos y comas, estos archivos los parseará/procesará el script que luego les mostraré.

La sintaxis que deben usar para delimitar los recursos en el archivo de texto, para reemplazar archivos es:
Ruta relativa del archivo que va a ser reemplazado;Ruta relativao absoluta del archivo que se copiará

La sintaxis que deben usar para delimitar los recursos en el archivo de texto, para librerías de recursos de imágenes es:
Ruta relativa del recurso a modificar;Nombre del recurso;Ruta del recurso modificado

Nota: ¡ No se debe escribir la ruta absoluta del directorio montado !


Lean esta ayuda que escribí para entender la sintaxis del archivo de texto delimitado:

CitarResourceList Help - By Elektro
##############################


========================
To add or replace files:
========================

Syntax: OutFile;InFile

· Outfile:
 Indicates the file that will be Created/Replaced.
 Should be written as a relative mount filepath.

· InFile:
 Indicates the file that will be copied to the OutFile.
 Should be written as an absolute filepath.


Examples:
---------
Sources\Background.bmp;.\Resources\Background.bmp
Sources\Background.bmp;C:\Resources\Background.bmp


=====================
To replace resources:
=====================

Syntax: ResourceFile;ResourceName;InResource

· ResourceFile:
 Indicates the dll file that will be opened to replace resources inside.
 Should be written as a relative mount filepath.

· ResourceName:
 Indicates the resource name that will be replaced inside the resource file.

· InResource:
 Indicates the resource to copy inside the resource file.
 Should be written as an absolute filepath.


Examples:
---------
Sources\spwizimg.dll;517;.\Resources\517.bmp
Sources\spwizimg.dll;517;C:\Resources\517.bmp


Esto es un ejemplo de un archivo delimitado escrito de forma correcta:

Resources.txt
Sources\Background.bmp;.\Resources\Background.bmp
Windows\System32\Setup.bmp;.\Resources\Setup.bmp

Sources\spwizimg.dll;405;.\Resources\405.bmp
Sources\spwizimg.dll;407;.\Resources\407.bmp
Sources\spwizimg.dll;408;.\Resources\408.bmp
Sources\spwizimg.dll;516;.\Resources\516.bmp
Sources\spwizimg.dll;517;.\Resources\517.bmp

Sources\w32uiimg.dll;207;.\Resources\207.bmp



A continuación, lo único que tienen que hacer es ejecutar este Script, el Script se encargará de montar la imagen, reemplazar archivos (si especificaron alguno) y/o reemplazar recursos de imagenes si especificaron alguno, después desmontará la imagen y listo.

Antes de poder automatizar esta tarea usando mi Script primero deben configurar las rutas de los valores WindowsImage, MountDir, Anolis, Dism, y ResourceList que se encuentran documentados en la cabecera del archivo.


WIM Resource Replacer.bat
Código (dos) [Seleccionar]
@Echo Off & Title WIM Resource Replacer - By Elektro
Mode Con Cols=150 Lines=50



REM ======
REM About:
REM ======

:: Header Info.
Echo+
Echo -----------------------------------------------------------------------------------------
Echo This script mounts a Windows Image ^(WIM^) to replace image resources of a resource file.
Echo -----------------------------------------------------------------------------------------
Echo+



REM ====================
REM User defined values:
REM ====================

:: User defined values.
REM This value indicates whether the Windows Image should be mounted.
REM True  = 'DISM' will try to mount the 'WIM' image.
REM False = 'DISM' will not try to mount the WIM image.
REM Set this value to 'FALSE' if the 'WIM' image is already mounted in the specified mount directory,
REM Otherwise, keep it as 'TRUE'.
Set "MountImage=True"

REM This value indicates whether the Windows Image should be unmounted at the end.
REM True  = 'DISM' will try to unmount the 'WIM' image.
REM False = 'DISM' will not try to unmount the WIM image.
REM Set this value to 'FALSE' if you want to keep the image mounted to make other changes,
REM Otherwise, keep it as 'TRUE'.
Set "UnmountImage=True"

REM This value indicates the 'WIM' image to be mounted.
Set "WindowsImage=%UserProfile%\Desktop\win 8 .1\win\sources\Boot.wim"

REM This value indicates the Image Index of the 'WIM' image.
Set "ImageIndex=2"

REM This value indicates the directory where to mount the 'WIM' image.
Set "MountDir=%HomeDrive%\WinBootMount"

REM This value indicates the location of Anolis Resourcer 'Anolis.exe' file.
Set "Anolis=%CD%\Tools\Anolis.exe"

REM This value indicates the textfile that contains the Recource files to replace.
Set "ResourceList=%CD%\Resources.txt"

REM This value indicates the location of a custom 'DISM.exe' file if needed.
REM Default location:
REM "%SystemRoot%\System32\Dism.exe"
Set "Dism=%CD%\Tools\Dism\Dism.exe"

REM This value indicates the location of the logfile that will record 'DISM' exceptions.
Set "DismLogfile=%UserProfile%\Desktop\Dism.log"

REM This value indicates the logging-level of the 'DISM' process.
REM 1 = Errors only
REM 2 = Errors and warnings
REM 3 = Errors, warnings, and informational
REM 4 = All of the information listed previously, plus debug output
Set /A "DismLogLevel=2"



REM =====
REM Main:
REM =====

Call :CheckErrors
Call :CreateLog
Call :CreateMountDir
Call :Mount
CLS
Call :ParseResources
Call :Unmount

Echo+
Echo [i] Done!
Pause&Exit



REM ========
REM Methods:
REM ========

:CreateLog
:: Create the 'DISM' logfile with 'ANSI' encoding,
:: this is necessary to record a non-default 'DISM' loglevel such as '1' or '2'.
Echo+ >"%DismLogfile%"

:: Record initial info.
(
Echo+
Echo Automated DISM processing:
Echo ==========================
Echo+
Echo WIM Resource Replacer
Echo+
Echo [i] Date: %DATE% - %TIME:~0,2%:%TIME:~3,2%:%TIME:~6,2%
Echo+
Echo [i] Mount Image?...: %MountImage%
Echo [i] Unmount Image?.: %UnmountImage%
Echo+
Echo [i] Windows Image..: %WindowsImage%
Echo [i] Image Index....: %ImageIndex%
Echo [i] Mount Directory: %MountDir%
Echo+
Echo [i] Dism Path......: %Dism%
Echo [i] Dism Logfile...: %DismLogfile%
Echo [i] Dism Log Level.: %DismLogLevel%
Echo+
Echo [i] Anolis Path....: %Anolis%
Echo+
Echo ===========================
)>"%DismLogfile%"

:: Display initial info.
Type "%DismLogfile%"
Goto:EOF

:CreateMountDir
:: Create the mount directory.
(
If Not Exist "%MountDir%" If /I "%MountImage%" EQU "True" (
MkDir "%MountDir%" 2>NUL
)
) || (
Echo+
Echo [X] Error trying to create the directory "%MountDir%" to mount the Windows Image.
Echo [i] Ensure that you have Admin rights to create the directory.
Echo [i] Ensure that the directory name does not contains illegal characters.
Echo+
Pause&Exit
)
Goto:EOF

:Mount
:: Mounts the Windows Image into the mount directory.
If /I "%MountImage%" EQU "True" (

"%Dism%" /Mount-Image /ImageFile:"%WindowsImage%" /Index:"%ImageIndex%" /MountDir:"%MountDir%" /English /LogPath:"%DismLogfile%" /LogLevel:"%DismLogLevel%" || (
Echo+
Echo [X] Error mounting the Image Index "%ImageIndex%" in "%MountDir%"
Echo [i] Ensure that the Image Index exist.
Echo [i] Ensure that you have Admin rights to write inside the directory.
Echo [i] Ensure that the directory is not already mounted.
Echo [i] Ensure that the directory is fully empty.
Echo+
REM Try to unmount the failed image and discard changes.
If /I "%UnmountImage%" EQU "True" (
"%Dism%" /Unmount-WIM /Discard /MountDir:"%MountDir%"
)
Exit
)

)
Goto:EOF

:ParseResources
For /F "UseBackQ Tokens=1,2,* Delims=;" %%a In ("Resources.txt") Do (

If /I "%%~xa" EQU ".dll" (Call :ReplaceResource "%MountDir%\%%~a" "%%~b" "%%~c")
If /I "%%~xa" NEQ ".dll" (Call :CopyFile        "%MountDir%\%%~a" "%%~b")

)
Goto:EOF

:Unmount
:: Unmount the Windows Image commiting changes.
If /I "%UnmountImage%" EQU "True" (
"%Dism%" /Unmount-WIM /Commit /MountDir:"%MountDir%" /English /LogPath:"%DismLogfile%" /LogLevel:"%DismLogLevel%"
)
Goto:EOF

:TakeOwn
Takeown.exe /F "%~f1" 1>NUL
ICacls.exe "%~f1" /Grant "%UserName%":"F"  1>NUL
Goto:EOF

:CopyFile
Echo [+] Copying "%~2" to "%~1"
If Not Exist "%~2" (
Echo [X] Can't locate the input file "%~2". | MORE
Goto:EOF
)
Call :TakeOwn  "%~f1"
Copy /Y "%~f2" "%~f1" 1>NUL
Goto:EOF

:ReplaceResource
Echo [+] Replacing Resource Name "%~2" with "%~3" in resource file "%~f1"
If Not Exist "%~1" (
Echo [X] Can't locate the resource file to open "%~1". | MORE
Goto:EOF
)
If Not Exist "%~3" (
Echo [X] Can't locate the resource to copy "%~3". | MORE
Goto:EOF
)

Call :TakeOwn "%~1"

If /I "%~x3" EQU ".bmp" (
Start /W "Anolis" "%Anolis%" -op:upd -src:"%~f1" -type:Bitmap -name:"%~2" -lang:1033 -file:"%~f3")
)
If /I "%~x3" EQU ".ico" (
Start /W "Anolis" "%Anolis%" -op:upd -src:"%~f1" -type:Icon -name:"%~2" -lang:1033 -file:"%~f3")
)

Goto:EOF


REM ====================
REM File Error Controls:
REM ====================

:CheckErrors
:: WIM File Error-Check.
If /I "MountImage" EQU "True" If Not Exist "%WindowsImage%" (
Echo [X] Windows Image not found in: "%WindowsImage%" | MORE
Pause&Exit
)

:: ResourceList File Error-Check.
If Not Exist "%ResourceList%" (
Echo [X] Resource-List file not found in: "%ResourceList%" | MORE
Pause&Exit
)

:: DISM File Error-Check.
If Not Exist "%DISM%" (
Echo [X] DISM process not found in: "%DISM%" | MORE
Pause&Exit
)

:: Anolis Resourcer File Error-Check.
If Not Exist "%Anolis%" (
Echo [X] Anolis process not found in: "%Anolis%" | MORE
Pause&Exit
)

Goto:EOF






4.4
· Obteniendo resultados

Una vez hayan montado la imagen Boot.wim para modificar los recursos de imágenes que queramos, deben desmontar la imagen WIM y guardar los cambios (lease el punto 3.3 del tutorial si no sabes hacerlo).

Nota: Si usaste mi Script para reemplazar recursos entonces no tienes porque desmontar nada.

Ya solo nos quedará generar la ISO y testearla en un DVD, ¡¡ aquí os muestro el resultado visual del ejemplo que hice para este tutorial !! :
















¡ Les invito a postear sus modificaciones en este tema !
#571

Información actualizada el 12/04/2014





3.0
Introducción a DISM

No quería tener que explicar el uso de DISM tan pronto, pero lo vamos a necesitar para casi todo, así que mejor aprendanlo ya (quien no sepa hacerlo).

DISM es una herramienta CLI (CommandLine Interface) que como su nombre indica se maneja por linea de comandos, por consola.

Con DISM podemos montar una imagen WIM a un directorio (es decir, extraer su contenido) para realizar cambios en la imagen, los cambios se pueden hacer con DISM o accediendo al directorio montado manualmente desde el Explorer, con DISM también podemos aplicar actualizaciones, drivers, ycaracteristicas de windows, o podemos eliminarlos.

También podemos capturar, cortar o agregar imagenes a una imagen WIM.

Nota: Usen siempre que puedan la versión específica de DISM para la imagen que vayamos a "tocar" el cual debería estar en la ubicación %WinKit%\Dism\Dism.exe si siguieron la parte del tutorial donde instalaron WAIK/WADK.

Nota: Para quien quiera saberlo, existen interfaaces gráficas de usuario (GUI) de la aplicación DISM, obviamente no es Software oficial de Microsoft ni aprobado por el mismo, y dichas GUIS  manejan la versión instalada de DISM, yo les recomiendo acostumbrarse a usar DISM por consola de forma tradicional, luego lo agradecerán con los Scripts automatizados que les mostraré.

Nota: Leerse la ayuda del comando quien quiera conocer otros parámetros útiles que no pienso comentar hasta otros volumenes del tutorial, escribir en consola:
Dism.exe /?






3.1
· Obtener información de una imagen WIM

Como expliqué en la primera parte del tutorial, una imagen WIM puede contener varios índices de imagenes, porfavor, leer el punto 1.2 de mi tutorial si no saben de que estoy hablando.

Si no conocemos el índice de la imagen que queremos montar, podemos usar el comando DISM para obtener información acerca de los índices.

La sintaxis del comando sería esta:

Dism.exe /Get-ImageInfo /ImageFile:"Imagen.wim"

El parámetro /Get-ImageInfo indica que se trata de una operación de obtención de información.
En el parámetro /ImageFile debemos indicar la ruta del archivo WIM la cual queremos obtener información.

Ejemplo:
Dism.exe /Get-ImageInfo /ImageFile:".\Boot.wim"








3.2
· Como montar una imagen WIM

En este ejemplo montaremos la imagen 2 del archivo Boot.wim del DVD de Windows que se encuentra ubicado en ...\Sources\Boot.wim.


La sintaxis del comando sería esta:

Dism.exe /Mount-Image /ImageFile:"Imagen.wim" /Index:"Índice de imagen" /MountDir:"Directorio de montaje"

El parámetro /Mount-Image indica que se trata de una operación de montaje.
En el parámetro /ImageFile debemos indicar la ruta del archivo WIM que queremos montar.
En el parámetro /Index debemos indicar el índice de la imagen que queremos montar.
En el parámetro /MountDir debemos indicar el directorio donde se va a montar la imagen WIM, el directorio debe existir y debe estar vacío, de lo contrario dará error.

Ejemplo:

MKDir "C:\WinPE Mount"
.\Dism.exe /Mount-Image /ImageFile:"%CD%\Boot.wim" /Index:"2" /MountDir:"C:\WinPE Mount"







A partir de aquí pueden dejar volar su imaginación para hacer modificaciones en el sistema de archivos, o usando DISM para aplicar cosas a la imagen, cosas que no explicaré hasta mucho más tarde.

Nota: No pueden volver a montar la imagen en el mismo ni en otro directorio mientras siga montada.






3.3
· Como desmontar una imagen WIM

Después de realizar cambios en una imagen WIM, esta tiene que desmontarse, podemos desmontarla y aplicar los cambios realizados, o podemos omitirlos (ningún cambio se aplicará).

Nota: Al desmontar una imagen, el directorio de montaje queda completamente vacío.


La sintaxis del comando para desmontar una imagen y aplicar cambios sería esta:

Dism.exe /Unmount-WIM /Commit /MountDir:"Directorio montado"

El parámetro /Unmount-Image indica que se debe realizar una operación de desmontaje.
El parámetro /Commit indica que se deben aplicar los cambios realizados en la imagen.
En el parámetro /MountDir debemos indicar el directorio donde se haya montado la imagen WIM.

Ejemplo:
Dism.exe /Unmount-WIM /Commit /MountDir:"C:\WinPE Mount"




La sintaxis del comando para desmontar una imagen sin aplicar cambios sería esta:

Dism.exe /Unmount-WIM /Discard /MountDir:"Directorio montado"

El parámetro /Unmount-Image indica que se debe realizar una operación de desmontaje.
El parámetro /Discard indica que no se deben aplicar los cambios realizados en la imagen.
En el parámetro /MountDir debemos indicar el directorio donde se haya montado la imagen WIM.

Ejemplo:
Dism.exe /Unmount-WIM /Discard /MountDir:"C:\WinPE Mount"









3.4
· Como reconstruir una imagen WIM

Opcionalmente y después de desmontar una imagen, podemos usar la utilidad ImageX que está instalada en el directorio %WinKit%\Dism\ImageX.exe para comprimir y reconstruir la imagen WIM, optimizando así el espacio.

Sintaxis:
ImageX /Export "Imagen de origen.wim" "índice" "Imagen de destino.wim" /Compress "Tipo de compresión" /Check

El parámetro /Export indica que se debe realizar una operación de exportación y debemos especificar por este orden la imagen WIM que queremos reconstruir, el índice de imagen (se puede usar un asterisco para marcar todos los índices), y la imagen resultante.
En el parámetro Compress debemos especificar el tipo de compresión entre los posibles tipos, que son: none, Fast, Maximum.
El parámetro /Check es opcional e indica que se debe comprobar la integridad de la imagen.

Ejemplo:
ImageX /Export ".\Install.wim" "*" ".\New Install.wim" /Compress "Maximum"

#572
Hola

Me gustaría poder convertir unos cuantos posts de elhacker.net a formato PDF para su lectura.

El problema es que al usar cualquier servicio online HTML 2 PDF la conversión aparece con la típica publicidad y banners que le salen a un usuario no registrado en el foro, y a mi me gustaría hacerlo algo más decente sin esa publicidad...

No se si es muy descabellado preguntar si existe algún servicio online (o software de escritorio) parecido donde puedas especificar el user/pass de la página para obtener un PDF "real", quizás sea bastante peligroso por el hecho de tener que especificar tu login en una página ajena...

¿Se les ocurre alguna alternativa que no sea muy 'manual'?, los posts que quiero convertir a PDF son mios y puedo obtener el código en HTML, con sus tags, y todo eso.
He creado muy pocos documentos PDF en mi vida, pero estoy abierto a sugerencias de Software, tener en cuenta que no quiero convertir simple texto a PDF, sino HTML con sus tags (e imágenes).

Saludos!
#573
2.0
· Introducción a Windows System Image Manager

Esta parte del tutorial nos servirá para empezar por algo sencillo (¡aunque aquí nada es sencillo!) y automatizar el proceso más esencial de la instalación, la propia instalación (es decir, el instalador del DVD de Windows), configurremos ciertos valores pre-establecidos, como por ejemplo el nombre de usuario, la imagen a instalar por defecto, la configuración de Red y Firewall, etc, omitiendo así cualquier ventana molesta de la instalación.

En este tema no se va a tratar la personalización estética de la instalación (BMP's, PNG's), ya que eso no se consigue con WSIM, esto es para personalizar otros aspectos más internos de la instalación, la personalización estética quizás lo veamos más adelante en otro volumen, ya que tiene mayor grado de complejidad y esto es más básico.

( Llámenme raro, pero... no hay nada que me moleste más que la parte de la instalación de Windows 8 donde no te da opción a especificar una cuenta de usuario local, tienes que pulsar un botoncito obligatoriamente "iniciar sesión usando una cuenta de Microsoft"...! para luego poder indicar que prefieres ingresar mediante una cuenta local ( una opción de la que muy pocos se dan cuenta la primera vez!, yo tuve que buscar en Google como coño ingresar un nombre de usuario local en la maldita instalación hecha por y para Microsoft ), Gracias por hacernos la vida tan sencilla, Microsoft, ¡pero sabemos como evadir tus trucos de marketing!. )

Si han leido la definición de lo que es un archivo de respuesta entonces habran leido que se trata de un archivo XML, y XML, para quien no lo sepa, es un lenguaje de programación, pero no hay que preocuparse, no es necesario saber programación de ningún tipo para crear este archivo.

Cabe mencionar que cada versión de la instalación de Windows dispone de unos valores personalizables que otras versiones no tienen o a las que no son aplicables, y quiero recordar con esto que este tutorial está basado en una imagen de Windows 8.1 x64.






2.1
· Creando un archivo de instalación desatendida (AutoUnattend.xml)

Bueno, ya basta de cháchara, empecemos!

Lo primero de todo, ejecutamos WSIM que se encuentra ubicado en %WinKit%\WSIM\imgmgr.exe.

Nota: Reconozco que la interfaz gráfica de usuario del programa no es muy amistosa y al principio puede resultar una pesadilla manejar este Software, casi prefiero recomendarles que lean más tutoriales aparte del mio, donde profundicen en el manejo de WSIM.

Debemos cargar nuestra imagen de Windows, Hacemos click en el menú Archivo > Seleccionar imagen de Windows, y abrimos la imagen Install.wim del DVD de Windows, y seleccionamos la imagen que vayamos a instalar (home, professional, etc) en el caso de que exista más de 1 imagen en el WIM.



Nos preguntará si queremos crear un archivo de catálogo, y le respondemos



La generación del catálogo tardará unos pocos minutos.



Cuando el catálogo se haya generado, lo veremos reflejado en la esquina inferior izquierda del programa, aquí se encuentra todos los componentes que podemos personalizar en la instalación, me referiré a ellos como "Componentes".



Ahora hacemos click en el menú Archivo > Nuevo archivo de respuesta y nos generará un archivo de respuesta vacío donde podremos ver varias secciones, a estas secciones me referiré como "Pasos"








2.2
· Entendiendo los pasos de la instalación de Windows

...¿Y ahora que?.

Ahora basicamente lo que debemos hacer es ir agregando componentes haciendo click derecho sobre él, para agregarlo al paso adecuada de nuestro archivo de respuesta vacío, y así es como se configura un valor.  

Nota: La lista de todos los componentes, sus descripciones, y los valores aplicables paraa cada versión de Windows específica: http://technet.microsoft.com/es-es/library/ff699038.aspx
 Si no entienden algo del tutorial siempre van a poder encontrar la respuesta en ese enlace.

Nota: Hay que tener muy en cuenta que si establecen un valor de forma incorrecta, esto podría imposibilitar la instalación de Windows y mostrará un error respecto al archivo de respuesta, sepan lo que están haciendo, pueden joder la instalación así que les recomiendo testear el proceso de instalación desatendida en una máquina virtual.

Hay 7 pasos distintos, y esto es para lo que sirve cada uno de ellos:

windowsPE
Configura las opciones de WinPE y las opciones básicas de instalación de Windows.
Estas opciones pueden incluir el establecimiento de la clave del producto y la configuración de un disco.

offlineServicing
Aplica las actualizaciones a una imagen de Windows.
También aplica paquetes, incluyendo correcciones de software (fixes), paquetes de idioma y otras actualizaciones de seguridad.
Durante este paso, puede agregar drivers de una imagen de Windows antes de instalar esa imagen.

specialize
Crea y aplica información específica del sistema.
Por ejemplo, puede configurar los ajustes de red, ajustes internacionales de la hora y el idioma, y la información del dominio.

generalize
Le permite configurar mínimamente el comando '/generalize' de sysprep, así como configurar otros ajustes de Windows que debe persistir en su imagen de referencia.
El comando '/generalize' de sysprep elimina información específica del sistema.
Por ejemplo, el identificador de seguridad único (SID) y otras configuraciones específicas de hardware se eliminan de la imagen.
La fase 'generalize' sólo se ejecuta si se ejecuta el comando '/generalize' de sysprep.

auditSystem
Procesa la configuración de instalación desatendida mientras Windows se está ejecutando en el contexto de sistema, antes de que un usuario inicie sesión en el equipo en modo de auditoría.
El usuario de auditoría sólo se ejecuta si se arranca en modo auditoría.

auditUser
Procesa la configuración de instalación desatendida después de que un usuario inicie sesión en el equipo en modo de auditoría.
El usuario de auditoría sólo se ejecuta si se arranca en modo auditoría.

oobeSystem
Aplica la configuración a Windows antes de que Windows inicie la pantalla de bienvenida (Windows Welcome, OOBE).






2.3
· Configurando los componentes del archivo de instalación desatendida (AutoUnattend.xml)

Empecemos a configurar (algunas) cosas...

· Omitir la configuración de idioma del instalador

Agregamos el componente Microsoft-Windows-International-Core-WinPE al paso WinPE



Y en la tabla de propiedades asignamos el valor del idioma que queramos, en mi caso es-ES, esto lo hacemos en todas las propiedades, menos la que he dejado vacía.

 

Agregamos el componente Microsoft-Windows-International-Core al paso Specialize y también al paso oobeSystem, y aplicamos los mismos valores que antes:



 

Nota: Lista de abreviaciones de otros lenguajes de Windows: http://msdn.microsoft.com/en-ie/goglobal/bb896001.aspx


· Omitir la selección de la imagen de Windows

La selección de la imagen es cuando el instalador te pregunta que edición de Windows quieres instalar (Home, professional, ultimate, etc...)

Agregamos el componente Microsoft-Windows-Setup > ImageInstall > OSImage al paso WinPE y aplicamos estos valores:

WillShowUI = OnError





En el subcomponente Microsoft-Windows-Setup > ImageInstall > OSImage > InstallFrom > Metadata podemos especificar la imagen basada en un índice (0, 1, 2, etc) o por el nombre de la imagen, en mi caso el nombre que hace referencia a la edición Core de Windows 8.1 es "Windows 8.1", así que estos serían los valores correctos:

Action = AddListItem
Key = /IMAGE/NAME
Value= Windows 8.1




· Omitir la activación del producto, establecer un serial.

Agregamos el componente Microsoft-Windows-Security-SPP-UX al paso Specialize y aplicamos estos valores:

SkipAutoActivation = True



Agregamos el componente Microsoft-Windows-Setup > UserData > ProductKey al paso WinPE y aplicamos una clave válida de activación, en mi caso uso la clave pública Trial:

Key = 334NH-RXG76-64THK-C7CKG-D3VPT





Agregamos el componente Microsoft-Windows-Shell-Setup al paso Specialize y aplicamos la misma clave de activación:

ProductKey = 334NH-RXG76-64THK-C7CKG-D3VPT






· Omitir la configuración horaria.

Agregamos el componente Microsoft-Windows-Shell-Setup al paso Specialize y también al paso oobeSystem y aplicamos estos valores:

Para los que vivan en España (GMT+01:00 Brussels, Copenhagen, Madrid, Paris):
TimeZone = Romance Standard Time

Para los que vivan en otro lugar:
http://msdn.microsoft.com/en-us/library/ms912391%28v=winembedded.11%29.aspx






· Omitir la configuración del nombre del PC.

Agregamos el componente Microsoft-Windows-Shell-Setup al paso Specialize y aplicamos el nombre que queramos que el PC tenga por defecto:

ComputerName = Nombre





Nota: El nombre del equipo tiene un límite de 15 caracteres, si lo sobrepasan la instalación dará error.


· Omitir la creación del nombre de usuario.

( Para windows 7 es bastante distinto, esto es para windows +8 )

Agregamos el componente Microsoft-Windows-Shell-Setup > UserAccounts > LocalAccounts > LocalAccount al paso oobeSystem y aplicamos estos valores:

Action = AddListItem

La descripción de la cuenta de usuario:
Description = Descripción

El nombre de la cuenta:
Name = Nombre de usuario
Nota: Si usan el nombre Administrator como hago yo entonces se activará la cuenta oculta de Administrador y tendrán todos los privilegios de acceso a cualquier archivo/carpeta sin necesidad de modificar los permisos en el futuro :)

El nombre que se mostrará:
DisplayName = Nombre a mostrar

El Grupo de usuarios:
Group = Administrators
Nota: Grupo Administradores.






· Omitir la pantalla de selección de usuario (Auto-Loguearse).

Agregamos el componente Microsoft-Windows-Shell-Setup > AutoLogon al paso Specialize y también al paso oobeSystem y aplicamos estos valores:

Enabled = True

El número de veces que la cuenta se ha usado:
LogonCount = 1

El nombre de la cuenta de usuario que hemos creador previamente:
Username = Nombre de usuario






· Deshabilitar UAC (User Account Controls)

Agregamos el componente Microsoft-Windows-LUA-Settings al paso offlineServicing y aplicamos estos valores:

EnableLUA = False






· Omitir la configuración OOBE (Aceptar EULA, Configurar el tipo de Red, configurar Proteger tu PC, etc...)

Agregamos el componente Microsoft-Windows-Shell-Setup > OOBE al paso oobeSystem y aplicamos estos valores:

Esconder los términos legales de Microsoft:
HideEULAPage = True

Esconder la página de registro OEM:
HideOEMRegistrationScreen = True

Esconder la página de "Unirse a una red":
HideWirelessSetupInOOBE = True

Especifica si se requiere que un usuario online se deba loguear durante el OOBE.
HideOnlineAccountScreens = True

Especifica el tipo de red:
NetworkLocation = Home
Nota: Otros tipos de red: http://technet.microsoft.com/es-es/library/ff715386.aspx

Configura la opción de "Ayudenos a proteger su PC y mejorar Windows":
ProtectYourPC = 3
Nota: Otros valores: http://technet.microsoft.com/es-es/library/ff716385.aspx





Nota: Los últimos dos parámetros de la imagen están vacios porque no son aplicables a Windows +8, pero pueden usarlos en Windows 7 para omitir la creación del usuario.

Agregamos el componente Microsoft-Windows-Setup al paso WinPE y aplicamos estos valores:

Habilitar la Red:
EnableFNetwork = True

Habilitar el Firewall de Windows:
EnableFirewall = True





En el sub-componente Microsoft-Windows-Setup > UserData aplicamos estos valores:

Aceptar términos legales de Microsoft:
AcceptEULA = True








2.4
· Finalizando el archivo de instalación desatendida (AutoUnattend.xml)

Una vez hayamos terminado de configurar todo lo que queramos, debemos validar el archivo de respuesta para comprobar que todos los valores que hemos introducido son correctos y no hay conflictos en el archivo XML.

Hacer click en el menú Herramientas > Validar archivo de configuración





Nota: Si hubiese cualquier error nos indicaría el componente y el valor conflictivo.


Ya solo nos queda guardar el archivo XML, lo guardaremos con el nombre AutoUnattend.xml y en el mismo directorio del DVD de instalación de Windows (de otra manera el instalador de Windows no tomará nuestro archivo desatendido en cuenta):



Así es como debería quedarla estructura de archivos del DVD:








2.5
· Ejemplos de un archivo de instalación desatendida (AutoUnattend.xml)

En el directorio ubicado en %WinKit%\Samples\Unattend disponen de varias plantillas de distinta arquitectura (x64/x86) que pueden estudiar:



De todas formas también les proporcionaré mi archivo de instalación desatendida por si lo quieren usar (solo sirve para Windows 8.1 Core x64), es completamente desatendido menos la selección de la partición donde instalar Windows (ya que me parece algo peligroso), y quizás quieran modificar el nombre de usuario y esas cosas... :

Código (xml) [Seleccionar]
<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend">
   <settings pass="windowsPE">
       <component name="Microsoft-Windows-International-Core-WinPE" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
           <UserLocale>es-ES</UserLocale>
           <UILanguageFallback>es-ES</UILanguageFallback>
           <UILanguage>es-ES</UILanguage>
           <SystemLocale>es-ES</SystemLocale>
           <InputLocale>es-ES</InputLocale>
           <SetupUILanguage>
               <UILanguage>es-ES</UILanguage>
           </SetupUILanguage>
       </component>
       <component name="Microsoft-Windows-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
           <Display>
               <HorizontalResolution>1920</HorizontalResolution>
               <VerticalResolution>1080</VerticalResolution>
               <ColorDepth>32</ColorDepth>
           </Display>
           <UserData>
               <ProductKey>
                   <WillShowUI>OnError</WillShowUI>
                   <Key>334NH-RXG76-64THK-C7CKG-D3VPT</Key>
               </ProductKey>
               <AcceptEula>true</AcceptEula>
               <Organization>Elektro Studios</Organization>
               <FullName>Elektro</FullName>
           </UserData>
           <EnableNetwork>true</EnableNetwork>
           <EnableFirewall>true</EnableFirewall>
           <Restart>Restart</Restart>
           <ImageInstall>
               <OSImage>
                   <InstallFrom>
                       <MetaData wcm:action="add">
                           <Key>/IMAGE/NAME</Key>
                           <Value>Windows 8.1</Value>
                       </MetaData>
                   </InstallFrom>
                   <WillShowUI>OnError</WillShowUI>
               </OSImage>
           </ImageInstall>
       </component>
   </settings>
   <settings pass="specialize">
       <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
           <AutoLogon>
               <Enabled>true</Enabled>
               <LogonCount>1</LogonCount>
               <Username>Administrator</Username>
           </AutoLogon>
           <ComputerName>Elektro-PC</ComputerName>
           <ProductKey>334NH-RXG76-64THK-C7CKG-D3VPT</ProductKey>
           <RegisteredOrganization>Elektro Studios</RegisteredOrganization>
           <TimeZone>Romance Standard Time</TimeZone>
           <WindowsFeatures>
               <ShowInternetExplorer>false</ShowInternetExplorer>
               <ShowMediaCenter>false</ShowMediaCenter>
               <ShowWindowsMediaPlayer>false</ShowWindowsMediaPlayer>
           </WindowsFeatures>
           <Themes>
               <WindowColor>0</WindowColor>
           </Themes>
           <DisableAutoDaylightTimeSet>false</DisableAutoDaylightTimeSet>
           <BluetoothTaskbarIconEnabled>false</BluetoothTaskbarIconEnabled>
       </component>
       <component name="Microsoft-Windows-HelpAndSupport" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
           <HelpAndSupport>
               <Manufacturer>Elektro Studios</Manufacturer>
           </HelpAndSupport>
       </component>
       <component name="Microsoft-Windows-International-Core" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
           <UserLocale>es-ES</UserLocale>
           <UILanguageFallback>es-ES</UILanguageFallback>
           <UILanguage>es-ES</UILanguage>
           <SystemLocale>es-ES</SystemLocale>
           <InputLocale>es-ES</InputLocale>
       </component>
       <component name="Microsoft-Windows-Security-SPP-UX" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
           <SkipAutoActivation>true</SkipAutoActivation>
       </component>
       <component name="Microsoft-Windows-ErrorReportingCore" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
           <DisableWER>1</DisableWER>
       </component>
   </settings>
   <settings pass="oobeSystem">
       <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
           <OOBE>
               <HideEULAPage>true</HideEULAPage>
               <ProtectYourPC>3</ProtectYourPC>
               <NetworkLocation>Home</NetworkLocation>
               <HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>
               <HideOnlineAccountScreens>true</HideOnlineAccountScreens>
               <HideOEMRegistrationScreen>true</HideOEMRegistrationScreen>
               <HideLocalAccountScreen>true</HideLocalAccountScreen>
           </OOBE>
           <VisualEffects>
               <FontSmoothing>On</FontSmoothing>
               <SystemDefaultBackgroundColor>0</SystemDefaultBackgroundColor>
           </VisualEffects>
           <TimeZone>Romance Standard Time</TimeZone>
           <DisableAutoDaylightTimeSet>false</DisableAutoDaylightTimeSet>
           <BluetoothTaskbarIconEnabled>false</BluetoothTaskbarIconEnabled>
           <Themes>
               <WindowColor>0</WindowColor>
           </Themes>
           <WindowsFeatures>
               <ShowInternetExplorer>false</ShowInternetExplorer>
               <ShowMediaCenter>false</ShowMediaCenter>
               <ShowWindowsMediaPlayer>false</ShowWindowsMediaPlayer>
           </WindowsFeatures>
           <UserAccounts>
               <LocalAccounts>
                   <LocalAccount wcm:action="add">
                       <Name>Administrator</Name>
                       <Group>Administrators</Group>
                       <DisplayName>Administrator</DisplayName>
                       <Description>Administrator User</Description>
                   </LocalAccount>
               </LocalAccounts>
           </UserAccounts>
           <AutoLogon>
               <Enabled>true</Enabled>
               <Username>Administrator</Username>
               <LogonCount>1</LogonCount>
           </AutoLogon>
       </component>
       <component name="Microsoft-Windows-International-Core" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
           <InputLocale>es-ES</InputLocale>
           <SystemLocale>es-ES</SystemLocale>
           <UILanguage>es-ES</UILanguage>
           <UILanguageFallback>es-ES</UILanguageFallback>
           <UserLocale>es-ES</UserLocale>
       </component>
   </settings>
   <settings pass="auditSystem">
       <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
           <Themes>
               <WindowColor>0</WindowColor>
           </Themes>
           <WindowsFeatures>
               <ShowWindowsMediaPlayer>false</ShowWindowsMediaPlayer>
               <ShowMediaCenter>false</ShowMediaCenter>
               <ShowInternetExplorer>false</ShowInternetExplorer>
           </WindowsFeatures>
       </component>
   </settings>
   <settings pass="auditUser">
       <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
           <Themes>
               <WindowColor>0</WindowColor>
           </Themes>
           <WindowsFeatures>
               <ShowWindowsMediaPlayer>false</ShowWindowsMediaPlayer>
               <ShowInternetExplorer>false</ShowInternetExplorer>
               <ShowMediaCenter>false</ShowMediaCenter>
           </WindowsFeatures>
       </component>
   </settings>
   <settings pass="offlineServicing">
       <component name="Microsoft-Windows-LUA-Settings" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
           <EnableLUA>false</EnableLUA>
       </component>
   </settings>
   <cpi:offlineImage cpi:source="wim:c:/users/administrador/desktop/win%208%20.1/win/sources/install.wim#Windows 8.1" xmlns:cpi="urn:schemas-microsoft-com:cpi" />
</unattend>
#574
0.0
Introducción:

Hola

He decidido iniciar este tutorial que escribiré en varios volumenes para daros a conocer y que puedan poner en práctica los métodos que yo utilizo para la edición/personalización de una instalación de Windows y también de una imagen de Windows (Un archivo WIM de un DVD de Windows), así como de una post-instalación de Windows, ¡veremos muchas cosas!.

¿Para que sirve esto?, en pocas palabras sirve para tomar un Windows original y personalizar todas y cada una de sus caracteristicas a nuestro antojo (dentro de los limites permitidos).

Esta guía estará orientada y basada en la personalización de Windows 8.1, concretamente de una imagen correspondiente a la ISO 9600.16384.130821-1623_x64fre_Client_ES-ES-IRM_CCSA_DV5.ISO ya que todo el trabajo que tengo ahora mismo realizado es para este sistema operativo en específico, no he guardado nada de los sistemas operativos anteriores, pero por otro lado debo aclarar que todo el proceso es basicamente el mismo, lo único que cambiará son los nombres/versiones de los archivos y carpetas así como otros detalles que deberían ser igual de obvios.

Intentaré empezar por cosas básicas para ir subiendo el nivel de dificultad, e intentaré explicar los detalles y pasos de forma sencilla para que los usuarios con cualquier nivel de conocimiento y experiencia puedan entender, pero no prometo hacer un buen tutorial, ni tampoco puedo asegurar que lo entiendan a la primera, es posible que algunos detalles muy básicos yo los acabe omitiendo.

No espero llegar a escribir un tutorial excelente, pero intentaré abordar varios temas relacionados (no todos) y aportar conocimiento en cada uno de ellos, desde la edición y personalización del procedimiento de la instalación de Windows, como la manipulación de un registro ajeno (Hive), o la creación, edición y personalización de un tema visual (.Theme), hasta la reducción (no destructiva) del tamaño del sistema de archivos (File System) del sistema operativo, pero donde más profundizaré será en la edición de una imagen Windows Imaging Format (WIM), concretamente la imagen Install.wim, es decir, la personalización (casi) completa del sistema de archivos (File System), y además aportaré todas mis herramientas y mis creaciones, pero vayamos paso a paso... aún queda mucho por enseñar.






0.1
Decisiones:

· ¿Realmente necesitas leer este tutorial?

¡¡ Saber elegir es importante !!

Si te gusta la personalización y quieres descubrir cosas nuevas e interesantes que quizás no conocias, o si simplemente quieres experimentar lo que puedes llegar a hacer con el SO de Windows y necesitas un punto de referencia... pues este es tu lugar.

Este tema abarca varios otros temas que están relacionados entre si, todo requiere tiempo, dedicación, y un mínimo de conocimiento y comprensión sobre el sistema operativo y la informática en general.

Si crees que un "Byte" es una nota musical, que "ISO" es el novio de la "ISA", o que un "Bat" es la mascota de "Batman" ...entonces no sigas leyendo, ¡no estás preparado para hacerlo!.

Deben tener en cuenta que lo que a mi me puede llevar unos días o unas semanas en escribir este tutorial para ustedes, me ha costado años de práctica y aprendizaje (y muchas cagadas), y aún así no soy ningún gurú del tema y mi humildad jamás me dejaría considerarme como tal, pero si que he invertido el tiempo suficiente como para poder enseñarles ciertas cosas interesantes.

Les recomiendo saber e investigar un poquito por su cuenta acerca del tema antes de seguir leyendo esta guía... este es un tema delicado y puede resultar peligroso si eres un manazas que tiendes a estropear el PC cuando tocas cualquier cosa, esto no es un tema apto para newbies.

¡ Estás avisado !






0.2
Definiciones:


Estas son las definiciones de algunos terminos que usaré ...y otros que quizás no, pero intenten aprenderlos todos para saber de lo que se les está hablando en cada momento, ¡ánimo!.


· Sistema operativo (SO) / Operating System (OS)
An operating system (OS) is a collection of software that manages computer hardware resources and provides common services for computer programs. The operating system is an essential component of the system software in a computer system. Application programs usually require an operating system to function.


· Windows
Microsoft Windows is a series of graphical interface operating systems developed, marketed, and sold by Microsoft.


· Sysprep (System Preparation)
La herramienta de preparación del sistema (Sysprep) prepara una instalación de Windows para la duplicación, auditoría y entrega al cliente. La duplicación, llamada también creación de imágenes, permite capturar una imagen de Windows personalizada que se puede usar varias veces en una organización. El modo auditoría permite agregar controladores de dispositivos o aplicaciones adicionales a una instalación de Windows. Una vez instalados los controladores y las aplicaciones adicionales, puede probar la integridad de la instalación de Windows. Sysprep también permite preparar una imagen para entregarla al cliente. Cuando el cliente arranca Windows, se inicia la Bienvenida de Windows.
Sysprep sólo se puede usar para configurar instalaciones de Windows nuevas. Puede ejecutar Sysprep tantas veces como sea necesario para crear y configurar la instalación de Windows. Sin embargo, sólo puede restablecer tres veces la activación de Windows. No puede usar Sysprep para volver a configurar una instalación existente de Windows ya implementada. Use Sysprep sólo para configurar instalaciones de Windows nuevas.


· WIM (Windows Imaging Format )
Windows Imaging Format (WIM) es un archivo basado en formato de imagen de disco. Fue desarrollado por Microsoft para la distribución e instalación de sus más recientes sistemas operativos: Windows Vista, Windows 7 y Windows Server 2008, los cuales la utilizan como parte de su procedimiento de instalación estándar. Funciona de igual forma con versiones anteriores de Windows, especialmente Windows XP, por ejemplo, es utilizada como parte de la instalación de Windows Fundamentals for Legacy PCs el cual es una versión reducida de Windows XP diseñada para ser ejecutada en computadas heredadas con pocos recursos de sistema.


· Windows AIK (Windows Automated Installation Kit)
Windows Automated Installation Kit (Windows AIK or WAIK) is a collection of tools and technologies produced by Microsoft designed to help deploy Microsoft Windows operating system images to target computers or to a VHD (Virtual Hard Disk). It was first introduced with Windows Vista. The WAIK is a required component of the Microsoft Deployment Toolkit.[1]


· Windows ADK (Windows Assessment and Deployment Kit )
Esto se puede decir que es exactamente lo mismo que el 'WAIK' solo que con las mejoras de ser un paquete más actual, y se le otorga este cambio de nombre estético para versiones superiores a Windows 7.


· Windows PE (Windows Preinstallation Environment)
Windows Preinstallation Environment (AKA Windows PE and WinPE) is a lightweight version of Windows used for the deployment of PCs, workstations, and servers, or troubleshooting an operating system while it is offline. It is intended to replace MS-DOS boot disks and can be booted via USB flash drive, PXE, iPXE,[1] CD-ROM, or hard disk. Traditionally used by large corporations and OEMs (to preinstall Windows client operating systems on PCs during manufacturing), it is now widely available free of charge via the Windows Automated Installation Kit (WAIK).


· Windows SIM (Windows System Image Manager )
El Administrador de imágenes de sistema (Windows SIM) crea y administra archivos de respuesta para la instalación de Windows desatendida en una interfaz gráfica de usuario (GUI).
Los archivos de respuesta son archivos basados en XML que se usan durante la instalación de Windows para configurar y personalizar la instalación predeterminada de Windows.
Por ejemplo, puede usar Windows SIM para crear un archivo de respuesta que crea particiones y formatea un disco antes de instalar Windows, cambia la configuración predeterminada de la página principal de Internet Explorer y configura Windows para que arranque en modo auditoría tras la instalación. Al modificar la configuración del archivo de respuesta, Windows SIM puede instalar además aplicaciones de terceros, controladores de dispositivos, paquetes de idiomas y otras actualizaciones.


· Archivo de respuesta (AutoUnattend.xml)
Un archivo de respuesta es un archivo basado en XML que contiene definiciones de configuración y valores para su uso durante la instalación de Windows. En un archivo de respuesta, puede especificar varias opciones de instalación, entre las que se incluyen el modo de partición de los discos, la ubicación de la imagen de Windows que se va a instalar y la clave de producto que se va a aplicar. Además, puede especificar los valores que se van a aplicar a la instalación de Windows, como los nombres de las cuentas de usuario, la configuración de la pantalla y los favoritos de Internet Explorer. El archivo de respuesta para el programa de instalación generalmente se llama Unattend.xml.
El archivo de respuesta almacena la configuración personalizada que se aplica durante la instalación de Windows.
La herramienta principal para crear un archivo de respuesta es el Administrador de imágenes de sistema (Windows SIM).


· Sistema de archivos (File System)
In computing, a file system (or filesystem) is used to control how data is stored and retrieved. Without a file system, information placed in a storage area would be one large body of data with no way to tell where one piece of information stops and the next begins. By separating the data into individual pieces, and giving each piece a name, the information is easily separated and identified.


· Windows Package Manager (pkgmgr)
El Administrador de paquetes (Pkgmgr.exe) es una nueva herramienta de línea de comandos de Windows Vista que puede usarse sin conexión para instalar, quitar o actualizar paquetes de Windows. Es posible agregar un paquete (que se proporciona como un archivo .cab) a una imagen de Windows sin conexión. Los archivos .cab pueden expandirse mediante Expand.exe. Para obtener más información acerca de la forma de expandir archivos .cab, consulte Opciones de línea de comandos de Expand. El Administrador de paquetes también sirve para habilitar o deshabilitar una característica de Windows, ya sea sin conexión o en una instalación de Windows en ejecución.
El Administrador de paquetes puede usar como entrada un archivo de respuesta de instalación desatendida y configurar los valores incluidos en la fase de configuración offlineServicing.


· DISM (Deployment Image Servicing and Management)
Administración y mantenimiento de imágenes de implementación (DISM) es una herramienta de línea de comandos que se usa para montar e instalar imágenes de Windows(R) sin conexión antes de su implementación. Puedes usar los comandos de administración de imágenes de DISM para montar y obtener información de archivos de imagen de Windows (.wim) o discos duros virtuales (VHD). También puedes usar DISM para capturar, dividir y, en general, administrar archivos .wim.
También puedes usar DISM para instalar, desinstalar y actualizar características, paquetes, controladores y configuraciones internacionales de DISM en un archivo .wim o VHD mediante los comandos de mantenimiento de DISM.
Los comandos de DISM se usan en imágenes sin conexión, pero los subconjuntos de comandos de DISM también están disponibles para el mantenimiento de un sistema operativo en ejecución.


· ImageX
ImageX es una herramienta de línea de comandos que permite a los fabricantes de equipos originales (OEM) y a las empresas capturar, modificar y aplicar imágenes de disco basadas en archivos para una implementación rápida. ImageX funciona con los archivos de imagen de Windows (.wim) para realizar copias en una red; también funciona con otras tecnologías que usan imágenes .wim, como el programa de instalación de Windows, los Servicios de implementación de Windows (Windows DS) y el paquete de implementación de características del sistema operativo SMS.


· Carpeta WinSXS (Side-by-side assembly)
Side-by-side technology is a standard for executable files in Windows 98 Second Edition, Windows 2000, and later versions of Windows that attempts to alleviate problems that arise from the use of dynamic-link libraries in Microsoft Windows. Such problems include version conflicts, missing DLLs, duplicate DLLs, and incorrect or missing registration. In side-by-side, Windows stores multiple versions of a DLL in the WinSXS subdirectory of the Windows directory, and loads them on demand. This reduces dependency problems for applications that include a side-by-side manifest.
Side-by-side technology is also known as WinSxS or SxS, although technically WinSxS refers only to the global side-by-side store (officially called the "Windows component store"), which is conceptually the native equivalent of the .NET Global Assembly Cache. Executables that include an SxS manifest are designated SxS assemblies.


· Booting
In computing, booting (or booting up) is the initialization of a computerized system. The system can be a computer or a computer appliance. The booting process can be "hard", after electrical power to the CPU is switched from off to on (in order to diagnose particular hardware errors), or "soft", when those power-on self-tests (POST) can be avoided. Soft booting can be initiated by hardware such as a button press, or by software command. Booting is complete when the normal, operative, runtime environment is attained


· Boot Loader
A boot loader is a computer program that loads an operating system or some other software for the computer after completion of the self-tests. Within the hard reboot process, it runs after completion of the self-tests, then loads and runs the software. A boot loader is loaded into main memory from persistent memory, such as a hard disk drive or, in some older computers, from a medium such as punched cards, punched tape, or magnetic tape. The boot loader then loads and executes the processes that finalize the boot.


· Kernel
In computing, the kernel is a computer program that manages input/output requests from software and translates them into data processing instructions for the central processing unit and other electronic components of a computer. The kernel is a fundamental part of a modern computer's operating system.[1]
When a computer program (in this case called a process) makes requests of the kernel, the request is called a system call.


· Imagen ISO (International Standards Organization)
An ISO image is an archive file of an optical disc, a type of disk image composed of the data contents of every written sector of an optical disc, including the optical disc file system.[1] ISO image files usually have a file extension of .iso. The name ISO is taken from the ISO 9660 file system used with CD-ROM media, but what is known as an ISO image might also contain a UDF (ISO/IEC 13346) file system (commonly used by DVDs and Blu-ray Discs).


· Imagen BMP (Bitmap)
In computer graphics, when the domain is a rectangle (indexed by two coordinates) a bitmap gives a way to store a binary image, that is, an image in which each pixel is either black or white (or any two colors).
A bitmap is a type of memory organization or image file format used to store digital images. The term bitmap comes from the computer programming terminology, meaning just a map of bits, a spatially mapped array of bits. Now, along with pixmap, it commonly refers to the similar concept of a spatially mapped array of pixels. Raster images in general may be referred to as bitmaps or pixmaps, whether synthetic or photographic, in files or memory.


· Imagen PNG (Portable Network Graphics)
Portable Network Graphics[2] or PNG's Not GIF,[3] is a raster graphics file format that supports lossless data compression. PNG was created as an improved, non-patented replacement for Graphics Interchange Format (GIF), and is the most used lossless image compression format on the Internet.[4]
PNG supports palette-based images (with palettes of 24-bit RGB or 32-bit RGBA colors), grayscale images (with or without alpha channel), and full-color non-palette-based RGB[A] images (with or without alpha channel). PNG was designed for transferring images on the Internet, not for professional-quality print graphics, and therefore does not support non-RGB color spaces such as CMYK.


· Tema visual (Theme)
In computing, a theme is a preset package containing graphical appearance details, used to customize the look and feel of an operating system or a piece of computer software.


· Windows Aero
Windows Aero (a backronym for Authentic, Energetic, Reflective, and Open) is a set of interface and design guidelines that were introduced by the Windows Vista operating system. The changes made in the Aero interface affected many elements of the Windows interface and how it functions, including the incorporation of a new visual look, along with changes in interface guidelines reflecting appearance, layout, and the phrasing and tone of instructions and other text in applications.






1.0
· Instalando WAIK/WADK



Lo primero que recomiendo hacer para disponer de (casi) todas las herramientas de este tutorial (y también para evitar ciertos conflictos de montaje de imagenes en el futuro) es instalar la versión del paquete WAIK/WADK correspondiente a la versión de Windows que vayamos a modificar (no del Windows que tengamos instalado).

En mi caso voy a manipular un DVD de Windows 8.1, así que debo instalar este paquete WADK: http://www.microsoft.com/en-us/download/details.aspx?id=39982

Otras versiones de WADK: http://www.microsoft.com/en-us/search/DownloadResults.aspx?q=Windows+Assessment+and+Deployment+Kit
Otras versiones de WAIK: http://www.microsoft.com/en-us/search/DownloadResults.aspx?q=Windows+Automated+Installation+Kit

Una vez descargado, ejecutamos el instalador, elegimos una instalación local obviamente y configuramos la ruta de instalación (la que queramos), maldecimos la dichosa subscripción de Microsoft y omitimos (o leemos) los términos de uso,
al final llegaremos a una parte de la instalación en donde debemos elegir los componentes que deseamos instalar en nuestro equipo, aquí debemos marcar unicamente el componente "Herramientas de implementación":



Nota: También pueden instalar opcionalmente el componente de "Windows PE", es una caracteristica muy util por ejemplo para crear un LiveCD, pero no estoy muy seguro de si llegaré a explicar detalladamente y abordar el tema relacionado con el WinPE en este tutorial.

La ruta de instalación por defecto de mi paquete WADK es: C:\Program Files (x86)\Windows Kits\8.1\Assessment and Deployment Kit y esa es la ruta que utilizaré en este tutorial cuando deba referirme a alguna de las aplicaciones que vayams a usar.

Al finalizar la instalación tendremos nuevas herramientas muy utiles, pero por el momento solo debemos aprendernos la ubicación de estas herramientas:


WSIM...........................: C:\Program Files (x86)\Windows Kits\8.1\Assessment and Deployment Kit\Deployment Tools\WSIM\imgmgr.exe
DISM (para 32 Bits)............: C:\Program Files (x86)\Windows Kits\8.1\Assessment and Deployment Kit\Deployment Tools\x86\DISM\Dism.exe
DISM (para 64 Bits)............: C:\Program Files (x86)\Windows Kits\8.1\Assessment and Deployment Kit\Deployment Tools\amd64\DISM\Dism.exe
ImageX (para 32 Bits)..........: C:\Program Files (x86)\Windows Kits\8.1\Assessment and Deployment Kit\Deployment Tools\x86\DISM\ImageX.exe
ImageX (para 64 Bits)..........: C:\Program Files (x86)\Windows Kits\8.1\Assessment and Deployment Kit\Deployment Tools\amd64\DISM\ImageX.exe
Package Manager: (para 32 Bits): C:\Program Files (x86)\Windows Kits\8.1\Assessment and Deployment Kit\Deployment Tools\x86\DISM\pkgmgr.exe
Package Manager: (para 64 Bits): C:\Program Files (x86)\Windows Kits\8.1\Assessment and Deployment Kit\Deployment Tools\amd64\DISM\pkgmgr.exe


Nota: Si van a manipular una imagen de Windows x64, entonces deberán utilizar las herramientas de arquitectura de 64 Bit, creo que no hace falta ni decirlo.

Enhorabuena, ¡¡ primer paso del tutorial conseguido !!, bah, era demasiado facil :P.






1.1
· Post-Configurando WAIK/WADK

Para simplificar el echo de tener que escribir la ubicación absoluta del WADK/WAIK, sugiero crear una variable de entorno en el sistema.

Una variable de entorno digamos que es una palabra que hace referencia a un valor estático (en este caso una ruta muy larga) el cual podremos usar para expandir dicho valor de forma global usando la Shell de Windows (En la CMD, en la barra del Explorer, en el menú "Ejecutar" del menú inicio, etc...).

En la consola de Windows (CMD), debes escribir el siguiente comando (especifica la ruta correcta para su versión instalada):
SETX "WinKit" "C:\Program Files (x86)\Windows Kits\8.1\Assessment and Deployment Kit\Deployment Tools"



A partir de este momento, me referiré a la ruta absoluta del directorio WADK/WAIK por el nombre %WinKit% de nuestra nueva variable de entorno.

Nota: Para eliminar la variable si lo necesitan:
SETX "WinKit" ""






1.2
· Entendiendo WIM

( Espero que hayan leido la definición de 'WIM', porque no explicaré lo que ya deben conocer. )

Un DVD de instalación de Windows (sin modificar, se entiende) contiene dos archivos 'WIM', dichos archivos están ubicados en el directorio X:\Sources (donde X es la letra de unidad o la carpeta ), una imagen se llama Boot.wim y la otra Install.wim.

Boot.wim contiene un entorno bootable de WinPE, es decir, esto es lo que sucede al bootear el DVD de Windows y no hay que confundirlo con el Boot Loader, esta la pantalla negra que nos pide que presionemos cualquier tecla para arrancar el DVD, y también la pantalla que al reiniciar, nos permite continuar una instalación de Windows en proceso, y también es el SO que ejecuta la instalación de Windows.

Install.wim contiene todo el sistema de archivos (FileSystem) de Windows que será expandido a nuestro PC, los programas, los perfiles de usuario, las claves de registro, TODO, son imágenes preparadas (sysprepped), es decir, que cuando instalamos Windows, lo que contiene esta imagen es exactamente lo que se instala, WYSIWYG (What You See Is What You Get).

¿Que puedo llegar a hacer con una imagen Boot.wim?
 Inyectar Drivers, integrar un entorno WinPe, añadir componentes opcionales (disponibles solamente durante el booteo) como un memtest (test de memoria) y cualquier Software bootable como las herramientas del archiconocido "Hiren's BootCD", etc...

¿Que puedo llegar a hacer con una imagen Install.wim?
 Inyectar Drivers, añadir o reemplazar cualquier tipo de archivos y carpetas, así como Software, Wallpapers y Música, modificar las claves de registro por defecto,
 instalar o eliminar actualizaciones de Windows Update, instalar o eliminar caracteristicas de Windows,
 Eliminar archivos y carpetas para reducir el tamaño de la instalación del sistema,
 en resumen... ¡manipular todo lo referente a Windows!.  

Nota: Una imagen WIM puede contener varios índices de imagen, por ejemplo en un típico DVD de Windows AIO (All In One) existen varias ediciones que podemos instalar (Home, Professional, Ultimate, etc...) pues cada una de las ediciones corresponde a un índice, son sub-imágenes distintas con sus pequeñas diferencias en el sistema de archivos (las ediciones más complejas de Windows como la "Ultimate" instalan más caracteristicas que las versiones más básicas, lo cual no siempre es una ventaja).

Nota: Una imagen WIM es un archivo empaquetado/comprimido y por ende el contenido de un archivo WIM se puede examinar, manipular y/o extraer con herramientas de terceros como el compresor 7Zip, pero esto no lo necesitaremos para nada, ¡solo es un dato por si son curiosos!.

Nota: Otro dato de interés público, este es el recorrido que realiza un DVD de Windows donde se aprecia las operaciones del Boot.wim hasta inicializar el Kernel, el cual controla la respuesta del Software del Setup (el instalador de Windows):

Citar
   1. System is powered on
   2. The MBR is located on the system drive.
   3. The Boot Sector is located, BOOTMGR is loaded
   4. BOOTMGR looks for an active partition on sector 0.
   5. BOOTMGR then reads the BCD file
   6. BOOTMGR transfers control to WINLOAD.EXE contained in Boot.wim (In the case of a resume operation, WINRESUME.EXE)
   7. WINLOAD.EXE initializes memory and loads drivers set to start at boot, and then transfers control to the kernel.
#576
Hola

Habitualmente yo compro una subscripción Premium de 3 meses a Uploaded.net (25€), y ...bueno, la subscripción se me ha acabado y en lugar de renovarla otra vez estoy pensando seriamente en comprar otra alternativa que siempre me pareció mejor pero nunca me atreví a comprar, me refiero a servicios que ofrecen muchas cuentas Premium (de forma legal) para distintos servidores y por mucho menos dinero.

Por ejemplo:
http://multihosters.com/selectProduct.aspx


o...: http://zevera.com/Prices.aspx#prices
Y aquí hay más: http://www.kulhead.com/2013/09/5-most-powerful-multihosters.html


· ¿Alguien ha experimentado este tipo de servicios? ...¿Son de fiar?, ¿Algo que pinar?
· ¿Reálmente todas las cuentas Premium que dicen tener activas ...lo están siempre?
· ¿Recomiendan algun servicio parecido en especial?


A mi lo que me da miedo es que por ejemplo sea más un timo que otra cosa, y que de repente una cuenta deje de funcionar y no puedas reclamar nada y pierdas a mala leche el dinero que has pagado por no poder descargar como Premium de ese hosting, o cosas parecidas.

Saludos
#577
¿Existe algún buen software donde puedas cargar dos archivos EXE y te indique las diferencias de bytes entre esos archivos binarios?

Estoy buscando algo tipo el método de comparación Diff que usan muchos programas con archivos de texto, pero para archivos EXE, para saber que cambios se le hicieron.

Y si encima permitiera editar diréctamente en hexadecimal y vaya comparando los cambios originales sería genial.

EDITO: Ya encontré uno, perdon por las molestias.

Beyond Compare + Hex viewer plugin



Saludos!
#578
Hola

Desde hace varios años uso el programa Regshot (pero una versión modificada y mejorada para x64 en Ruso de la que se conoce poco), y ...bueno, al darle al botón "comparar" en el programa, este se minimiza y lanza un reporte en una molesta ventana de Internet Explorer (no del navegador por defecto, sino específicamente del IE), además lanza el mismo reporte en el Notepad.exe (no en editor por defecto, sinó el Notepad).

Lo que necesito es, saltar la instrucción que hace que el programa se minimice a la barra de tareas, y también saltar la instrucción que hace ejecutar el IE, la del Notepad la quiero dejar como está, pero es que me molesta mucho que me lo quiera mostrar también en el IE y encima se minimice.

EDITO: Se me olvidaba comentar, que el programa no dispone de ninguna opción para customizar esos aspectos, por eso intento hacerlo a lo bruto.

El problema es que intento examinar el exe y el PEid me dice que no tiene una cabecera PE válida asi que no me da ningún dato del exe, lo he intentado con el PE explorer pero este no soporta x64, así que no puedo daros ninguna información al respecto sobre con que lenguaje fue compilado... de lo que estoy seguro es de que no es un ensamblado .NET porque el Reflector no lo reconoce como tal.

Como no tengo el source de este programa (de esta versión en x64, no la del Regshot de Sourceforge) y la web está muerta pues... solo me queda intentar hacerle ingenieria inversa al archivo.

Si alguien tiene tiempo para orientarme sobre el proceso en el OllyDbg x64 2.01 o mejor aun, si alguien tiene tiempo para encontrar y saltar esas dos instrucciones que me interesan (considero que con los datos proporcionados debe ser cuestion de minutos para un experto)... cualquier info para avanzar, se lo agradeceria mucho.

EDITO 2: El olly no me abre el exe, asi que me recomendaron buscar (al menos para tenerlas localizadas) las instrucciones con el CheatEngine, pero no me vi capaz de encontrar nada, así que luego estuve buscando algún debugger para x64, encontré esto y esto otro pero se distribuyen solo el código fuente, hay que compilarlo y no tengo lo necesario para hacerlo.

EDITO 3: Ahora me estoy descargando por torrent el IDa Pro y el W32DASM x64 (que pesa lo suyo) que se supone que soportan un binario x64... ya veremos si consigo algo con esto.

EDITO 4: Con el IDA Pro encuentro la instrucción del IE pero ninguno de los que hemos estado investigando el modo de cambiar el opcode o noopear hemos conseguido hacerlo xD, es un programa complejo, en fin, que no se diga que no lo he intentado.

El EXE: http://www.mediafire.com/download/12ac3ep47w24mhs/Regshot.rar

Saludos!
#579
En un Home PC los dispositivos Serial ATA están listados en la siguiente clave:

HKLM\SYSTEM\CurrentControlSet\Enum\SCSI\(MANUFACTURER ID)

Pero he podido comprobar que en los portatiles que tienen discos duros ATA estos no están en dicha clave.

Mediante un Script identifico la ID del producto del disco duro principal (Ej: DISK&VEN_WDC_WD10&PROD_02FAEX-00Z3A0),
y necesito modificar un valor que está dentro de la clave que indiqué arriba (Ej: HKLM\SYSTEM\CurrentControlSet\Enum\SCSI\DISK&VEN_WDC_WD10&PROD_02FAEX-00Z3A0),
pero para los discos duros ATA parece que la ruta de la clave es distinta... y no la encuentro, como tampcoo encuentro información al respecto.

¿Alguien sabe cual es la clave de registro equivalente donde Windows lista los dispositivos ATA?

Saludos

EDITO:

Ya lo descubrí:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\IDE
#582
Scripting / MOVIDO: AYUDA POR FAVOR
13 Marzo 2014, 16:05 PM
#584
Hola, compañeros moderadores de EHN, esta sugerencia va destinada sólamente a los miembros que moderan secciones de programación, y a el-brujo, que es quien manda y quizás no quiera que se lleve a cabo la idea, o quizás si, o le dará igual, no se!.

He estado pensando bastante estos días en como podemos mejorar (un poquito más) entre todos el foro de ElHacker.net, y se me ha ocurrido una idea que considero brillante, les quiero proponer esta idea que todos nosotros (mods de programación) deberíamos llevar a cabo juntos en las secciones que moderamos, de forma sincronizada, como una piña, para que el resultado sea inmejorable y organizado.

Lo cierto es que no sé si yo solo me podría animar a añadir esta nueva regla en las secciones que modero si ningún otro moderador está interesado en apoyar o llevar a cabo esta idea en su sección, por eso me gustaría saber vuestra opinión sobre la idea (sobretodo la de Novlucker , Kubox, y Leo Gutierrez), sería una idea bastante radical pero la he visto llevar a cabo en otros sitios (no haré spam aquí) y la verdad es que da gusto ver el resultado tan organizado.

La idea sería, imponer estríctamente el uso de una plantilla para formular dudas de programación, es decir, cualquier post que no cumpla este requisito sería eliminado, sin excepciones ni favoritismos.

PD: La manera en como siguiese la conversación de un post, es decir, los usuarios que contestasen al tema ...eso seguiria siendo como siempre, el libre albedrío. Mi idea es solo para el usuario que publica el tema.


( A continuación os comentaré los pros y contras que se me ocurren )

Razones a favor:
· La organización sería exquisita, creo que a la larga sería algo muy beneficioso tanto para nosotros, como para EHN.
· Nos ahorrariamos mucha lectura innecesaria, es decir, siguiendo el uso de una plantilla, el usuario sabría como y que debe escribir, y nosotros sabríamos donde leer y como podemos ayudarle.
· Se acabarían los típicos conflictos entre la persona que necesita ayuda, y la persona que quiere ayudar. Preguntas como... ¿nos das la información del error?, ¿Puedes ser más específico?, y un largo etc.
· Se acabarían los motivos de llamarle la atención a un usuario por no publicar información debídamente o cosas parecidas, no lo digo solo por mi como moderador, sinó por todos los demás.


Razones en contra:
· Esto echaría para atrás a muuuuuchos usuarios que se registran sin leer las reglas, o usuarios que llevan años pero son muy desconsiderados con los demás y no tienen intención de seguir las reglas, pero creo que ese sería el único punto en contra.
· Al principio cuesta habituarse a un cambio, y por eso habrían muchos posts que no seguirian esta nueva norma, muchos posts (demasiados al principio) acabarían en la papelera. Y no se si esto es una razón en contra, pero lo cierto es que yo me sentiría mal por tener que eliminar tantos mensajes de gente que necesita ayuda, pero por otro lado, la organización es algo MUY importante para todos y hay que abstenerse a las consecuencias de no cumplir las normas.


Por esas razones quisiera conocer vuestro punto de perspectiva y a ser posible vuestras críticas constructivas,
¿como lo veis?, ¿os gustaría la idea?, ¿la implementaríais conmigo?.





· Os muestro un ejemplo de plantilla (se podría perfeccionar, estoy abierto a sugerencias):

Citar
Lenguaje:
Especifica aquí el lenguaje que estás utilizando.
Si no estás utilizando ningún lenguaje, especifica el/los lenguaje(s) por los que tengas preferencia para obtener una solución apta a tus necesidades.
Este campo es obligatorio, cualquier tema publicado que no use esta plantilla para especificar el lenguaje será eliminado sin previo aviso.


Problema:
Describe aquí, de forma concisa, pero sin escatimar en detalles, el problema que tienes o la meta que deseas conseguir.
Intenta ser preciso y hacerte entender con los términos y palabras que uses, si no logramos entender tu escenario, tendrás menos posibilidades de que podamos solucionarlo. No malgastes tu tiempo ni tampoco el nuestro.
Este campo es obligatorio, cualquier tema publicado que no use esta plantilla para describir el problema será eliminado sin previo aviso.


Código:
Añade aquí el código fuente, pseudocódigo, urls, o cualquier otra información útil que muestre el progreso de tu investigación. Añade información breve si lo consideras necesario, y porfavor, utiliza las etiquetas 'GeShi' para insertar código.
Ten en cuenta que se valorará mucho más a personas que demuestren haber investigado o intentado desarrollar un código para resolverlo, que las personas que pidan un trabajo laborioso sin mostrar ningún esfuerzo ni haber buscado en Google.
Si no tienes ningún código, déjalo en blanco.


Error:
Especifica aquí toda la información posible acerca del error que te indica el Script (si alguno).
Ten en consideración que cuanto más detallada sea la información que proporciones sobre el error, más posibilidades tendrás de que podamos hayar la causa del problema y así ayudarte a encontrar una solución.
Si no tienes ninguna información, déjalo en blanco.


Otras Observaciones:
Comenta aquí cualquier otra cosa a tener en cuenta que esté relacionada con el problema.
Si no quieres comentar nada, déjalo en blanco.


· Ejemplos de unos posts cualquiera, con el uso de la plantilla en práctica:

Cita de: Ejemplo Python
Lenguaje:
Python 3.X


Problema:
Estoy leyendo un tutorial sobre Python pero este simple ejemplo de 'Hola mundo' me da error, no entiendo porque no funciona!


Código:
Código (python) [Seleccionar]
import time

print "Hola"

time.sleep(3)



Error:
Esto es lo único que me indica:
Cita de: Python.exe  File "C:\Users\Administrador\Desktop\Nuevo Python Script.PY", line 3
   print "Hola"
              ^
SyntaxError: invalid syntax


Cita de: Ejemplo Batch
Lenguaje:
Batch
Si alguien lo puede hacer en VisualBasicScript no hay problema


Problema:
Hola, antes de nada gracias por ayudarme.

Quisiera obtener una lista de todos los archivos de un directorio y ordenarlos por fecha, y quedarme sólo con los que tengan antiguedad de 2 días.


Código:

Solo consigo listar los archivos, estoy usando ese code:

Código (dos) [Seleccionar]
@ECHO OFF

FOR /F "tokens=*" %%F IN ('DIR /A-D /OD /B ".\"') DO (
 Echo %%~tF "%%~F"
)

Pause&Exit



Otras Observaciones:
Necesito entregar el código en 3 días para un trabajo... porfavor ayúdenme!
#585
Pues eso, ¿alguien podría aclararme cual es el mimetype correcto para un archivo de registro (.reg) Unicode?

He buscado en la siguiente url (y varias más), pero no lo encuentro: http://www.webmaster-toolkit.com/mime-types.shtml así que quizás estoy omitiendo algo importante a tener en cuenta?.

Me imagino que debería ser algo parecido a esto:
text/win-registry-script

Pero no encuentro nada parecido.

Saludos