четверг, 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
      }

четверг, 19 июня 2014 г.

12 принципов Agile-манифеста

  1. ​​Наивысшим приоритетом для нас является удовлетворение потребностей заказчика, благодаря регулярной и ранней поставке ценного программного обеспечения.
  2. Изменение требований приветствуется, даже на поздних стадиях разработки. Agile-процессы позволяют использовать изменения для обеспечения заказчику конкурентного преимущества.
  3. Работающий продукт следует выпускать как можно чаще, с периодичностью от пары недель до пары месяцев.
  4. На протяжении всего проекта разработчики и представители бизнеса должны ежедневно работать вместе.
  5. Над проектом должны работать мотивированные профессионалы. Чтобы работа была сделана, создайте условия, обеспечьте поддержку и полностью доверьтесь им.
  6. Непосредственное общение является наиболее практичным и эффективным способом обмена информацией как с самой командой, так и внутри команды.
  7. Работающий продукт — основной показатель прогресса.
  8. Инвесторы, разработчики и пользователи должны иметь возможность поддерживать постоянный ритм бесконечно. Agile помогает наладить такой устойчивый процесс разработки.
  9. Постоянное внимание к техническому совершенству и качеству проектирования повышает гибкость проекта.
  10. Простота — искусство минимизации лишней работы — крайне необходима.
  11. Самые лучшие требования, архитектурные и технические решения рождаются у самоорганизующихся команд.
  12. Команда должна систематически анализировать возможные способы улучшения эффективности и соответственно корректировать стиль своей работы.​
Источник: www.agilemanifesto.org

среда, 18 декабря 2013 г.

Разрастание кэша TFS на сервере

У вас на сервере TFS могут возникать проблемы с местом из-за разрастания кэша TFS, который хранится в папке:
  • TFS 2012 - C:\Program Files\Microsoft Team Foundation Server 11.0\Application Tier\Web Services\_tfs_data
  • TFS 2013 - C:\Program Files\Microsoft Team Foundation Server 12.0\Application Tier\Web Services\_tfs_data
Для того, чтобы кэш не разрастался больше фиксированного объёма, необходимо сконфигурировать файл web.config (для TFS 2013 находится в папке C:\Program Files\Microsoft Team Foundation Server 12.0\Application Tier\Web Services).

Внесите в раздел <appSettings> элемент:
 <add key="FixedSizeBasedPolicy" value="NNN" /> 
где NNN - количество мегабайт, больше которого кэш не должен разрастаться.

Например, если вы хотите, чтобы кэш не разрастался более 500 Мб, у вас должно быть:
...
<appSettings>
...
 <add key="FixedSizeBasedPolicy" value="500" /> 
...
</appSettings>


вторник, 19 ноября 2013 г.

Оповещение о создании/удалении баз данных на MS SQL Server

USE master;
GO

