VBscript para obter os documentos do usuário e o tamanho da pasta da área de trabalho

1

Eu tenho vasculhado a web em busca de um script decente que me permita reunir tamanhos de pasta de subpastas em máquinas com Windows 7. Há cerca de 50 computadores que eu quero obter tamanhos de pasta em C: \ Users \ username \ Documents e C: \ Users \ username \ Desktop).

Não tenho experiência com scripts (vou começar a aprender por causa disso) e não tenho conhecimento suficiente para editar o script de outra pessoa.

O script do qual trabalhei está abaixo. E se alguém puder me apontar na direção certa, eu ficaria muito grato.

' Name : localprofiles.vbs
' Description : script to enumerate the local profile size of all computers and users in Active Directory
' Author : dirk adamsky - deludi bv
' Version : 1.00
' Date : 28-06-2011

Set adoCommand = CreateObject("ADODB.Command")
Set adoConnection = CreateObject("ADODB.Connection")
adoConnection.Provider = "ADsDSOObject"
adoConnection.Open "Active Directory Provider"
adoCommand.ActiveConnection = adoConnection
Set objRootDSE = GetObject("LDAP://RootDSE")
strBase = "<LDAP://" & objRootDSE.Get("defaultNamingContext") & ">"
strFilter = "(&(objectCategory=computer)(|(operatingSystem=Windows XP Professional)(operatingSystem=Windows 7*)))"
strAttributes = "name, operatingSystem"
strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";subtree"
adoCommand.CommandText = strQuery
adoCommand.Properties("Page Size") = 100
adoCommand.Properties("Timeout") = 30
adoCommand.Properties("Cache Results") = False

Set adoRecordset = adoCommand.Execute

Do Until adoRecordset.EOF
    strHostname = adoRecordset.Fields("name").Value
    If CheckStatus(strHostname) = True Then
        If Instr(adoRecordset.Fields("operatingSystem").Value, "XP") > 0 Then
            strLocalProfilePath = "\Documents and Settings\"
        ElseIf Instr(adoRecordset.Fields("operatingSystem").Value, "7") > 0 Then
            strLocalProfilePath = "\users\"
        End If
        GetLocalProfileSize strHostname, "\" & strHostname & "\c$" & strLocalProfilePath
    End If
    adoRecordset.MoveNext
Loop

adoRecordset.Close
adoConnection.Close

Set adoRecordset = Nothing
Set objRootDSE = Nothing
Set adoConnection = Nothing
Set adoCommand = Nothing

Function CheckStatus(strAddress)
    Dim objPing, objRetStatus
    Set objPing = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery _
      ("select * from Win32_PingStatus where address = '" & strAddress & "'")
    For Each objRetStatus In objPing
        If IsNull(objRetStatus.StatusCode) Or objRetStatus.StatusCode <> 0 Then
            CheckStatus = False
        Else
            CheckStatus = True
        End If
    Next
    Set objPing = Nothing
End Function

Function GetLocalProfileSize(strTargetMachine, strFolder)
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFolder = objFSO.GetFolder(strFolder)
    For Each SubFolder in objFolder.SubFolders
        Logprint strTargetMachine & " ; " & SubFolder.Name & " ; " & SubFolder.Path & " ; " & Round(SubFolder.Size/1048576,2) & " MB"
    Next
    Set objFolder = Nothing
    Set objFSO = Nothing
End Function

Function LogPrint(Message)
Const ForAppending = 8
strDate = Replace(Date,"/","-")
Set ObjFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = ObjFSO.OpenTextFile("c:\temp" & strDate & "-localprofiles.csv", ForAppending, True)
    objTextFile.WriteLine Message
    objTextFile.Close
Set objTextFile = Nothing
Set ObjFSO = Nothing
End Function
    
por Rowell 28.01.2012 / 01:50

1 resposta

2

Eu sei que isso não irá responder à sua pergunta pelo vbscript, mas eu recomendaria o powershell se você estiver aberto a isso. Normalmente é muito mais fácil, apenas para dar um exemplo ...

Este é um link para começar: link

e aqui está uma versão modificada de seu exemplo:

$colItems = (Get-ChildItem C:\users\username\desktop -recurse | Measure-Object -property length -sum)
"{0:N2}" -f ($colItems.sum / 1MB) + " MB"

