Get free disk space for different servers with separate credentials

Tagged: 

This topic contains 1 reply, has 2 voices, and was last updated by Profile photo of Sean Quinlan Sean Quinlan 1 year, 11 months ago.

  • Author
    Posts
  • #21347
    Profile photo of TAHER TAMBOLI
    TAHER TAMBOLI
    Participant

    I'm trying to query Disk space info on Grid box and Export it to CSV.

    I was able to use Marc Weisel's script to make it use different credentials. I used computers.csv

    to store the computer name and referenced credentials. This is working although the problem I'm facing is that Grid box opens for all the servers mentioned in the csv.

    I want to view all disk space information on the same grid box.

    Below are my script and module I'm using

    
    
    
    
    Import-Module D:\get.psm1 
    Import-Module D:\out-CSV.psm1 
    $ComputerList = Import-Csv -Path d:\Computers.csv; 
    $CredentialList = @{ 
        Cred1 = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList 'laptop-pc\laptop', [ConvertTo-SecureString -String 'tamboli' -AsPlainText -Force]; 
        Cred2 = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList 'tnt\administrator', [ConvertTo-SecureString -String 'Atlantic12' -AsPlainText -Force]; 
        } 
    foreach [$computer in $ComputerList] { 
    Get-DiskFree -ComputerName $Computer.Name -Credential $CredentialList[$Computer.Credential] -Format | ? { $_.Type -like '*fixed*' } | select * -ExcludeProperty Type | Out-GridView -Title 'Servers Space Statistics' 
    } 
    
    
    
    function Get-DiskFree
    {
        [CmdletBinding[]]
        param 
        [
            [Parameter[Position=0,
                       ValueFromPipeline=$true,
                       ValueFromPipelineByPropertyName=$true]]
            [Alias['hostname']]
            [Alias['cn']]
            [string[]]$ComputerName = $env:COMPUTERNAME,
            
            [Parameter[Position=1,
                       Mandatory=$false]]
            [Alias['runas']]
            [System.Management.Automation.Credential[]]$Credential =
            [System.Management.Automation.PSCredential]::Empty,
            
            [Parameter[Position=2]]
            [switch]$Format
        ]
        
        BEGIN
        {
            function Format-HumanReadable 
            {
                param [$size]
                switch [$size] 
                {
                    {$_ -ge 1PB}{"{0:#.#'P'}" -f [$size / 1PB]; break}
                    {$_ -ge 1TB}{"{0:#.#'T'}" -f [$size / 1TB]; break}
                    {$_ -ge 1GB}{"{0:#.#'G'}" -f [$size / 1GB]; break}
                    {$_ -ge 1MB}{"{0:#.#'M'}" -f [$size / 1MB]; break}
                    {$_ -ge 1KB}{"{0:#'K'}" -f [$size / 1KB]; break}
                    default {"{0}" -f [$size] + "B"}
                }
            }
            
            $wmiq = 'SELECT * FROM Win32_LogicalDisk WHERE Size != Null AND DriveType >= 2'
        }
        
        PROCESS
        {
            foreach [$computer in $ComputerName]
            {
                try
                {
                    if [$computer -eq $env:COMPUTERNAME]
                    {
                        $disks = Get-WmiObject -Query $wmiq `
                                 -ComputerName $computer -ErrorAction Stop
                    }
                    else
                    {
                        $disks = Get-WmiObject -Query $wmiq `
                                 -ComputerName $computer -Credential $Credential `
                                 -ErrorAction Stop
                    }
                    
                    if [$Format]
                    {
                        # Create array for $disk objects and then populate
                        $diskarray = @[]
                        $disks | ForEach-Object { $diskarray += $_ }
                        
                        $diskarray | Select-Object @{n='Name';e={$_.SystemName}}, 
                            @{n='Vol';e={$_.DeviceID}},
                            @{n='Size';e={Format-HumanReadable $_.Size}},
                            @{n='Used';e={Format-HumanReadable `
                            [[$_.Size]-[$_.FreeSpace]]}},
                            @{n='Avail';e={Format-HumanReadable $_.FreeSpace}},
                            @{n='Use%';e={[int][[[[$_.Size]-[$_.FreeSpace]]`
                            /[$_.Size] * 100]]}},
                            @{n='FS';e={$_.FileSystem}},
                            @{n='Type';e={$_.Description}}
                    }
                    else 
                    {
                        foreach [$disk in $disks]
                        {
                            $diskprops = @{'Volume'=$disk.DeviceID;
                                       'Size'=$disk.Size;
                                       'Used'=[$disk.Size - $disk.FreeSpace];
                                       'Available'=$disk.FreeSpace;
                                       'FileSystem'=$disk.FileSystem;
                                       'Type'=$disk.Description
                                       'Computer'=$disk.SystemName;}
                        
                            # Create custom PS object and apply type
                            $diskobj = New-Object -TypeName PSObject `
                                       -Property $diskprops
                            $diskobj.PSObject.TypeNames.Insert[0,'BinaryNature.DiskFree']
                        
                            Write-Output $diskobj
                        }
                    }
                }
                catch 
                {
                    # Check for common DCOM errors and display "friendly" output
                    switch [$_]
                    {
                        { $_.Exception.ErrorCode -eq 0x800706ba } `
                            { $err = 'Unavailable [Host Offline or Firewall]'; 
                                break; }
                        { $_.CategoryInfo.Reason -eq 'UnauthorizedAccessException' } `
                            { $err = 'Access denied [Check User Permissions]'; 
                                break; }
                        default { $err = $_.Exception.Message }
                    }
                    Write-Warning "$computer - $err"
                } 
            }
        }
        
        END {}
    }
  • #21367
    Profile photo of Sean Quinlan
    Sean Quinlan
    Participant

    I'm not able to test this, but try replacing these 3 lines:

    foreach [$computer in $ComputerList] { 
    Get-DiskFree -ComputerName $Computer.Name -Credential $CredentialList[$Computer.Credential] -Format | ? { $_.Type -like '*fixed*' } | select * -ExcludeProperty Type | Out-GridView -Title 'Servers Space Statistics' 
    } 

    With this:

    $Output = foreach [$computer in $ComputerList] { 
    Get-DiskFree -ComputerName $Computer.Name -Credential $CredentialList[$Computer.Credential] -Format | ? { $_.Type -like '*fixed*' } | select * -ExcludeProperty Type 
    } 
    $Output | Out-GridView -Title 'Servers Space Statistics' 

You must be logged in to reply to this topic.