CREATE TRIGGER [os_Trigger_Notification_CreateDrop_Database
ON ALL SERVER FOR CREATE_DATABASE, DROP_DATABASE 
AS 
declare @results varchar(max)
declare @subjectText varchar(max)
declare @subjectBegin varchar(255) 
declare @databaseName VARCHAR(255)
BEGIN
SET NOCOUNT ON;
SET @results = (SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)'))
SET @databaseName = (SELECT EVENTDATA().value('(/EVENT_INSTANCE/DatabaseName)[1]', 'VARCHAR(255)'))
SET @subjectBegin = 'Создана'
IF (LEFT(@results,4) = 'DROP') SET @subjectBegin = 'Удалена'
SET @subjectText = @subjectBegin + ' база данных на сервере ' + @@SERVERNAME + ' пользователем ' + SUSER_SNAME() 

EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'MailProfile',
@recipients = 'user@example.ru',
@body = @results,
@subject = @subjectText;

END


Для удаления триггера используйте:
DROP TRIGGER [os_Trigger_Notification_CreateDrop_Database] ON ALL SERVER; 
GO


понедельник, 18 ноября 2013 г.

TFS Planning Guide

Обязательный к прочтению для администратора TFS: http://vsarplanningguide.codeplex.com/

среда, 13 ноября 2013 г.

Перенос базы TempDB в новое место

USE master
ALTER DATABASE tempdb MODIFY FILE(Name = tempdb, Filename = N'C:\NewFolder\tempdb.mdf')
GO

ALTER DATABASE tempdb MODIFY FILE(Name = templog, Filename = N'C:\NewFolder\templog.ldf')
GO

Если необходимо добавить файлы данных для базы TempDB (учитывая рекомендации в соответствии с количеством процессоров):

ALTER DATABASE tempdb
ADD FILE (NAME = tempdev2, FILENAME = 'C:\NewFolder\tempdb2.mdf', SIZE = 256);
ALTER DATABASE tempdb
ADD FILE (NAME = tempdev3, FILENAME = 'C:\NewFolder\tempdb3.mdf', SIZE = 256);
ALTER DATABASE tempdb
ADD FILE (NAME = tempdev4, FILENAME = 'C:\NewFolder\tempdb4.mdf', SIZE = 256);
GO

вторник, 12 ноября 2013 г.

HammerDB - оценка производительности SQL-сервера

HammerDB (бывший Hammerora) - бесплатный инструмент, позволяет проводить TPC-подобные тесты (TPC-C и TPC-H) различных СУБД: Oracle, Microsoft SQL Server, PostgreSQL, Greenplum, MySQL и Redis.



воскресенье, 10 ноября 2013 г.

Сценарий восстановления базы данных с помощью параметра REPAIR_ALLOW_DATA_LOSS

ps: перед использованием обязательно проконсультироваться с врачом прочитать MSDN.
ps2: не рекомендую использовать это в боевой системе без соответствующих знаний, чтобы не нанести вред.

USE [ИмяБазыДанных]

-- 1 шаг. Проверка базы на ошибки

DBCC CHECKDB([ИмяБазыДанных])

-- 2 шаг. Перевод базы в монопольный режим

ALTER DATABASE [ИмяБазыДанных] SET SINGLE_USER WITH ROLLBACK IMMEDIATE

-- 3 шаг. Перевод базы в аварийных режим

ALTER DATABASE [ИмяБазыДанных] SET emergency

-- 4 шаг. Восстановление базы

DBCC CHECKDB([ИмяБазыДанных], REPAIR_ALLOW_DATA_LOSS)

-- 5 шаг

ALTER DATABASE [ИмяБазыДанных] SET multi_user

суббота, 9 ноября 2013 г.

Обслуживание TFS

1. В первую очередь...
  • Применяйте все обновления безопасности. Используйте инструмент MBSA (http://go.microsoft.com/fwlink/?linkid=20567). Критические обновления безопасности должны применяться в течении 48 часов. 
  • Используйте последнюю версию TFS.
  • Используйте последнюю версию SQL.
  • Используйте последнюю версию ОС.
  • Используйте последние версии драйверов оборудования (особенно NIC и SAN/HBA драйвера).
2. Настройка ОС и регулярные задачи
  • Соберите все данные с базовых счётчиков производительности, чтобы выявить узкие места. В будущем это также послужит полезным инструментом диагностики. Необходимо собрать данные счётчиков в рабочий день в течении 24 часов с интервалом 1-5 мин. Не знаете какие счётчики собирать? Используйте инструмент PAL (http://pal.codeplex.com/) с шаблонами "System Overview" and "SQL Server".
  • Обеспечите антивирусные исключения для TFS, SQL и SharePoint (http://support.microsoft.com/kb/2636507
  • Обеспечите корректные правила для Firewall.
  • Убедитесь, что настроен полный дамп памяти (http://support.microsoft.com/kb/254649). При сбое это существенно повысит ваши шансы на исправление причины неполадки. Используйте NotMyFault.exe для создания дампа вручную (http://support.microsoft.com/kb/969028).
  • Не запускайте SQL и TFS под учётной записью локального администратора.
3. Настройка SQL
4. Регулярное обслуживание SQL
5. Настройка TFS
  • Иметь не меньше 2 App-tier (серверов приложений) в NLB. Это позволит вам использовать 2 job-агента для запуска фоновых заданий TFS, выполнять больше запросов/сек. Убедитесь, что NLB имеет TCP Idle timeout в 60 минут и все ваши клиенты используют последнюю версию. См. http://blogs.msdn.com/b/granth/archive/2013/02/13/tfs-load-balancers-idle-timeout-settings-and-tcp-keep-alives.aspx
  • Включите SQL Page Compression для таблиц кроме tbl_Content. Для включения используйте действия, обратные KB2712111.
  • Убедитесь, что включено секционирование таблиц для Version Control. Не рекомендуется, если у вас >1 млн. строк в tbl_LocalVersion. Обратитесь в службу поддержки MS т.к. это недокументированная возможность только для самых больших TFS instances (например, для DevDiv).
  • Проверьте, что SOAP gzip compression включена (http://blogs.msdn.com/b/granth/archive/2010/05/09/tfs2010-how-to-enable-compression-for-soap-traffic.aspx)
  • Отключить log-файлы IIS, чтобы они не заполнили диск: %windir%\system32\inetsrv\appcmd set config -section:system.webServer/httpLogging /dontLog:"True"  /commit:apphost
  • Изменить TFS App Pool Idle Timeouts с 20 до 0 минут (нет тайм-аута) и отключить scheduled recycling чтобы не было остановок в рабочие часы. 
  • Запустить TFS Proxy Server и убедиться, что сотрудники используют его (особенно build-сервер). Даже если не будет удалённых пользователей, это всеравно увеличит количество обрабатываемых запросов (request/sec) на App-tier. Сконфигурируйте его как прокси-сервер по умолчанию для сайта: tf proxy /add
  • При необходимости включить work item tracking metadata filtering.
  • Проверить корректность работы SMTP (SMTP settings). Наиболее распространённой проблемой здесь является ..
  • Установите NotificationJobLogLevel = 2 (http://blogs.msdn.com/b/granth/archive/2009/10/28/tfs2010-diagnosing-email-and-soap-subscription-failures.aspx) чтобы получать подробное сообщение об ошибке (например, используя TFS Best Practice Analyzer из TFS Power Tools)
  • Перенести кеш TFS на отдельный физический и/или логический диск. Как это сделать - http://msdn.microsoft.com/en-us/library/vstudio/ms400793.aspx. Во-первых, снизить нагрузку на систему ввода/вывода. Во-вторых, если вы восстановите базу данных на более ранний момент времени, вам необходимо будет очистить кеш TFS, иначе пользователям будет выдаваться неправильный контент. Если кеш TFS будет на отдельном диске, сделать это можно будет очень быстро. 
6. Регулярное обслуживание TFS
  • Проводите регулярные проверки с помощью TFS Best Practice Analyzer из пакета TFS Power Tools. Это поможет вам выявить проблемы, которые присутствуют на вашем сервере TFS.
  • Периодически просматривайте Activity Log и Job Monitoring в панели управления вашего сервера TFS - http://ServerName:8080/tfs/_oi/. В Activity Log вы можете просмотреть последние действия пользователей на сервере TFS. В Job Monitoring вы увидите успешно ли выполняются сервисные задания TFS-агента. 
  • Установите Performance Report Pack для просмотра пользователей, которые больше всех нагружают TFS. Также, анализируйте таблицу TFS-коллекции - tbl_Command.
  • Используйте Test Attachment Cleaner Tools (см. http://geekswithblogs.net/terje/archive/2011/11/15/guide-to-reduce-tfs-database-growth-using-the-test-attachment.aspx) для очистки таблицы tbl_Content.
  • Очищайте неиспользуемые workspaces и shelvesets. Используйте Team Foundation Sidekicks. Команда: tf workspace /delete.
  • Удаление полей, которые не используются (witadmin listfields /collection:http://tfs:8080/tfs/Collection /unused).
  • Проверяйте здоровье куба и warehouse с помощью Admin Report pack.
  • Проанализируйте поля со свойством reportingtype=’dimension’. Действительно ли они должны находится в кубе? Если нет, то поменяйте значение на 'detail' и при необходимости вызывайте их с помощью базы данных Tfs_Warehouse
  • Проанализируйте запросы на использование полей. Возможно, необходимо проиндексировать некоторые поля (witadmin indexfield /index:on) для увеличения быстродействия.
  • Проверьте tbl_EventSubscriptions на наличие невалидных получателей (email). Для удаления подписок используйте TFS Web Access "All Alerts" - http://yourserver:8080/tfs/YourCollection/YourProject/admin/_alerts
Первоисточник: http://blogs.msdn.com/b/granth/archive/2013/10/08/what-does-a-well-maintained-team-foundation-server-look-like.aspx

вторник, 29 октября 2013 г.

Тест дисковой подсистемы SQL-сервера с помощью SQLIO

Дисковую подсистему сервера с СУБД SQL Server рекомендуется тестировать с помощью утилиты SQLIO (http://www.microsoft.com/en-us/download/details.aspx?id=20163).


понедельник, 28 октября 2013 г.

Тест процессора для SQL-сервера с помощью Geekbench

Для тестирования производительности процессора сервера с СУБД SQL Server рекомендуется использовать утилиту Geekbench (http://www.primatelabs.com/geekbench/).

Помимо количественных показателей различных тестов процессора утилита выдаёт общий балл производительности процессора.

В итоге, вы увидите следующую информацию..






Утилита также запускается и в консольном варианте.