четверг, 13 сентября 2012 г.

Другие полезные команды PowerShell для Active Directory


cls
Import-Module ActiveDirectory

# Просмотр всех участников определённой доменной группы
GET-ADGROUPMEMBER 'DomainGroup' | SELECT-OBJECT Name, DistinguishedName, SamAccountName

# Найти по вхождение фразы определённых пользователей и показать их данные
Get-ADUser -Filter {name -like "*Petr*"} | FT Name,DisplayName, SamAccountName, ADGroup, EmailAddress, UserPrincipalName, Department, Description -A

Как просмотреть все доменные группы пользователя используя PowerShell


# Список доменных учётных записей, для которых необходимо показать все их доменные группы
$usrs=@('Ivanov','Petrov')   

    foreach ($usr in $usrs)
    {
        write-host ' '
        write-host '--[' -nonewline
        write-host $usr  -nonewline -foregroundcolor Red
        write-host ']-------- '          
       #get-aduser $usr | FT Name, SamAccountName,UserPrincipalName,SID,ObjectGUID
        write-host 'Доменные группы: ' 
        $query = "ASSOCIATORS OF {Win32_Account.Name='"+$usr+"',Domain='DomainName'} WHERE ResultRole=GroupComponent ResultClass=Win32_Account"
        Get-WMIObject -Query $query | Select Name
        write-host '-------------------- '             
    }

среда, 5 сентября 2012 г.

TFS Administrators Toolkit

Полезный инструмент для администраторов TFS - TFS Administrators Toolkit (Ссылка).


вторник, 28 августа 2012 г.

пятница, 24 августа 2012 г.

Изменить RECOVERY MODEL для множества баз данных через скрипт

Установка простой модели ("SIMPLE") восстановления на все базы данных SQL-сервера (MS SQL Server 2008/2008R2).

EXEC sp_MSforeachdb 'if ''?'' not in (''master'', ''model'', ''msdb'', ''tempdb'') ALTER DATABASE [?] SET RECOVERY SIMPLE'


четверг, 2 августа 2012 г.

Как связать проект на Project Server с существующим сайтом на SharePoint?

Для этого необходимо зайти на Project Web App (корневой портал Project Server).
Далее, в меню слева выбрать Параметры сервера > в разделе Действующие политики выбрать Сайты проектов. На открывшейся странице необходимо выделить свой проект и в верхнем меню нажать Изменить адрес сайта. В появившемся окне настроек вы можете задать новый адрес сайта для выбранного проекта.

Картинки на рабочий стол







вторник, 31 июля 2012 г.

Проблема с разрастанием базы TFS-коллекции

[статья неокончена]

При запуске тестов (ручных или автоматических) на TFS создаётся много файлов, например:

  • логи IntelliTrace (.ITrace);
  • логи видео;
  • логи результатов тестов (.TRX);
  • Code Coverage (.COV).
Информация в этих файлах очень полезна для анализа ошибок в коде. Но проблемой является то, что эти данные могут быстрыми темпами увеличить размер базы данных коллекции. Администратору TFS необходимо настроить политику ограничения размера и политику хранения прикрепляемых к тесту данных.



Запрос, показывающий размер всех таблиц в базе данных:


CREATE TABLE #t (     
[name] NVARCHAR(128),    
[rows] CHAR(11),    
reserved VARCHAR(18),     
data VARCHAR(18),     
index_size VARCHAR(18),    
unused VARCHAR(18)) 
GO

INSERT #t 
EXEC [sys].[sp_MSforeachtable] 'EXEC sp_spaceused ''?''' 
GO

SELECT 
    name as TableName, 
    Rows, 
    ROUND(CAST(REPLACE(reserved, ' KB', '') as float) / 1024,2) as ReservedMB, 
    ROUND(CAST(REPLACE(data, ' KB', '') as float) / 1024,2) as DataMB, 
    ROUND(CAST(REPLACE(index_size, ' KB', '') as float) / 1024,2) as IndexMB, 
    ROUND(CAST(REPLACE(unused, ' KB', '') as float) / 1024,2) as UnusedMB 
FROM #t 
ORDER BY CAST(REPLACE(reserved, ' KB', '') as float) DESC 
GO

DROP TABLE #t 
GO




Запрос показывающий рост вложений в базе коллекции:


SELECT  
  DATEADD(month,DATEDIFF(month,0,creationdate),0) as [Month], 
  SUM(CompressedLength) / 1024 / 1024 as AttachmentSizeMB 
