PowerShell и VPN доступ

Довольно часто нужно получить список тех пользователей Active Directory, кому разрешён VPN доступ в корпоративной сети. Плюс посмотреть статические IP адреса и маршруты.
С помощью PowerShell сделать это очень просто.


 

Итак, опишем задачу.
Нам нужно узнать кому из пользователей AD, разрешён VPN через настроенный в сети RAS.
А потом, при желании, отключить юзера, не закрывая консоль PowerShell.

Подключаемся к удалённой PS-сессии:

Enter-PSSession

Либо запускаем скрипт на контроллере домена.

Для начала, с помощью командлета Get-ADUser получаем список всех пользователей, кому доступ разрешён.
Так же выведем статические IP и маршруты, которые получает пользователь при подключении VPN.

Но тут не всё так просто.
IP адрес записан в свойстве msRASSavedFramedIPAddress в десятичной форме и большинству людей этот набор цифр ничего не говорит. Например, если вы тупо выведете это свойство - то получите -1062729202 для айпишника 192.168.10.14. Поэтому адреса будем преобразовывать в понятную форму.
Итак, выводим на экран список пользователей и их количество.

Windows PowerShell ISE
  1. # Забираем необходимые нам параметры из AD: пользователи с доступом, их IP, маршруты
  2. $vpn = Get-ADUser -filter * -Properties msNPAllowDialin, msRASSavedFramedIPAddress, msRASSavedFramedRoute `
  3. | where {$_.msNPAllowDialin -eq "true" } `
  4. | select name, msRASSavedFramedIPAddress, msRASSavedFramedRoute, msNPAllowDialin `
  5. | Sort-Object name 
  6.  
  7. # Создаём объект куда будем слаживать всю инфу
  8. $VPNenable = New-Object System.Collections.ArrayList
  9.  
  10. foreach ($ipbin in $vpn)
  11. {
  12. # Конвертируем IP из десятично-двоичной системы представления в нормальный читаемый IP
  13. $bin = [Convert]::ToString($ipbin.msRASSavedFramedIPAddress,2)
  14. $fullBin = "0" * (32 - $bin.Length) + $bin
  15. $ip = [string]::Join(".", $(0,8,16,24 | %{[Convert]::ToInt32($fullBin.Substring($_,8),2)}))
  16.  
  17. # Заполняем хэш-таблицу данными
  18. $VPNenableHash = @{Ip=$ip
  19. Name=$ipbin.name
  20. Route=$ipbin.msRASSavedFramedRoute
  21. }
  22. $VPNobj = New-Object –TypeName PSObject –Property $VPNenableHash
  23. $VPNenable.Add($VPNobj)
  24. }
  25. # Выводим на экран
  26. $VPNenable |Sort-Object ip| ft -AutoSize
  27. Write-Host "----------- Итого:" ($vpn).count -ForegroundColor Green
  1. IP Name Route
  2. -- ---- ---------------
  3. 192.168.33.55  Иван Иванович  {192.168.14.0/24 0.0.0.0 1, 192.168.28.0/24 0.0.0.0 1}
  4. 192.168.20.23  Пётр Петрович  {192.168.16.0/24 0.0.0.0 1}
  5. 172.16.46.244  А Геннадьевич  {172.16.3.0/24 0.0.0.0 1, 192.168.28.0/24 0.0.0.0 1}
  6. ----------- Итого: 3

Предлагаем сразу же указать имя пользователя, которому хотим отключить доступ. Имя можно указывать по маске. Например, не нужно, что бы найти Иванова Иван Иваныча, непременно вводить его имя с точностью до буквы - сойдёт и "ванов".
Я специально делал фильтр по имени, мне так удобнее, но любой может изменить поиск хоть по логину, хоть по мылу, хоть почему угодно.
Но есть ньюанс, если скрипт найдёт больше одного пользователя - отключить им всем разом доступ не получиться. Поэтому пользуйтесь фильтром для поиска так, что бы юзер находился только один.

Windows PowerShell ISE
  1. $vpnuser = Read-Host "Введите пользователя, которому нужно запретить доступ, например Иванов"
  2.  
  3. #Выводим на экран кого нашло:
  4. Write-Host "Вы выбрали этого пользователя: " -ForegroundColor Red
  5. $vpn | where {$_.name -like "*$vpnuser*" } | ft name
  1. Введите пользователя, которому нужно запретить доступ, например Иванов: ген
  2. Вы выбрали этого пользователя:
  3.  
  4. name
  5. ----
  6. А Геннадьевич

Предлагаем, путём выбора 1 или 0 - отключить ему доступ:

Windows PowerShell ISE
  1. $answer = Read-Host "Отключить доступ? 1 или 0"
  2. #Если выбрали единицу - значение пользовательского параметра msNPAllowDialin меняем на "False".
  3. if ($answer -eq 1)
  4. {
  5. $vpnDisable = Get-ADUser -filter "name -like '*$vpnuser*'" -Properties name, msNPAllowDialin | where {$_.msNPAllowDialin -eq "true" }
  6. $vpnDisable.msNPAllowDialin = 'false'
  7. Set-ADUser -Instance $vpnDisable
  8. }
  9. #Иначе - выводим сообщение об отмене:
  10. else {
  11. Write-Host "Вы отменили отключение пользователя " -ForegroundColor Red
  12. }
  13. #Выводим итоговую таблицу разрешённых клиентов:
  14. $vpn = Get-ADUser -filter * -Properties msNPAllowDialin| where {$_.msNPAllowDialin -eq "true" } | select name, msNPAllowDialin | Sort-Object name
  15. $vpn
  16. Write-Host "----------- Итого:" ($vpn).count -ForegroundColor Green
  1. PS C:\>

Весь скрипт целиком

Windows PowerShell ISE
  1. #######################################################################################################
  2. #
  3. # Список пользователей АД с включённым доступом по VPN
  4. # показывает:
  5. # статический IP (переводит из десятично-двоичной системы представления в нармальный читаемый IP)
  6. # и маршруты
  7. # При желании доступ можно отключить, не выходя из консоли PowerShell
  8. #
  9. ########################################################################################################
  10.  
  11. # Смотрим кому разрешён доступ
  12. # Забираем необходимые нам параметры из AD: пользователи с доступом, их IP, маршруты
  13. $vpn = Get-ADUser -filter * -Properties msNPAllowDialin, msRASSavedFramedIPAddress, msRASSavedFramedRoute `
  14. | where {$_.msNPAllowDialin -eq "true" } `
  15. | select name, msRASSavedFramedIPAddress, msRASSavedFramedRoute, msNPAllowDialin `
  16. | Sort-Object name 
  17.  
  18. # Создаём объект куда будем слаживать всю инфу
  19. $VPNenable = New-Object System.Collections.ArrayList
  20.  
  21. foreach ($ipbin in $vpn)
  22. {
  23. # Конвертируем IP из десятично-двоичной системы представления в нормальный читаемый IP
  24. $bin = [Convert]::ToString($ipbin.msRASSavedFramedIPAddress,2)
  25. $fullBin = "0" * (32 - $bin.Length) + $bin
  26. $ip = [string]::Join(".", $(0,8,16,24 | %{[Convert]::ToInt32($fullBin.Substring($_,8),2)}))
  27.  
  28. # Заполняем хэш-таблицу данными
  29. $VPNenableHash = @{Ip=$ip
  30. Name=$ipbin.name
  31. Route=$ipbin.msRASSavedFramedRoute
  32. }
  33. $VPNobj = New-Object –TypeName PSObject –Property $VPNenableHash
  34. $VPNenable.Add($VPNobj)
  35. }
  36. # Выводим на экран
  37. $VPNenable |Sort-Object ip| ft -AutoSize
  38. Write-Host "----------- Итого:" ($vpn).count -ForegroundColor Green
  39.  
  40. # Просим ввести имя пользователя (можно по маске), которому хотим отключить доступ
  41. $vpnuser = Read-Host "Введите пользователя, которому нужно запретить доступ, например Иванов"
  42. # Смотрим кого нашло
  43. Write-Host "Вы выбрали этого пользователя: " -ForegroundColor Red
  44. $vpn | where {$_.name -like "*$vpnuser*" } | ft name
  45.  
  46.  
  47. # Спрашиваем разрешение отключить доступ
  48. # 1 - отключаем
  49. # 0 - оставляем без изменений
  50. $answer = Read-Host "Отключить доступ? 1 или 0"
  51. if ($answer -eq 1)
  52. {
  53.  
  54. # Если решили отключить - получаем нашего юзера
  55. $vpnDisable = Get-ADUser -filter "name -like '*$vpnuser*'" -Properties name, msNPAllowDialin | where {$_.msNPAllowDialin -eq "true" } 
  56. # Меняем значение параметра msNPAllowDialin на False
  57. $vpnDisable.msNPAllowDialin = 'false'
  58. # Применяем изменения
  59. Set-ADUser -Instance $vpnDisable
  60. }
  61. # Если ввели ноль - выводим сообщение, что параметры пользователя не менялись
  62. else {
  63.  
  64. Write-Host "Вы отменили отключение пользователя " -ForegroundColor Red
  65. }
  66. # Снова выводим список разрешённых клиентов
  67. $vpn = Get-ADUser -filter * -Properties msNPAllowDialin| where {$_.msNPAllowDialin -eq "true" } | select name, msNPAllowDialin | Sort-Object name
  68. $vpn
  69. Write-Host "----------- Итого:" ($vpn).count -ForegroundColor Green
  1. PS C:\>

 


Перевод проекту

Сумма в российских рублях
  • Перевод осуществляется, через сервис электронных платежей Яндекс.Деньги
  • Сумма в российских рублях
  • В случае перевода с банковской карты — конвертация валюты производиться по курсу вашего банка
  • Комиссия 0%


Популярные заметки

Узнаём версию PowerShell, пингуем сеть

Powershell - Как узнать версию

Excel. Предупреждение о циклической ссылке

Excel. Предупреждение о циклической ссылке

Команды оснасток mmc, программ и настроек Windows

Запуск команд Windows

 

Комментарии


  • Оставьте первый комментарий — будьте первым

 

Добавить комментарий

Ваш e-mail не будет опубликован.