none
Script Powershell listar carpetas, archivos de las unidades logicas de varios servidores RRS feed

  • Pregunta

  • Buenos dias.

    Por favor la colaboración con la siguientes inquietud. 

    Tengo que generar un script que dado el nombre de un servidor me liste todas las unidades logicas de ese server (parte facil), y que ademas por cada unidad logica me genere cuales son los archivos y folderes que se encuentren en la raiz de cada unidad.

    Tengo el siguiente script.

     

    $drives = Get-WmiObject -class Win32_LogicalDisk -ComputerName Localhost -Filter "DriveType=3"
    foreach ($drive in $drives) {
             $pro = @{'Name'=$drive.DeviceID}
    $pro = $pro | Out-String
    $cadena = "\"
    $test = $pro+$cadena
    $test
     Get-ChildItem -Path "$test" -Force
    }

    El problema radica (hasta donde he podido validar) es que estoy generando un objecto ($drives), para almacenar las unidades logicas de un server, y necesitaría convertir ese objecto a cadena para adicionarle a ese objecto convertido en cadena la característica "\", y ya con esa cadena (por ejemplo C:\) puedo utilizar el comando Get-ChildItem para realizar la consulta de archivos y carpetas.

    Pero después de varios intentos y pruebas no he podido generar un script como se muestra en la parte inferior.

        Directorio: C:\


    Mode                LastWriteTime     Length Name
    ----                -------------     ------ ----
    d----      20/05/2013  03:57 p.m.            AuthLog
    d----      15/10/2013  10:47 a.m.            Documents
    d----      20/05/2013  02:11 p.m.            DRIVERS
    d----      20/05/2013  02:03 p.m.            Intel
    d----      15/07/2013  03:54 p.m.            Lexmark
    d----      13/07/2009  10:20 p.m.            PerfLogs
    d-r--      05/09/2013  02:23 p.m.            Program Files
    d----      20/08/2013  11:57 a.m.            Program Files (x86
    d----      22/05/2013  12:29 p.m.            temp
    d-r--      05/09/2013  06:01 p.m.            Users
    d----      20/08/2013  11:57 a.m.            Windows

    Muchas gracias a la persona que me pueda orientar sobre este caso en particular.

    Cordial saludo

    Sergio E. Vargas

    martes, 15 de octubre de 2013 21:43

Respuestas

  • Hola Sergio,

    Podrías probar con el siguiente código:

    $drives = Get-WmiObject -class Win32_LogicalDisk -ComputerName Localhost -Filter "DriveType=3"
    foreach ($drive in $drives) {
        Get-ChildItem -Path "$($drive.DeviceID)\" -Force
    }     

    La cuestión es que si haces un $drive.DeviceID.gettype() te indica que ya es un tipo cadena, con lo que no tienes que hacer conversiones extrañas.

    No se si es exactamente lo que buscas, pero espero haberte ayudado.

    Un saludo


    Twitter 

    • Marcado como respuesta Sergio163 miércoles, 16 de octubre de 2013 19:25
    miércoles, 16 de octubre de 2013 7:36

Todas las respuestas

  • Hola Sergio,

    Podrías probar con el siguiente código:

    $drives = Get-WmiObject -class Win32_LogicalDisk -ComputerName Localhost -Filter "DriveType=3"
    foreach ($drive in $drives) {
        Get-ChildItem -Path "$($drive.DeviceID)\" -Force
    }     

    La cuestión es que si haces un $drive.DeviceID.gettype() te indica que ya es un tipo cadena, con lo que no tienes que hacer conversiones extrañas.

    No se si es exactamente lo que buscas, pero espero haberte ayudado.

    Un saludo


    Twitter 

    • Marcado como respuesta Sergio163 miércoles, 16 de octubre de 2013 19:25
    miércoles, 16 de octubre de 2013 7:36
  • Super, ya lo valide y funciono.

    Muchas gracias!!!!!!

    miércoles, 16 de octubre de 2013 14:10
  • Santi, muchas gracias por el dato, realmente me fue util.

    Una pregunta, estoy interesando en que la salida del script sea a traves del tipo New-Object, pero al generar este script todos las columnas salen con el mismo contenido, como modificar este script para que cada columna salga con el contenido indicado?? Asi como se realiza con el comando Get-childItem.

         

    $drives = Get-WmiObject -class Win32_LogicalDisk -ComputerName $ComputerName -Filter "DriveType=3"
        foreach ($drive in $drives) {
                  $pro = @{'Disk'= Get-ChildItem -Path "$($drive.DeviceID)\" -Force;
           'Mode'= Get-ChildItem -Path "$($drive.Mode)\" -Force;
                                   'LastWriteTime'= Get-ChildItem -Path "$($drive.LasWriteTime)\" -Force;
           'Length'= Get-ChildItem -Path "$($drive.Length)\" -Force;
           'Name'= Get-ChildItem -Path "$($drive.Name)\" -Force}

          New-Object -TypeName Psobject -Property $pro


    Muchas gracias de antenamo por cualquier indicacion que me puedan brindar.

    Cordial saludo

    Sergio Vargas

    jueves, 17 de octubre de 2013 3:54
  • Hola Sergio,

    El problema es que con el código que estás usando lo que estás haciendo es asignar una hashtable $pro a una propiedad de un nuevo objeto de tipo PSObject. Lo que deberías hacer es crear el objeto antes y luego ir añadiendo propiedades. El código debería parecerse a esto:

    $drives = Get-WmiObject -class Win32_LogicalDisk -ComputerName $ComputerName -Filter "DriveType=3"
    $myDrives = @()
    
    foreach ($drive in $drives) {
    	$pro = New-Object -TypeName PSObject
    	$pro | Add-Member -MemberType NoteProperty -Name Disk -Value $drive.DeviceID
    	$pro | Add-Member -MemberType NoteProperty -Name Mode -Value $drive.Mode
    	$pro | Add-Member -MemberType NoteProperty -Name LastWriteTime -Value $drive.LastWriteTime
    	$pro | Add-Member -MemberType NoteProperty -Name Length -Value $drive.Length
    	$pro | Add-Member -MemberType NoteProperty -Name Name -Value $drive.Name
    	
    	$myDrives += $pro
    }

    con lo que tendrás un array de objetos "$pro" y cada objeto con las propiedades que has definido (Disk, Mode, LastWriteTime, etc...)

    Un saludo y espero que te sirva


    Twitter 

    jueves, 17 de octubre de 2013 8:02
  • Hola Santi, buen dia.

    De antemano muchas gracias por responder y ayudarme con estas dudas.

    Referente al ultimo script, al ejecutarlo me trae unos valores nulos.

    Y referente a la utilización de la propiedad PSObject al final del script, es que este script hace parte de un conjunto de scripts para un proyecto de "Hardering" y necesito exportalo a un formato en HTML; y para cada punto estoy realizando el respectivo script, para todo exportarlo a un archivo en HTML. Adjunto una pequeña porcion del codigo que ya esta corriendo y la idea es mantener el mismo formato.

    Santi, muchas gracias!!!

    viernes, 18 de octubre de 2013 16:04
  • Hola Sergio,

    por ir un poco por partes. Respecto a los valores nulos, deberías comprobar si cada una de las propiedades del objeto $drive devuelve algún valor. Tendría que verlo con más detalle, pero en principio el "foreach" simplemente recorre el array que te ha devuelto el cmdlet get-wmiobject win32_logicaldisk.

    Por otra parte, referente a tu proyecto de hardening, independientemente de que uses el modo que te he comentado o el que estabas usando tu en un principio, tienes entre manos un array de objetos que representan a cada una de tus unidades lógicas, por lo que a la hora de generar el reporte también deberías usar un bucle foreach. 

    No conozco lo que hace la función ConvertTo-EnhancedHTMLFragment, pero tendría que crear una sección específica para tu LogicalDrives o cualquier otro conjunto que tenga más de un elemento, por ejemplo las NICs, o los módulos de memoria (si quieres llegar a ese nivel de detalle)

    Un saludo,


    Twitter 

    domingo, 20 de octubre de 2013 11:10