Замените скрипт Kix на Powershell.

Вопрос или проблема

Мы планируем заменить наши текущие скрипты 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

  1. Получение информации о пользователе из 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" }
       }
    }
  2. Альтернативные методы и рекомендованные практики:

    Несмотря на возможность выполнения через PowerShell, рекомендуется рассмотреть использование групповых политик (Group Policy Preferences) для маппинга сетевых дисков в зависимости от членства в группах. Это решение является более централизованным и управляемым, и оно снижает потребность в поддержке на каждом рабочем месте.

  3. Настройка через групповые политики (GPO):

    Вы можете настроить маппинг сетевых дисков через "User Configuration" > "Preferences" > "Windows Settings" > "Drive Maps". Это состояние позволяет управлять настройками драйвов централизованно через AD.

Заключение

PowerShell предоставляет гибкость и мощь для задач автоматизации, но для конкретных сценариев, таких как маппинг сетевых дисков, GPO может оказаться более подходящим решением. С учетом вашей инфраструктуры, предлагаемая комбинация PowerShell для сложной логики автоматизации и GPO для стандартных задач может значительно увеличить управляемость и эффективность вашего IT-процесса.

Поскольку вы рассматриваете переход на новые технологии, также стоит учитывать версии Windows и PowerShell, которые используются в вашей организации. Улучшение функционала с использованием последних версий PowerShell позволит максимально реализовать возможности сценариев автоматизации.

Надеюсь, данное руководство окажется полезным для вашей команды и поможет эффективно перейти с Kix на PowerShell. Если у вас возникнут вопросы или потребуется дополнительная помощь, не стесняйтесь обращаться.

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

Капча загружается...