FROM tbl_Attachment WITH (nolock) 
GROUP BY DATEADD(month,DATEDIFF(month,0,creationdate),0)  
ORDER BY DATEADD(month,DATEDIFF(month,0,creationdate),0)


Запрос, показывающий размер данных в базе коллекции по проектам:

SELECT  
p.projectname AS Project, 
SUM(a.compressedlength)/1024/1024 as Mb from dbo.tbl_Attachment as a inner join tbl_testrun as tr on a.testrunid=tr.testrunid inner join tbl_project as p on p.projectid=tr.projectid
GROUP BY p.projectname
ORDER BY SUM(a.compressedlength) DESC



Запрос, показывающий какие типы вложений занимают наибольшее место в базе коллекции:

SELECT  
a.attachmenttype, 
SUM(a.compressedlength)/1024/1024 as sizeInMB from dbo.tbl_Attachment as a inner join tbl_testrun as tr on a.testrunid=tr.testrunid 
inner join tbl_project as p on p.projectid=tr.projectid
GROUP BY a.attachmenttype
ORDER BY SUM(a.compressedlength) DESC



Запрос, показывающий, файлы каких типов занимают наибольшее место:

SELECT  
SUBSTRING(filename,len(filename)-CHARINDEX('.',REVERSE(filename))+2,999)as Extension, 
SUM(compressedlength)/1024/1024 as Mb from tbl_Attachment
GROUP BY SUBSTRING(filename,len(filename)-CHARINDEX('.',REVERSE(filename))+2,999)
ORDER BY SUM(compressedlength) DESC



Для очистки таблицы базы от результатов тестов рекомендуется использовать Test Attachment Cleaner (ссылка)

Ссылки:

среда, 25 июля 2012 г.

Поиск совпадений в 2-х списках с помощью Excel

Я использовал функцию Match.

Пример: 
=IF(ISERROR(MATCH(B2;A2:A500;0));"-";"YES")

В примере мы проверяем значения на совпадения из диапазона A2:A500 и ячейки B2. Далее записываем значение "YES" в ячейку C2 если совпадение существует. Аналогично проверка выполняется для других ячеек B3, B4, B5, ...



Пример скачать.

понедельник, 23 июля 2012 г.

пятница, 20 июля 2012 г.

Интеграция Outlook с SharePoint

Отличное расширение для интеграции Outlook и Sharepoint - harmon.ie

Возможности:
- позволяет работать с документами, находящимися на сайтах SharePoint, из Outlook;
- удобно встраивать ссылки на документы в почтовые сообщения;
- и многое др.

четверг, 28 июня 2012 г.

PowerShell. Вывод всех учётных записей домена для определённого департамента (OU, Organization Unit)

Пример для департамента "Disabled Accounts" и домена "CompanyDomain":

cls
Import-Module ActiveDirectory


Get-ADUser -Filter "*" -SearchBase "OU=Disabled Accounts,DC=CompanyDomain" | sort Name | FT Name, SamAccountName, UserPrincipalName -A

вторник, 19 июня 2012 г.

Назначение домашней страницы для SharePoint-сайта через PowerShell


cls


if(!(Get-PSSnapin Microsoft.SharePoint.Powershell -ErrorAction:SilentlyContinue))
{
    Add-PSSnapin Microsoft.SharePoint.Powershell
}


# -------------------------------------------------
# Сайт
$site="http://sp-serv"
# Страртовая страница
$homePage="home.aspx"
# -------------------------------------------------


$assignment=Start-SPAssignment
$web=Get-SPWeb -Identity $site -AssignmentCollection $assignment


# Назначение домашней страницы
$rootFolder=$web.RootFolder
$rootFolder.WelcomePage=$homePage
$rootFolder.Update()


Stop-SPAssignment $assignment
$web.Update()
$web.Dispose()


write-host 'Для сайта ' -nonewline 
write-host $site -nonewline -foregroundcolor Blue
write-host ' домашняя страница изменена на ' -nonewline
write-host $homePage -foregroundcolor Blue

среда, 6 июня 2012 г.

Запрос, показывающий информацию о всех базах данных на SQL Server 2008






SELECT 
 t2.database_id as "ID", 
 t2.name as "Имя базы данных",   
 t3.size as "Размер (Мб)",
 t2.create_date as "Создан", 
 suser_sname(t2.owner_sid) as "Владелец",
 t1.filename as "Файл данных",
 t2.collation_name as "Сортировка (Collation)",
 t2.compatibility_level "Уровень совместимости базы",
 t2.recovery_model_desc as "Модель восстановления"  
