Windows – автоматичне додавання маршрутів при встановленні VPN з’єдняння

Нажаль не усі VPN сервери дозволяють сконфігуровати маршрути для клієнтів.  У такому разі кожного разу клієнт має додати маршрути до необхідних мереж після встановлення з’єдняння. Windows дозволяє автоматизувати цей процес. Щоб зробити це необхідно запустити powershell з дозволами адміністратора. Та виконати таку команду:

Після цього маршрут 10.78.0.00/16 буде доданий автоматично після встановлення з’єднання з іменем vpn-name

Powershell scripts

Читаем файл, ищем в нем строку, из строки извлекаем 2 числа, затем проверям чтоб одно число было в заданном диапазоне. Все нужные строки пишем в файл.

 

 

Поиск элементов менеджмент-пака

Понадобилось мне на одном из серверов отключить Discovery, потому что компьютер был не доменный, а для дискавери необходим был доменный аккаунт. Да и не было на конкретном сервере никаких файловых сервисов. В эвенте был идентификатор discovery, а вот в Operation Console было его нормальное имя. Поиск нормального имени был осуществлен при помощи вот такой строки на powershell:
get-managementpack | foreach-object{$_.GetDiscoveries()} | where {$_.Name -eq "Microsoft.Windows.FileServer.DFSR.2008R2.DFSRServerDiscovery2008R2"} | select DisplayName
Условивие можно задать в виде $_.Name.Contains(“DFS”) -eq $true

Поиск даты последнего входа пользоваеля или компьютера в домен

Для очистки Active Directory от старых пользователей и компьютеров их сначала необходимо найти. найти их просто, дата последнего логина содержится в поле LastLogon. Проблема только в том, что это поле не реплицируется между домен-контролерами и для поиска актуальной даты последнего логина необходимо опросить все домен-контролеры, а затем выбрать самую последнюю дату. Для автоматизации данного процесса, сделан небольшой скрипт на Powershell с использованием GUI, что дает возможность его использовать даже хелпдеску.
Вид окна программы:

Для запуска скрипна необходимо установить расширение для ActiveRoles Management Shell for Active Directory от компании Quest Software. В поле ObjectName вводим имя компьютера или samaccountname пользователя, указываем тип объекта и нажимаем Find и получаем дату последнего входа.

Скрипт брать тут.

Синхронизация групп в Active Directory

Иногда неоходимо синхронизировать 2 группы в Active Directiory таким обраом, чтоб изменения состава пользователей одной группы, автоматически изменяло состав пользователей другой группы. Зачем это уже отдельный вопрос и тут не рассматривается. Для этого поможет небольшой скрипт. Для запуска скрипна необходимо установить расширение для ActiveRoles Management Shell for Active Directory от компании Quest Software. А затем воспользоваться таким небольшим скриптом:

Add-PSSnapin Quest.ActiveRoles.ADManagement
$in = (get-qadgroup ‘tstgroupin’).dn
$out = (get-qadgroup ‘tstgroupout’).dn
$ingroupmembers = get-qadgroupmember $in
$outgroupmembers = get-qadgroupmember $out
$rez = compare-object $ingroupmembers $outgroupmembers
foreach($item in $rez){
if ($item.SideIndicator -eq “<=”){
$usrdn = (get-qaduser $item.InputObject).dn
if ($userdn -ne $null){add-qadgroupmember $out -Member $usrdn}
}
if ($item.SideIndicator -eq “=>”){
$usrdn = (get-qaduser $item.InputObject).dn
if ($userdn -ne $null){remove-qadgroupmember $out -Member $usrdn}
} �
}

Скрипт изменяет состав пользователей группы tstgroupout в соответствии с составом пользователей группы tstgroupin. Можно конечно удалить всех и добавить нужных, но это повлечет за собой изменение (хоть и кратковременное) членства в группах пользователей, у которых ничего не изменялось. Кроме того метод “удалить всех и добавить нужных” создаст в журнале безопасности множество лишней информации по изменению членства в группах, которая будет являться недостоверной.

Существует возможность сделать тоже самое что называется из коробки, без использования компонентов от Quest Software. В этом случае скрипт выглядит так:

function get-groupdn ($SAMName)
{
$root = [ADSI]”
$searcher = new-object System.DirectoryServices.DirectorySearcher($root)
$searcher.filter = “(&(objectClass=group)(sAMAccountName= $SAMName))”
$user = $searcher.findall(
if ($user.count -gt 1)
{
$count = 0
foreach($i in $user)
{
write-host $count “: ” $i.path
$count = $count + 1
}
$selection = Read-Host “Please select item: ”
return $user[$selection].path
}
else
{
return $user[0].path
}
}

function get-userdn ($SAMName)
{
$root = [ADSI]”
$searcher = new-object System.DirectoryServices.DirectorySearcher($root)
$searcher.filter = “(&(objectClass=user)(sAMAccountName= $SAMName))”
$user = $searcher.findall(
if ($user.count -gt 1)
{
$count = 0
foreach($i in $user)
{
write-host $count “: ” $i.path
$count = $count + 1
}
$selection = Read-Host “Please select item: ”
return $user[$selection].path
}
else
{
return $user[0].path
}
}

$ingroup = get-groupdn ‘tstgroupin’
$outgroup = get-groupdn ‘tstgroupout’
if ($ingroup -ne $null){
$GroupLDAPin = [adsi]$ingroup
}
if ($outgroup -ne $null){
$GroupLDAPout = [adsi]$outgroup
}
if (($GroupLDAPout -ne $null) -and ($GroupLDAPin -ne $null)){
$rez = compare-object $GroupLDAPin.member $GroupLDAPout.member
foreach($item in $rez){
if ($item.SideIndicator -eq “<=”){
write-host “LDAP://” + [string]$item.InputObject
$GroupLDAPout.Add(“LDAP://”+$item.InputObject)
}
if ($item.SideIndicator -eq “=>”){
write-host “LDAP://” + [string]$item.InputObject
$GroupLDAPout.Remove(“LDAP://”+$item.InputObject)
}
}
}