Вопрос или проблема
Мы планируем заменить наши текущие скрипты Kix на скрипты PowerShell и мне было интересно, как проверять членство в группах для подключения сетевых дисков. Наш текущий скрипт Kix в основном выполняет оператор if для каждой пользовательской группы и проверяет, является ли пользователь частью этой группы, если да, то он подключает сетевой диск. Вот пример:
If InGroup("ADGROUP")
Use m: "\\server\share"
EndIf
Я сомневаюсь, что это самый эффективный способ сделать это, но я хотел бы спросить, как можно этого достичь в PowerShell и что люди рекомендуют для правильного способа подключения дисков и принтеров для пользователей в Active Directory.
Если эта информация нужна, все наши клиенты работают на Windows Vista/7, и мы сейчас только переходим на AD 2008.
Я бы использовал предпочтения групповой политики для подключения дисков в AD. См. Использование предпочтений групповой политики для подключения дисков на основе членства в группе для получения подробной информации. Я также рекомендую обучать пользователей, показывая им, как добавить сетевые расположения в их библиотеки.
Я потратил ТРИ дня, пытаясь конвертировать наш существующий файл Kix (который я создал) в PowerShell.
Что я обнаружил: PowerShell все еще не полностью готов к использованию в качестве скрипта для входа в систему. Возможно, в последней версии, но в PowerShell 2.0 сейчас я обнаружил, что используемые команды в основном портированы из VBS.
Команда “If” в Kixtart, я думаю, очень эффективная, потому что я использовал ее на многих клиентских сайтах, и она РАБОТАЕТ. Простой и быстрый, команда легко читается для системного администратора, который никогда не использовал Kix раньше. Я имею в виду, если сравнить ту же команду подключения диска в Kixtart с тем, что нужно написать, чтобы сделать то же самое в PowerShell, кажется излишне сложным.
Я написал об этом в своем блоге: http://thisishelpful.com/kix-login-script-remote-desktop-services-server-terminal-server.html. Я собираюсь обновить его, добавив сравнение моего скрипта Kix с моим модифицированным скриптом PowerShell, и вы увидите, что я имею в виду.
Надеюсь, это поможет.
Со стороны AD, возможно, стоит обратить внимание на командлеты Quest для AD.
# ************ скрипт подключения сетевых дисков ***************
$filter = "(&(objectcategory=user)(Name=$env:username))"
$ds = New-object System.DirectoryServices.DirectorySearcher([ADSI]"",$filter)
$user = ($ds.Findone()).properties.memberof
#********************** Подключение общего диска для направлений
foreach ($grouppath in $user)
{
$group = ([adsi]"LDAP://$($grouppath.tostring())").sAMAccountname
switch ($group)
{
"group1" {net use S: \\fileserver\share1 }
"group2" {net use S: \\fileserver\share2 }
"group3" {net use S: \\fileserver\share3 }
"group4" {net use S: \\fileserver\share4 }
}
}
Для проверки членства в группе в PowerShell:
$wid=[System.Security.Principal.WindowsIdentity]::GetCurrent()
$prp=new-object System.Security.Principal.WindowsPrincipal($wid)
$adm=[System.Security.Principal.WindowsBuiltInRole]::Administrator
$IsAdmin=$prp.IsInRole($adm)
Последние две строки это шаблон для встроенной группы (существует множество таких). Также существует перегрузка IsInRole
, которая принимает строку, например “domain\group”.
Для подключения диска исполнение net use ...
вероятно, наиболее простое (PowerShell легко выполняет консольные исполняемые файлы).
(Много лет спустя, в Windows PowerShell v5.1 и PowerShell (Core) 7) Прямой перевод вашего кода вероятно следующий (не протестирован, так как у меня нет доступа к AD):
# Загрузите нужную сборку; нужно только в WinPS; сборка загружается по умолчанию в PS 7.
Add-Type -AssemblyName System.DirectoryServices.AccountManagement
if ([DirectoryServices.AccountManagement.UserPrincipal]::Current.
GetAuthorizationGroups().Name -contains 'ADGROUP') {
net use m: "\\server\share" # добавьте опции по мере необходимости, например /persistent:yes
}
Ответ или решение
Замена скриптов Kix на PowerShell – это шаг в правильном направлении для модернизации инфрастуктуры, особенно с учетом вашей миграции на Windows Server 2008 и клиентов Windows Vista/7. Рассмотрим, как можно адаптировать текущую логику на Kix с использованием PowerShell.
Задача
Ваша текущая задача – проверить членство пользователя в группах Active Directory (AD) и, в зависимости от членства, сопоставить сетевые диски. В Kix это выполняется с помощью простого оператора if
для каждого пользователя. Пример скрипта на Kix:
If InGroup("ADGROUP")
Use m: "\\server\share"
EndIf
Теперь давайте рассмотрим, как аналогичный функционал реализовать на PowerShell.
Решение с использованием PowerShell
-
Получение информации о пользователе из AD:
В PowerShell вы можете использовать
System.DirectoryServices
для получения информации о пользователях AD и их принадлежности к группам. Вот пример скрипта:# Получаем текущего пользователя $filter = "(&(objectcategory=user)(Name=$env:username))" $ds = New-object System.DirectoryServices.DirectorySearcher([ADSI]"",$filter) $user = ($ds.Findone()).properties.memberof # Проверка групп и маппинг сетевых дисков foreach ($grouppath in $user) { $group = ([adsi]"LDAP://$($grouppath.tostring())").sAMAccountname switch ($group) { "group1" { net use S: "\\fileserver\share1" } "group2" { net use S: "\\fileserver\share2" } "group3" { net use S: "\\fileserver\share3" } "group4" { net use S: "\\fileserver\share4" } } }
-
Альтернативные методы и рекомендованные практики:
Несмотря на возможность выполнения через PowerShell, рекомендуется рассмотреть использование групповых политик (Group Policy Preferences) для маппинга сетевых дисков в зависимости от членства в группах. Это решение является более централизованным и управляемым, и оно снижает потребность в поддержке на каждом рабочем месте.
-
Настройка через групповые политики (GPO):
Вы можете настроить маппинг сетевых дисков через "User Configuration" > "Preferences" > "Windows Settings" > "Drive Maps". Это состояние позволяет управлять настройками драйвов централизованно через AD.
Заключение
PowerShell предоставляет гибкость и мощь для задач автоматизации, но для конкретных сценариев, таких как маппинг сетевых дисков, GPO может оказаться более подходящим решением. С учетом вашей инфраструктуры, предлагаемая комбинация PowerShell для сложной логики автоматизации и GPO для стандартных задач может значительно увеличить управляемость и эффективность вашего IT-процесса.
Поскольку вы рассматриваете переход на новые технологии, также стоит учитывать версии Windows и PowerShell, которые используются в вашей организации. Улучшение функционала с использованием последних версий PowerShell позволит максимально реализовать возможности сценариев автоматизации.
Надеюсь, данное руководство окажется полезным для вашей команды и поможет эффективно перейти с Kix на PowerShell. Если у вас возникнут вопросы или потребуется дополнительная помощь, не стесняйтесь обращаться.