FROM sys.sysdatabases as t1 left join sys.databases as t2 on t1.dbid=t2.database_id
left join (SELECT v1.database_id, REPLACE(CAST(sum(CAST(v2.size as decimal(24,2)))/128  as decimal(24,2)) ,'.',',') as size FROM sys.databases as v1 LEFT OUTER JOIN sys.master_files AS v2 ON v1.database_id = v2.database_id GROUP BY v1.database_id) as t3 on t1.dbid=t3.database_id 
WHERE t2.name NOT IN ('master', 'model', 'msdb', 'tempdb')
ORDER BY t2.name



Обновления скрипта:

  • [2012/08/01] Поправлено определение размера базы данных.

понедельник, 4 июня 2012 г.

Все рабочие элементы TFS в WebAccess стали недоступными на изменение

Такое бывает при восстановление базы TFS на новом сервере или в других случаях.
Причём, изменение элементов недоступно только в WebAccess, в Visual Studio всё отлично.
В таком случае необходимо очистить кэш WebAccess. Находится он на сервере в следующей папке:

  • C:\ProgramData\Microsoft\Team Foundation\Web Access

Остановка всех служб TFS

Для выполнения каких-либо задач, связанных с администрированием TFS, иногда необходимо остановить все службы TFS.
Для этого используется команда TFSServiceControl.

Остановка всех служб TFS: TFSServiceControl quiesce
Запуск всех служб TFS: TFSServiceControl unquiesce

Подробнее о команде: http://msdn.microsoft.com/ru-ru/library/ff470382.aspx



вторник, 29 мая 2012 г.

В разделе "Администрирование сайта" не отображается пункт "Управление банком терминов"



Столкнулся со следующей проблемой, в разделе "Администрирование сайта" не отображается пункт "Управление банком терминов". Служба управления метаданных настроена и запущена. Также, в разделе "Управление возможностями сайта" активирован компонент "Навигация и фильтрация метаданных". Т.е. никаких видимых причин нет.

Нашёл следующее решение. Необходимо активировать компонент на сервере SharePoint через PowerShell:
>> Enable-SPFeature -id "73EF14B1-13A9-416b-A9B5-ECECA2B0604C" -Url http://ВашВебСайт








среда, 23 мая 2012 г.

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

Используйте следующий SQL-скрипт.

use master
alter database tempdb
modify file(
name = tempdev,
filename = N'D:\НоваяПапка\tempdb.mdf')
go

alter database tempdb
modify file(
name = templog,
filename = N'D:\НоваяПапка\templog.ldf')
go

Для запуска SQL-скрипта запустите SQL Server Management Studio, нажмите Ctrl+N или в меню выберите File > New > Query with Current Connection.
В открывшееся окно введите SQL-скрипт.

вторник, 15 мая 2012 г.

Ошибка TF400508 в TFS 11 Beta

После миграции коллекции из TFS 2010 на TFS 11 в проектах мигрированной коллекции в TWA (Team Web Access) отображалась следующая ошибка:
TF400508: The current process settings are either missing or not valid. These settings must be defined by a project administrator.


Эта проблема затрагивает только коллекции, мигрированные с предыдущих версий TFS. Во вновь созданных коллекциях на TFS 11 такой проблемы не наблюдается.
Связано это с различием в шаблонах в новой версии. Необходимо привести их в соответствие.

1. Необходимо скачать "Visual Studio 11 Beta Files to Update Team Project" (ссылка). Извлечь файлы архива в локальную папку на сервере TFS 11.
2. Запустить Developer Command Prompt. Для этого нажать Start > All Programm > Microsoft Visual Studio > Visual Studio Tools > Developer Command Prompt.
3. Измените локальную папку командой cd MyDirectory на ту, куда вы распаковали архив UpgradeProject.zip.
4. Запустите команду: 
updateProject CollectionURL ProjectName TemplateName

Например:
c:\UpdateProject> updateProject http://server-tfs:8080/tfs/TestCollection MyProject CMMi

Скрипт updateProject запустит 6 команд. Если все команды выполнены успешно, вы можете проверить результат на сайте 
http://server-tfs:8080/tfs/TestCollection/MyProject


Более подробно эта информация описана в статье "Updating an Upgraded Team Project to Access New Features" (ссылка).

См. также:
http://blogs.msdn.com/b/visualstudioalm/archive/2012/03/06/get-your-agile-project-fixed-after-an-upgrade-from-tfs2010-to-tfs11-beta.aspx

