none
Сохранение размера папки в отдельный файл из списка компов в AD. RRS feed

  • Вопрос

  • Добрый день.

    Подскажите пожалуйста. На рабочих станциях на диске D есть папка пусть будет test.

    Необходимо написать скрипт, который по списку компов в AD прошелся по очереди, высчитал размер этой папки и сохранил на сервере текстовый или csv файл с записью имя компа и размер папки.

    На форумах нашел только скрипты которые могут или выводить в командной строке результат или же сохранять в текстовый файл. но это единичный вариант. А именно список компов в одном файле.

    Заранее спасибо! К сожалению еще не владею скриптовыми языками, поэтому обращаюсь за помощью

    29 августа 2017 г. 11:50

Ответы

  • компьютеры которые не будут в сети в момент опроса, что с ними делать?

    Компьютеры на которых не будет этой папки, с ними что?

    Рассмотрите вариант повесить скрипт на логон и раскатить политикой(а данные сохранять в csv). В вашем случае это будет легче. 

    Начать можно отсюда:

    https://technet.microsoft.com/en-us/library/ff730945.aspx    размер папки

    https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/import-csv?view=powershell-5.1 import export csv

    29 августа 2017 г. 12:36
  • class PCInfo{

    [string]$Name;
    [string]$Sid;
    [string]$Size;
        
        PCInfo([string]$obSid,[string]$obName,[string]$obPathsize)
        {
         $this.Sid =$obSid;
         $this.Name =$obName;
         $this.Size = $obPathsize;
        }
       
    }

    #Папка каую считаем пример: "C$\NewFolder"
    $dirPath = "Folder";
    #Куда выгрузим пример: "C:\Folder\export.csv"
    $dirExportContent = "C:\Folder\export.csv";

    #Все компы AD, фильтр сами добавьте
    $compsAD = Get-ADComputer -Filter *| select SID,name;
    $lsPCInfo = New-Object "System.Collections.Generic.List[PCInfo]";

    foreach ($comp in $compsAD)
    {
    $dircomp = "\\" + [system.IO.Path]::Combine($comp.Name, $dirPath);
    if (Test-Path $dircomp)
    {
    $colItems = (Get-ChildItem $dircomp -recurse | Measure-Object -property length -sum);
    $sizePath = "{0:N2}" -f ($colItems.sum / 1MB) + " MB";
    $newEnt = New-Object PCInfo($compsAD.SID.ToString(), $compsAD.name.ToString(), $sizePath.ToString());
    $lsPCInfo.Add($newEnt);
    }


    }

    $lsPCInfo| Export-Csv -Delimiter ";" -Path $dirExportContent -Encoding default -NoTypeInformation


    Я вам дал скрипт, то что вы просили изначально. И откомментировал в нужных местах. Powershell 5.0



    29 августа 2017 г. 13:36
  • Однако замесу, что тут написано в тупую, то есть если комп не доступен, будет задумываться на несколько секунд. Захотите допилите пинг и прочее.
    29 августа 2017 г. 13:39

Все ответы

  • компьютеры которые не будут в сети в момент опроса, что с ними делать?

    Компьютеры на которых не будет этой папки, с ними что?

    Рассмотрите вариант повесить скрипт на логон и раскатить политикой(а данные сохранять в csv). В вашем случае это будет легче. 

    Начать можно отсюда:

    https://technet.microsoft.com/en-us/library/ff730945.aspx    размер папки

    https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/import-csv?view=powershell-5.1 import export csv

    29 августа 2017 г. 12:36
  • Те компы которые не в сети должны пропускаться, а какой смысл делать при логоне, он же будет сохранять в отдельный файл на каждом компе, а нужен единый файл в котором список компов и размер папки?

    Ага спасибо сейчас посмотрю.

    29 августа 2017 г. 12:46
  • Вы сделаете общий файл, дадите туда доступ. И будете писать в него, а не на комп.
    29 августа 2017 г. 12:47
  • А разве не будет конфликта доступа? скажем 2 человека залогинились и одновременно начали писать в этот файл данные.
    29 августа 2017 г. 13:00
  • Да будут, если попадут в один и тот же момент. Можно отлавливать. Опрос всех ПК тоже не лучший вариант, я бы предложил тогда писать в таблицу БД.
    29 августа 2017 г. 13:17
  • class PCInfo{

    [string]$Name;
    [string]$Sid;
    [string]$Size;
        
        PCInfo([string]$obSid,[string]$obName,[string]$obPathsize)
        {
         $this.Sid =$obSid;
         $this.Name =$obName;
         $this.Size = $obPathsize;
        }
       
    }

    #Папка каую считаем пример: "C$\NewFolder"
    $dirPath = "Folder";
    #Куда выгрузим пример: "C:\Folder\export.csv"
    $dirExportContent = "C:\Folder\export.csv";

    #Все компы AD, фильтр сами добавьте
    $compsAD = Get-ADComputer -Filter *| select SID,name;
    $lsPCInfo = New-Object "System.Collections.Generic.List[PCInfo]";

    foreach ($comp in $compsAD)
    {
    $dircomp = "\\" + [system.IO.Path]::Combine($comp.Name, $dirPath);
    if (Test-Path $dircomp)
    {
    $colItems = (Get-ChildItem $dircomp -recurse | Measure-Object -property length -sum);
    $sizePath = "{0:N2}" -f ($colItems.sum / 1MB) + " MB";
    $newEnt = New-Object PCInfo($compsAD.SID.ToString(), $compsAD.name.ToString(), $sizePath.ToString());
    $lsPCInfo.Add($newEnt);
    }


    }

    $lsPCInfo| Export-Csv -Delimiter ";" -Path $dirExportContent -Encoding default -NoTypeInformation


    Я вам дал скрипт, то что вы просили изначально. И откомментировал в нужных местах. Powershell 5.0



    29 августа 2017 г. 13:36
  • Однако замесу, что тут написано в тупую, то есть если комп не доступен, будет задумываться на несколько секунд. Захотите допилите пинг и прочее.
    29 августа 2017 г. 13:39
  • Да спасибо вам огромное я понял. Если что то будет непонятно я напишу.
    30 августа 2017 г. 5:31