VBscript для получения пользовательских документов и размера папки на рабочем столе
Я искал в Интернете достойный сценарий, который позволил бы мне собирать размеры папок подпапок на компьютерах с Windows 7. Примерно 50 компьютеров, я хочу получить размеры папок в C:\Users\username\Documents и C:\Users\username\Desktop).
У меня нет опыта написания сценариев (я начну учиться по этой причине) и у меня недостаточно знаний для редактирования сценария другого человека.
Сценарий, над которым я работал, приведен ниже. И если кто-нибудь может указать мне правильное направление, я был бы очень благодарен.
' 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
1 ответ
Я знаю, что это не ответит на ваш вопрос по vbscript, но я бы порекомендовал powershell, если вы открыты для этого. Как правило, это гораздо проще, просто чтобы дать вам пример...
Вот ссылка для начала: http://technet.microsoft.com/en-us/library/ff730945.aspx
и вот модифицированная версия их примера:
$colItems = (Get-ChildItem C:\users\username\desktop -recurse | Measure-Object -property length -sum)
"{0:N2}" -f ($colItems.sum / 1MB) + " MB"
Изменить значения в C:\users\username\desktop
и скажите мне, если вам нравятся результаты. Если вам нужна помощь в зацикливании и получении данных с удаленных компьютеров, дайте мне знать.
Сценарий v1: он не идеален, но я думаю, что он будет работать по большей части. Вам нужно будет загрузить Quest AD CMDlets и установить его в той системе, с которой вы собираетесь его запускать. Кроме того, вам нужно установить политику выполнения на удаленное подписывание. Затем скопируйте этот скрипт на локальный диск этой системы. Вам нужно отредактировать три значения: $rootou (это ваше подразделение, которое вы хотите найти) и две строки под путями #Export. Дайте мне знать, как это работает. или если вам нужна копия загруженного скрипта.
#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