Видео: http://channel9.msdn.com/Blogs/VisualStudio/Upgrading-to-Team-Foundation-Server-11-Process-Templates

понедельник, 14 мая 2012 г.

Ошибка TF221122 при установке TFS 11 Beta


После установки TFS 11 я не мог перестроить куб отчётности TFS. В веб-сервисе администрирования куба (http://localhost:8080/tfs/TeamFoundation/Administration/v3.0/WarehouseControlService.asmx) при запуске GetProcessingStatus выводилась ошибка TF221122:

[Full Analysis Database Sync]: ---> Microsoft.TeamFoundation.Warehouse.WarehouseException: TF221122: An error occurred running job Full Analysis Database Sync for team project collection or Team Foundation server TEAM FOUNDATION. ---> Microsoft.TeamFoundation.Framework.Server.AnalysisServiceConnectionException: Error encountered when creating connection to Analysis Services. Contact your Team Foundation Server administrator. ---> Microsoft.AnalysisServices.XmlSerializationException: Deserialization failed: Requested value 'EnterpriseCore64' was not found. ---> System.ArgumentException: Requested value 'EnterpriseCore64' was not found. at System.Enum.TryParseEnum(Type enumType, String value, Boolean ignoreCase, EnumResult& parseResult) at System.Enum.Parse(Type enumType, String value, Boolean ignoreCase) at Microsoft.AnalysisServices.DesignXmlReader.ReadPrimitive(Type type, XmlAttributes attributes) at Microsoft.AnalysisServices.DesignXmlReader.ReadStructContent(Object obj, StructMapping mapping) at Microsoft.AnalysisServices.DesignXmlReader.ReadObjectContent(Object value, Type type, TypeMapping mapping) at Microsoft.AnalysisServices.DesignXmlReader.ReadRoot(Type type) --- End of inner exception stack trace --- at Microsoft.AnalysisServices.DesignXmlReader.ReadRoot(Type type) at Microsoft.AnalysisServices.DesignXmlReader.DeserializeComponent(IDesignerSerializationManager manager, XmlReader reader, Type root) at Microsoft.AnalysisServices.AnalysisServicesClient.Discover(IMajorObject obj, ObjectExpansion expansion) at Microsoft.AnalysisServices.Server.Refresh(IMajorObject obj, ObjectExpansion expansion) at Microsoft.AnalysisServices.Server.Connect(String connectionString, String sessionId) at Microsoft.TeamFoundation.Warehouse.AnalysisServicesUtil.Connect(Server server, String serverName) --- End of inner exception stack trace --- at Microsoft.TeamFoundation.Warehouse.AnalysisServicesUtil.Connect(Server server, String serverName) at Microsoft.TeamFoundation.Warehouse.TFSOlapProcessComponent.GetLastProcessedTimeStamp(String serverName, String dbName) at Microsoft.TeamFoundation.Warehouse.TFSOlapProcessComponent.DetermineProcessType(TeamFoundationRequestContext requestContext, AnalysisDatabaseProcessingType desiredProcessingType, Boolean& lastProcessingFailed, Boolean& needCubeSchemaUpdate) at Microsoft.TeamFoundation.Warehouse.AnalysisDatabaseSyncJobExtension.RunInternal(TeamFoundationRequestContext requestContext, TeamFoundationJobDefinition jobDefinition, DateTime queueTime, String& resultMessage) at Microsoft.TeamFoundation.Warehouse.WarehouseJobExtension.Run(TeamFoundationRequestContext requestContext, TeamFoundationJobDefinition jobDefinition, DateTime queueTime, String& resultMessage) --- End of inner exception stack trace ---

Здесь нужно обратить внимание на сообщение - "Microsoft.AnalysisServices.XmlSerializationException: Deserialization failed: Requested value 'EnterpriseCore64' was not found."

Как оказалось, проблема была связано с тем, что в качестве сервера баз данных использовался SQL Server 2012. Решением проблемы является установка Cumulative update package 1 for SQL Server 2012 (ссылка).

Более подробно о причине данной проблемы: http://support.microsoft.com/kb/2683293

суббота, 28 апреля 2012 г.

PowerShell для SharePoint 2010

Help по всем командлетам PowerShell для SharePoint 2010 - ссылка.
Карманный справочник администратора - ссылка.

вторник, 7 февраля 2012 г.

Удаление типа рабочего элемента в проекте TFS

Если вам необходимо удалить какой-то тип рабочего элемента, например, Ошибку (Bug) или требование (Requirement) в проекте, это можно сделать с помощью команды witadmin destroywitd.

Например:
.\witadmin destroywitd /collection:http://tfs:8080/tfs/collection /p:Test /n:"Bug"


Подробнее о команде здесь.

вторник, 31 января 2012 г.

PowerShell. Экспорт/Импорт глобаллиста

###
### Экспорт/Import Globallist'a
###

cls
cd 'C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE'

# Url коллекции TFS
$srv='http://tfserver:8080/tfs/CollectionName'
# Папка, где должен храниться Globallist
$fld='C:\'

write-host '[1] - Выгрузить Globallist'
write-host '[2] - Загрузить Globallist'
$action = read-host "Выберите действие: "

if ($action -eq '1')
{
    write-host " "
    write-host "Экспорт глобаллиста: " -nonewline
    .\witadmin exportgloballist /collection:$srv /f:$fld'globallist.txt'
}
elseif  ($action -eq '2')
{
    write-host " "
    write-host "Импорт глобаллиста: " -nonewline  
    .\witadmin importgloballist /collection:$srv /f:$fld'globallist.txt'
}

пятница, 27 января 2012 г.

PowerShell. Обновление шаблонов рабочих элементов во множестве проектов TFS


Пример скрипта, который обновляет во множестве проектов TFS шаблоны рабочих элементов.


cls
# Путь к команде witadmin
cd 'C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE'

# Рабочие элементы, которые необходимо обновить
$wits=@('Bug','Change Request','Issue','Requirement','Risk','Shared Steps','Task','Test Case')


# Имя сервера
$srv='http://tfs:8080/tfs/infotecstc1'


# Проекты
$projects=@('Project1','Project2','Project3')

# Путь к шаблонам рабочих элементов
$fld='C:\TFS Template\Company Template v1.00\WorkItem Tracking\TypeDefinitions'

# Служебная переменная (общее время выполнения)
$gen_sec=0

foreach ($p in $projects)
{
    $prj_sec=0
    write-host ' '
    write-host '---------- '          
    write-host 'Проект ' -nonewline
    write-host $p -nonewline -foregroundcolor Red
    write-host '... '
    write-host ' '
    foreach ($w in $wits)
    {
        write-host 'Загрузка рабочего элемента ' -nonewline
        write-host $w -nonewline -foregroundcolor Red
        write-host  ': ' -nonewline
     
        $sec=(measure-command {$outtext=.\witadmin importwitd /collection:$srv /p:$p /f:$fld'\'$w'.xml'}).totalseconds
        }          
     
        $sec_f= "{0:N2}" -f $sec
        write-host $outtext  -nonewline
        write-host ' |' $sec_f '| '      
     
        # Время загрузки для всего проекта
        $prj_sec += $sec
    }
    $gen_sec += $prj_sec
    $prj_sec = "{0:N2}" -f $prj_sec
    #$prj_sec = new-timespan -seconds $prj_sec  
    write-host
    write-host  'Время загрузки: ' -nonewline                    
    write-host $prj_sec -nonewline -foregroundcolor Red
    write-host ' сек.'
 
}
    $gen_min = "{0:N2}" -f (new-timespan -seconds $gen_sec).totalminutes
    write-host
    write-host 'Общее время загрузки: ' -nonewline
    write-host $gen_min -nonewline -foregroundcolor Red
    write-host ' мин.'

PowerShell. Просмотр всех доменных групп пользователя


# Пользователи, доменные группы которых необходимо просмотреть
$usrs=@('Ivanov', 'Petrov','Mikhaylov')

foreach ($usr in $usrs)
{
    write-host ' '
    write-host '--[' -nonewline
    write-host $usr  -nonewline -foregroundcolor Red
    write-host ']-------- '        
    write-host 'Доменные группы: '

    # В следующей строке необходимо ввести имя домена: Domain='сюда'
    $query = "ASSOCIATORS OF {Win32_Account.Name='"+$usr+"',Domain='ИмяДомена'} WHERE ResultRole=GroupComponent ResultClass=Win32_Account"
    Get-WMIObject -Query $query | Select Name
    write-host '-------------------- '            
}

PowerShell. Пример отправки почтового сообщения

$emailFrom = "me@domen.ru"
$emailTo = "user@domen.ru"
$subject = "Пример тестового сообщения"
$body = "Тестовое сообщение, отправленное через PowerShell"
$smtpServer = "mailserver.ru"
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$smtp.Send($emailFrom, $emailTo, $subject, $body)