Altere os valores em C:\users\username\desktop e diga-me se você gostou dos resultados. Se você quiser e quiser ajuda com looping e pegar os dados de computadores remotos, me avise.

Script v1: Não é perfeito, mas acho que funcionará na maior parte do tempo. Você precisará fazer o download dos CMDlets da Quest AD e instalá-los no sistema a partir do qual será executado. Além disso, você precisará definir sua política de execução como remotesigned. Em seguida, copie esse script para a unidade local desse sistema. Você precisará editar três valores, o $ rootou (essa é a UO que deseja pesquisar) e as duas linhas em #Exportar caminhos. Deixe-me saber como funciona. ou se você precisar de uma cópia do script carregado.

#Script used to gather data size of remote computers user profiles by Eric C. Singer

#a generic powershell object used to group a collection of various objects into a single object 
$data = new-object psobject
$columns = @"
ComputerName
ProfileName
DocumentsSizeMB
DesktopSizeMB
"@
$columns -split "'n" |%{$data | add-member -membertype noteproperty -name $_.trim() -value $null}

#Store a list of computers that we couldn't connect to
$failedcomputers = New-Object System.Collections.ArrayList

#Store the results of the gathered data
$foldersize = New-Object System.Collections.ArrayList

#Root OU that you want to start searching for computers
$RootOU = "yourdomain.org/your ou/ your sub-ou"

#Getting a list of all computers
$allcomputers = Get-QADComputer -SearchRoot "$rootou" -SizeLimit 0

#Export paths
$failedcomputersfiles = "c:\yourpath\yourfile.csv"
$foldersizefile = "c:\yourpath\yourfile.csv"

#Looping through each computer
Foreach ($computer in $allcomputers)
    {
#Seeing if we can connect to the computer, if not, we're going to add it to the failedcomputers array.
    If (Test-Path "\$($computer.name)\c$")
        {
#Setting the two possiable paths based on whether its Windows 7 or XP
        $Windows7ProfileRoot = "\$($computer.name)\c$\Users"
        $WindowsXPProfileRoot = "\$($computer.name)\c$\Documents and Settings"
#if the computer is windows 7 run this, or go to the else statement
        If ($($computer.OSName) -like "Windows 7*")
            {
#getting a list of profiles
            $allprofiles = Get-ChildItem $Windows7ProfileRoot | Where-Object {$_.PSIsContainer -eq $true}
#Looping through each profile and running the following.
            Foreach ($user in $allprofiles)
                {
                $data.ComputerName = $computer.name
                $data.ProfileName = $user.name
                $userdesktop = (Get-ChildItem "$Windows7ProfileRoot\$($user.name)\desktop" -recurse | Measure-Object -property length -sum).sum / 1MB
                $userdocuments = (Get-ChildItem "$Windows7ProfileRoot\$($user.name)\documents" -recurse | Measure-Object -property length -sum).sum / 1MB
                $data.DesktopSizeMB = $userdesktop
                $data.DocumentsSizeMB = $userdocuments
                $data | Select-Object * | ForEach-Object {$foldersize.Add($_)}
                }
            }
        Else
            {
            $allprofiles = Get-ChildItem $WindowsXPProfileRoot | Where-Object {$_.PSIsContainer -eq $true}
            Foreach ($user in $allprofiles)
                {
                $data.ComputerName = $computer.name
                $data.ProfileName = $user.name
                $userdesktop = (Get-ChildItem "$WindowsXPProfileRoot\$($user.name)\desktop" -recurse | Measure-Object -property length -sum).sum / 1MB
                $userdocuments = (Get-ChildItem "$WindowsXPProfileRoot\$($user.name)\my documents" -recurse | Measure-Object -property length -sum).sum / 1MB
                $data.DesktopSizeMB = $userdesktop
                $data.DocumentsSizeMB = $userdocuments
                $data | Select-Object * | ForEach-Object {$foldersize.Add($_)}
                $data
                }
            }
        }
    Else
        {
        $failedcomputers.Add("$($computer.name)")
        }
    }

$failedcomputers | Export-Csv $failedcomputersfiles -NoTypeInformation
$foldersize | Export-Csv $foldersizefile -NoTypeInformation
    
por 28.01.2012 / 02:01