Задать вопрос
@Desert-Eagle
Новичок во всем

Как можно активировать модуль ActiveDirectory через GPO или скриптом?

Есть скрипт, который вешается на логон пользователя, скрипт отрабатывается частично. В логах вижу ошибку на строчке Import-module ActiveDirectory, о том что модуль ActiveDirectory не найден.
Если на ПК где выполняется скрипт под правами админа запустить PS и выполнить:
Add-WindowsCapability –online –Name “Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0”

После чего снова запустить скрипт, то все выполнится корректно.

Пробовал сделать как тут описано, но не работает. Т.е. я скопировал файлы из папки Modules в папку, которую разместил в netlogon, чтобы папка была по умолчанию в доступе у всех и не копировать всю папку на каждый комп в домене каждый раз. Добавил туда же два файла, которые и импортируются в итоге, в скрипте в самом начале добавил две строки:
Import-Module "\\domain.local\NETLOGON\ActiveDirectory\Microsoft.ActiveDirectory.Management.dll"
Import-Module "\\domain.local\NETLOGON\ActiveDirectory\Microsoft.ActiveDirectory.Management.resources.dll"

Ошибка та же самая, что и без установленного модуля.

Может можно Add-WindowsCapability как-то выпонить через GPO на всех тачках, потому что их много?

Сам скрипт PS

$User = $env:UserName
$FileName = "Sign"
$FileExtension = "htm","rtf","txt"
$PathOriginal = "\\domain.local\NETLOGON"
$Path = "C:\Users\Public\Downloads"
$PathSignature = "$PathOriginal\OutlookSignature"
$PathSignatureTemplates = "$PathOriginal\OutlookSignature\Templates"

$PathSignatureUser = "$Path\OutlookSignature\$User"
$AppSignatures =$env:APPDATA + "\Microsoft\Signatures"

Import-Module "\\domain.local\NETLOGON\ActiveDirectory\Microsoft.ActiveDirectory.Management.dll"
Import-Module "\\domain.local\NETLOGON\ActiveDirectory\Microsoft.ActiveDirectory.Management.resources.dll"
$AD_user = Get-ADUser $User -Properties Title,Company,homePhone,telephoneNumber,sn,givenName

New-Item -Path "$Path\OutlookSignature\$User" -ItemType Container –Force
foreach ($Ext in $FileExtension)
{
Copy-Item -Force "$PathSignatureTemplates\$FileName.$Ext" "$PathSignatureUser\$FileName.$Ext"
}

foreach ($Ext in $FileExtension)
{
(Get-Content "$PathSignatureUser\$FileName.$Ext") | Foreach-Object {
$_ -replace "@sn", $AD_user.sn `
-replace "@givenName", $AD_user.givenName `
-replace "@Title", $AD_user.Title `
-replace "@Company", $AD_user.Company `
-replace "@homePhone", $AD_user.homePhone `
-replace "@ipPhone", $AD_user.telephoneNumber
} | Set-Content "$PathSignatureUser\$FileName.$Ext"
}

foreach ($Ext in $FileExtension)
{
Copy-Item -Force "$PathSignatureUser\$FileName.$Ext" "$AppSignatures\$User.$Ext"
write-host "$PathSignatureUser\$FileName.$Ext"
write-host "$AppSignatures\$User.$Ext"
}

#Office 2016 and Over
If (Test-Path HKCU:'\Software\Microsoft\Office\16.0') {
Remove-ItemProperty -Path HKCU:\Software\Microsoft\Office\16.0\Outlook\Setup -Name First-Run -Force -ErrorAction SilentlyContinue -Verbose
New-ItemProperty HKCU:'\Software\Microsoft\Office\16.0\Common\MailSettings' -Name 'ReplySignature' -Value $User -PropertyType 'String' -Force
New-ItemProperty HKCU:'\Software\Microsoft\Office\16.0\Common\MailSettings' -Name 'NewSignature' -Value $User -PropertyType 'String' -Force
}



UPD №1: Скорректировал скрипт и убрал строку Import-module ActiveDirectory т.к. я же загружаю его через dll. Ошибка недоступности модуля ушла, но в скрипт добавляет в подпись только givenName почему то, а все остальное пустое.

UPD №2: Если я просто зайду на ПК под юзером, открою powershell и выполню 1 команду из скрипта
Import-Module "\\domain.local\NETLOGON\ActiveDirectory\Microsoft.ActiveDirectory.Management.dll"

То все подгружается корректно и я могу использовать тот же Get-ADUser, а значит эти две строчки работают.

Почему тогда при выполнении скрипта в подписи вставляется только givenName? Как будто -replace не отрабатывает замену всех атрибутов или Get-ADUser не может считать остальные данные которые указаны.
Что еще можно протестировать, почему передаются не все данные?

UPD №3: Выполнение в одну строчку команды Get-ADUser так же отрабатывает без ошибок, но почему то выдает меньше информации, возможно поэтому ничего кроме givenName через нее и не получается собрать?
Результат вывода
67d28c92aca36431617956.png


UPD №4: Проблема по сути в этом и есть. Та же самая строка на ПК с установенной оснасткой выдает то что указано в -Properties, без оснастки не выдает. Как исправить пока не понятно.
  • Вопрос задан
  • 188 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@MaxKozlov Куратор тега PowerShell
То, что пытается делать скрипт, точнее для чего конкретно используется модуль, надо делать на админской машине
spoiler

$_ -replace "@sn", $AD_user.sn `
-replace "@givenName", $AD_user.givenName `
-replace "@Title", $AD_user.Title `
-replace "@Company", $AD_user.Company `
-replace "@homePhone", $AD_user.homePhone `
-replace "@ipPhone", $AD_user.telephoneNumber
} | Set-Content "$PathSignatureUser\$FileName.$Ext"


и потом юзеру просто качать из шары

А сам модуль для этого не предназначен

Впрочем, если очень хочется, вы можете получить все те же свойства через [ADSI]

Но я б не стал. это всё медленно, скрипт не чекает, что всё уже создано, то есть юзеру ждать каждый раз

update: Пример через ADSI, если таки надо:
$NTAccount = [System.Security.Principal.NTAccount]::new($env:username)
$sid = $NTAccount.Translate([System.Security.Principal.SecurityIdentifier]).Value
$User = [adsi]"LDAP://<SID=$sid>"
$User.DisplayName
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
SignFinder
@SignFinder
Wintel\Unix Engineer\DevOps
Модуль ActiveDirectory для Powershell - это модуль управления AD с помощью Powershell.
Если все-таки странным образом он используется в скриптах GPO, хотя это и выглядит очень и очень странно - нужно обеспечить его установку и возможность запуска на всех машинах, к которым применяется GPO.
Ответ написан
Комментировать
@NortheR73
системный инженер
как-то так без загрузки модулей:
$AD_user = Invoke-Command -ComputerName $DC -ScriptBlock {Get-ADUser $Using:User -Properties * | Select-Object DisplayName,Title,Company,StreetAddress,PostalCode,L,Mobile,Mail,wwwHomePage} -ErrorAction Stop
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы