четверг, 28 января 2016 г.

Получить задания TfsAgent'a через PowerShell

Необходимо получить все неудачно выполненные ($_.Result -eq "Failed") задания с именем 'LabManager VMM Server Background Synchronization Job'  ( [Guid[]] @('1039066b-8187-4831-bcb5-cfc981d98140') )за последний час ($time_period = [system.datetime]::Now.AddMinutes(-60)).

Скрипт:

#Load TFS PowerShell Snap-in
if ((Get-PSSnapIn -Name Microsoft.TeamFoundation.PowerShell -ErrorAction SilentlyContinue) -eq $null)
{
    Add-PSSnapin Microsoft.TeamFoundation.PowerShell
}

#Load Reference Assemblies
$tfsCollections = @('https://tfs-pc/tfs/Collection1','https://tfs-pc/tfs/Collection2')
#Get Team Project Collection    
$jobService = $teamProjectCollection.GetService([type]"Microsoft.TeamFoundation.Framework.Client.ITeamFoundationJobService")    

[void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.Client")  
[void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.Framework.Client.TeamFoundationJobService")


# period in min
$time_period = [system.datetime]::Now.AddMinutes(-60) 

foreach($tfsCollectionUrl in $tfsCollections)
{
    $teamProjectCollection = [Microsoft.TeamFoundation.Client.TfsTeamProjectCollectionFactory]::GetTeamProjectCollection($tfsCollectionUrl)

   
    $jobs = $jobService.QueryJobHistory([Guid[]] @('1039066b-8187-4831-bcb5-cfc981d98140')) | ?{ $_.Result -eq "Failed" } | select * | where-object { $_.ExecutionStartTime -ge $time_period }

if ($jobs.Count -gt 1)
    {    
        foreach($i in $jobs)
        {
            if($i.ResultMessage.Contains($ErrorNum))
            {
                Write-Host 'AgentId: '$i.AgentId
                Write-Host 'ExecutionStartTime: '$i.ExecutionStartTime
                Write-Host 'EndTime: '$i.EndTime
                Write-Host 'HistoryId: '$i.HistoryId
                Write-Host 'JobId: '$i.JobId
                Write-Host 'JobSource: '$i.JobSource
                Write-Host 'QueueTime: '$i.QueueTime
                Write-Host 'Result: '$i.Result
                Write-Host 'ResultMessage: '$i.ResultMessage
                Write-Host '-----'
       
            }
        }
    }
}


Просмотреть JobID для определённой Job можно так:
$tfsCollectionUrl = 'https://tfs-pc/tfs/Collection1'
$teamProjectCollection = [Microsoft.TeamFoundation.Client.TfsTeamProjectCollectionFactory]::GetTeamProjectCollection($tfsCollectionUrl)
$jobService = $teamProjectCollection.GetService([type]"Microsoft.TeamFoundation.Framework.Client.ITeamFoundationJobService")
$jobname = 'LabManager VMM Server Background Synchronization Job'
$jobService.QueryJobs() | sort Name | select * | where-object { $_.Name -eq $jobname }



четверг, 3 декабря 2015 г.

Powershell-скрипт, вычисляющий место в папках (из csv-файла)

Скрипт вычисляет место в расшаренных папках ( \\share-pc\share\dir1\ ....)

Формат данных в источнике: 

Script

cls 

$dir = 'C:\Temp\'
$sourceFile='folders.csv'  # import cvs-file
$destFile='result.csv' # export cvs-file

$Csv = Import-Csv $dir$sourceFile
$dest=$dir+$destFile 
$prj_sec = 0
$row = 0


if (Test-Path -Path $dest)
{
    Remove-Item $dest
}

foreach ($folder in $Csv.DropLocation) {
    
    $sec=0
    $row = $row + 1
    $check = 0
    $time_text= Get-Date -Format 'HH:mm:ss' 

    $check = (Test-Path -Path "\\$folder" )

    write-host ' |' $row '| '  -nonewline
    
    if ($check) { write-host \\$folder -nonewline }
        else { write-host \\$folder -nonewline -foregroundcolor gray } # folder not exist

    if ($check)
    {
        $sec=(measure-command {
        $items = (Get-ChildItem "\\$folder" -recurse | Measure-Object -property length -sum) 
        "$folder; {0:N2}" -f ($items.sum / 1MB) | Out-File $dest -append
        }).totalseconds
    }
        
    $sec_f= "{0:N2}" -f $sec

    if ($check) 
    { 
        $space = $items.sum / 1024 / 1024
        $space_f= "{0:N2}" -f $space
        write-host ' | ' -NoNewline
        write-host $space_f 'mb' -NoNewline -foregroundcolor green 
        write-host ' | ' -NoNewline
        write-host $sec_f -NoNewline -foregroundcolor red 
        write-host ' | '
    }
        else { write-host ' ' }

    $prj_sec += $sec
}
$prj_sec = "{0:N2}" -f $prj_sec

    write-host 
    write-host  'Processing Time: ' -nonewline                     
    write-host $prj_sec -nonewline -foregroundcolor Red 
    write-host ' sec.'

понедельник, 31 августа 2015 г.

lansweeper - управление инфраструктурой

Лёгкий способ мониторить небольшую IT-инфраструктуру - www.lansweeper.com







вторник, 23 июня 2015 г.

WinDirStat - просмотр места на диске

WinDirStat - утилита для просмотра статистики использования дискового пространства и его очистки. WinDirStat сканирует дерево каталога и предоставляет статистику в трёх полезных видах: Список каталогов, имеет сходство с видом проводника Winodows, но сортировка существляется по размеру каталога (файла) Карта каталогов, которая отображает полное содержание дерева каталогов в графической форме Список расширений, который служит в качестве легенды и показывает статистику о типах файлов.

Ссылка: https://windirstat.info/
Скачать: http://www.fosshub.com/WinDirStat.html


понедельник, 27 апреля 2015 г.

Не отображаются отчёты SQL Reporting Services (SSRS) в Chrome

Есть несколько вариантов исправления этой баги. Для SSRS 2012 я исправил следующим способом..

Необходимо в начало файла:
C:\Program Files\Microsoft SQL Server\MSRS11.MSSQLSERVER\Reporting Services\ReportManager\js\ReportingServices.js
добавить следующую функцию:


function pageLoad() { 
    var element = document.getElementById("ctl32_ctl09");
    if (element) 
    {
        element.style.overflow = "visible";         
    } 
}
Для версий SSRS ниже 2012, нужно заменить в вышеприведённой функции ctl32_ctl09 на ctl31_ctl10.

После этого, все отчёты на данном экземпляре SSRS стали открываться в Chrome.

ps: может потребоваться очистка кэша браузера.

среда, 15 апреля 2015 г.

Пример создание события в журнале Windows через PowerShell

Вариант №1. Команда EventCreate

Пример:
Eventcreate /t Information /id 101 /l application /d "Create event in application log"

Вариант №2

PS > New-EventLog –LogName Application –Source “My Events
PS > Write-EventLog -LogName Application -Source "My Events" -EntryType Information -EventId 12345 -Message "test event"

, где
-EntryType может иметь значения "Information", "Error", "Warning", ..
Для создания события на определённом компьютере можно использовать параметр -ComputerName.


понедельник, 2 февраля 2015 г.

Чему хороший ПМ может поучится у врача?


Чему хороший ПМ может научиться у хорошего врача? from stratoplan on Vimeo.

Выступление Ивана Селиховкина на онлайн-конференции Стратоконф-1.

среда, 25 июня 2014 г.

Синхронизация доменной группы с группой TFS


Скрипт, который позволяет синхронизировать доменную группу или группу рассылки с TFS-группой.

Этот скрипт полезен для сценария, когда у вас есть группа рассылки Active Directory, для которой необходимо настроить права доступа в TFS. На TFS нет возможности настройки прав для группы рассылки, поэтому я использую этот скрипт для синхронизации всех учёток из группы рассылки с группой TFS, у которой уже есть необходимые права доступа.

Сценарий.
В моём сценарии группа "TFSUsers" это группа рассылки Active Directory, для участников которой требуется настроть доступ в TFS, а именно, дать им разрешения TFS-группы "Collection Readers". Для этой группы рассылки владельцем назначен руководитель отдела разработки, который может легко менять состав  группы через Outlook. Это является ключевым преимуществом перед группой безопасности (security group) Active Directory, т.к. в группе безопасности чтобы дать права на управление составом, необходимо запрашивать доступ у системных администраторов домена, к тому же руководителю отдела разработки придётся ставить у себя на рабочем ПК консоль Active Directory.
Скрипт создаёт в TFS группу "Users", в которую добавляет всех участников группы рассылки Active Directory - "TFSUsers". После этого в TFS добавляет группу "Users" в группу "Collection Readers" у которой уже есть необходимые права доступа. Этот скрипт можно запускать по расписанию, чтобы синхронизация групп была в актуальном состоянии.


      cls

      # Url TFS-коллекции
      $col='http://tfs:8080/tfs/Collection' 

      $adgroup='TFSUsers' 
      $group = "Users"

      .\TFSSecurity /gd $group /collection:$col  #удалить группу
      .\TFSSecurity /gcg $group /collection:$col #создать группу
      .\TFSSecurity /collection:$col /g+ "Collection Readers" n:$group /collection:$col #добавить группу в существующую TFS-группу



      Import-Module ActiveDirectory
      $users=GET-ADGROUPMEMBER $adgroup -recursive | SELECT-OBJECT SamAccountName


      foreach ($p in $users)
      {
          $user=$p.SamAccountName    
          .\TFSSecurity /collection:$col /g+ $group n:$user /collection:$col
      }