С помощью PowerShell сделать это очень просто.
Итак, опишем задачу.
Нам нужно узнать кому из пользователей AD, разрешён VPN через настроенный в сети RAS.
А потом, при желании, отключить юзера, не закрывая консоль PowerShell.
Подключаемся к удалённой PS-сессии:
Либо запускаем скрипт на контроллере домена.
Для начала, с помощью командлета Get-ADUser получаем список всех пользователей, кому доступ разрешён.
Так же выведем статические IP и маршруты, которые получает пользователь при подключении VPN.
Но тут не всё так просто.
IP адрес записан в свойстве msRASSavedFramedIPAddress в десятичной форме и большинству людей этот набор цифр ничего не говорит. Например, если вы тупо выведете это свойство - то получите -1062729202 для айпишника 192.168.10.14. Поэтому адреса будем преобразовывать в понятную форму.
Итак, выводим на экран список пользователей и их количество.
- # Забираем необходимые нам параметры из AD: пользователи с доступом, их IP, маршруты
- $vpn = Get-ADUser -filter * -Properties msNPAllowDialin, msRASSavedFramedIPAddress, msRASSavedFramedRoute `
- | where {$_.msNPAllowDialin -eq "true" } `
- | select name, msRASSavedFramedIPAddress, msRASSavedFramedRoute, msNPAllowDialin `
- | Sort-Object name
- # Создаём объект куда будем слаживать всю инфу
- $VPNenable = New-Object System.Collections.ArrayList
- foreach ($ipbin in $vpn)
- {
- # Конвертируем IP из десятично-двоичной системы представления в нормальный читаемый IP
- $bin = [Convert]::ToString($ipbin.msRASSavedFramedIPAddress,2)
- $fullBin = "0" * (32 - $bin.Length) + $bin
- $ip = [string]::Join(".", $(0,8,16,24 | %{[Convert]::ToInt32($fullBin.Substring($_,8),2)}))
- # Заполняем хэш-таблицу данными
- $VPNenableHash = @{Ip=$ip
- Name=$ipbin.name
- Route=$ipbin.msRASSavedFramedRoute
- }
- $VPNobj = New-Object –TypeName PSObject –Property $VPNenableHash
- $VPNenable.Add($VPNobj)
- }
- # Выводим на экран
- $VPNenable |Sort-Object ip| ft -AutoSize
- Write-Host "----------- Итого:" ($vpn).count -ForegroundColor Green
- IP Name Route
- -- ---- ---------------
- 192.168.33.55 Иван Иванович {192.168.14.0/24 0.0.0.0 1, 192.168.28.0/24 0.0.0.0 1}
- 192.168.20.23 Пётр Петрович {192.168.16.0/24 0.0.0.0 1}
- 172.16.46.244 А Геннадьевич {172.16.3.0/24 0.0.0.0 1, 192.168.28.0/24 0.0.0.0 1}
- ----------- Итого: 3
Предлагаем сразу же указать имя пользователя, которому хотим отключить доступ. Имя можно указывать по маске. Например, не нужно, что бы найти Иванова Иван Иваныча, непременно вводить его имя с точностью до буквы - сойдёт и "ванов".
Я специально делал фильтр по имени, мне так удобнее, но любой может изменить поиск хоть по логину, хоть по мылу, хоть почему угодно.
Но есть ньюанс, если скрипт найдёт больше одного пользователя - отключить им всем разом доступ не получиться. Поэтому пользуйтесь фильтром для поиска так, что бы юзер находился только один.
- $vpnuser = Read-Host "Введите пользователя, которому нужно запретить доступ, например Иванов"
- #Выводим на экран кого нашло:
- Write-Host "Вы выбрали этого пользователя: " -ForegroundColor Red
- $vpn | where {$_.name -like "*$vpnuser*" } | ft name
- Введите пользователя, которому нужно запретить доступ, например Иванов: ген
- Вы выбрали этого пользователя:
- name
- ----
- А Геннадьевич
Предлагаем, путём выбора 1 или 0 - отключить ему доступ:
- $answer = Read-Host "Отключить доступ? 1 или 0"
- #Если выбрали единицу - значение пользовательского параметра msNPAllowDialin меняем на "False".
- if ($answer -eq 1)
- {
- $vpnDisable = Get-ADUser -filter "name -like '*$vpnuser*'" -Properties name, msNPAllowDialin | where {$_.msNPAllowDialin -eq "true" }
- $vpnDisable.msNPAllowDialin = 'false'
- Set-ADUser -Instance $vpnDisable
- }
- #Иначе - выводим сообщение об отмене:
- else {
- Write-Host "Вы отменили отключение пользователя " -ForegroundColor Red
- }
- #Выводим итоговую таблицу разрешённых клиентов:
- $vpn = Get-ADUser -filter * -Properties msNPAllowDialin| where {$_.msNPAllowDialin -eq "true" } | select name, msNPAllowDialin | Sort-Object name
- $vpn
- Write-Host "----------- Итого:" ($vpn).count -ForegroundColor Green
- PS C:\>
Весь скрипт целиком
- #######################################################################################################
- #
- # Список пользователей АД с включённым доступом по VPN
- # показывает:
- # статический IP (переводит из десятично-двоичной системы представления в нармальный читаемый IP)
- # и маршруты
- # При желании доступ можно отключить, не выходя из консоли PowerShell
- #
- ########################################################################################################
- # Смотрим кому разрешён доступ
- # Забираем необходимые нам параметры из AD: пользователи с доступом, их IP, маршруты
- $vpn = Get-ADUser -filter * -Properties msNPAllowDialin, msRASSavedFramedIPAddress, msRASSavedFramedRoute `
- | where {$_.msNPAllowDialin -eq "true" } `
- | select name, msRASSavedFramedIPAddress, msRASSavedFramedRoute, msNPAllowDialin `
- | Sort-Object name
- # Создаём объект куда будем слаживать всю инфу
- $VPNenable = New-Object System.Collections.ArrayList
- foreach ($ipbin in $vpn)
- {
- # Конвертируем IP из десятично-двоичной системы представления в нормальный читаемый IP
- $bin = [Convert]::ToString($ipbin.msRASSavedFramedIPAddress,2)
- $fullBin = "0" * (32 - $bin.Length) + $bin
- $ip = [string]::Join(".", $(0,8,16,24 | %{[Convert]::ToInt32($fullBin.Substring($_,8),2)}))
- # Заполняем хэш-таблицу данными
- $VPNenableHash = @{Ip=$ip
- Name=$ipbin.name
- Route=$ipbin.msRASSavedFramedRoute
- }
- $VPNobj = New-Object –TypeName PSObject –Property $VPNenableHash
- $VPNenable.Add($VPNobj)
- }
- # Выводим на экран
- $VPNenable |Sort-Object ip| ft -AutoSize
- Write-Host "----------- Итого:" ($vpn).count -ForegroundColor Green
- # Просим ввести имя пользователя (можно по маске), которому хотим отключить доступ
- $vpnuser = Read-Host "Введите пользователя, которому нужно запретить доступ, например Иванов"
- # Смотрим кого нашло
- Write-Host "Вы выбрали этого пользователя: " -ForegroundColor Red
- $vpn | where {$_.name -like "*$vpnuser*" } | ft name
- # Спрашиваем разрешение отключить доступ
- # 1 - отключаем
- # 0 - оставляем без изменений
- $answer = Read-Host "Отключить доступ? 1 или 0"
- if ($answer -eq 1)
- {
- # Если решили отключить - получаем нашего юзера
- $vpnDisable = Get-ADUser -filter "name -like '*$vpnuser*'" -Properties name, msNPAllowDialin | where {$_.msNPAllowDialin -eq "true" }
- # Меняем значение параметра msNPAllowDialin на False
- $vpnDisable.msNPAllowDialin = 'false'
- # Применяем изменения
- Set-ADUser -Instance $vpnDisable
- }
- # Если ввели ноль - выводим сообщение, что параметры пользователя не менялись
- else {
- Write-Host "Вы отменили отключение пользователя " -ForegroundColor Red
- }
- # Снова выводим список разрешённых клиентов
- $vpn = Get-ADUser -filter * -Properties msNPAllowDialin| where {$_.msNPAllowDialin -eq "true" } | select name, msNPAllowDialin | Sort-Object name
- $vpn
- Write-Host "----------- Итого:" ($vpn).count -ForegroundColor Green
- PS C:\>