Вопрос или проблема
Мне нужно настроить Shell Launcher для некоторых ПК. В данный момент я тестирую конфигурацию на одном компьютере. Я следовал официальной документации Microsoft, создал файл .xml и теперь мне нужно применить настройки к ПК. Мне нужно использовать Powershell и применить их на одном компьютере для тестирования в данный момент.
Официальный скрипт из документации выглядит так:
$shellLauncherConfiguration = @"
# содержимое файла XML конфигурации
"@
$namespaceName="root\cimv2\mdm\dmmap"
$className="MDM_AssignedAccess"
$obj = Get-CimInstance -Namespace $namespaceName -ClassName $className
$obj.Configuration = [System.Net.WebUtility]::HtmlEncode($shellLauncherConfiguration)
$obj = Set-CimInstance -CimInstance $obj -ErrorVariable cimSetError -ErrorAction SilentlyContinue
if($cimSetError) {
Write-Output "Произошла ОШИБКА. Отображение записи об ошибке и попытка извлечь журналы ошибок...`n"
Write-Error -ErrorRecord $cimSetError[0]
$timeout = New-TimeSpan -Seconds 30
$stopwatch = [System.Diagnostics.Stopwatch]::StartNew()
do{
$events = Get-WinEvent -FilterHashtable $eventLogFilterHashTable -ErrorAction Ignore
} until ($events.Count -or $stopwatch.Elapsed -gt $timeout) # ждем, пока журнал станет доступен
if($events.Count) {
$events | ForEach-Object {
Write-Output "$($_.TimeCreated) [$($_.LevelDisplayName.ToUpper())] $($_.Message -replace "`n|`r")"
}
} else {
Write-Warning "Время ожидания истекло при попытке извлечь журналы событий..."
}
Exit 1
}
Write-Output "Конфигурация Shell Launcher успешно применена"
Как видите, это уже сломано, так как $eventLogFilterHashTable даже не определен нигде. Я исключил этот аргумент FilterHashtable, и скрипт выполняется, но завершает работу с ошибкой, не дающей полезной информации.
C:\Users\admin\Downloads\ApplyShellLauncher.ps1 : Произошла ошибка общего характера, которая не охвачена более конкретным кодом ошибки.
At line:1 char:1
+ .\ApplyShellLauncher.ps1
+ ~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (MDM_AssignedAcc..../Vendor/MSFT"):CimInstance) [Write-Error], CimException
+ FullyQualifiedErrorId : MI RESULT 1,ApplyShellLauncher.ps1
Я застрял здесь и не знаю, что делать. Я протестировал первый пример скрипта здесь, чтобы проверить, работает ли WMI Bridge Provider, и этот скрипт работает.
Дополнительная информация:
- Да, я запускаю Powershell от имени SYSTEM с помощью psexec.exe -i -s powershell.exe
- Чтобы быть уверенным, я также использую локальную учетную запись администратора, поскольку обычно наши учетные записи поступают из LDAP
- Да, файл .xml действителен
Ответ или решение
Применение конфигурации Shell Launcher с помощью официального PowerShell-скрипта может столкнуться с рядом проблем, которые требуют детального анализа. В вашем описании упоминается о проблеме с неопределенной переменной $eventLogFilterHashTable
, а также о возникновении общего сбоя, который не охватывается более конкретным кодом ошибки. Давайте рассмотрим возможные источники проблемы и подходы к их решению.
1. Проблема с неопределенной переменной
Вы правы, что скрипт включает переменную $eventLogFilterHashTable
, которая не определена. Это вызывает сбой в логике скрипта, поскольку при попытке обращения к этой переменной PowerShell не может найти ее, что приводит к недоступности необходимых данных для фильтрации событий. В данном случае, вы можете временно удалить этот блок, но важно предусмотреть возможность ведения журнала для диагностики.
2. Структура XML-контента
Проблемы могут возникать также из-за содержания XML-файла. Убедитесь, что ваша XML-конфигурация соответствует всем требованиям Microsoft. Например, проверьте правильность структуры, наличие всех обязательных элементов и атрибутов. Чтобы дополнительно проверить XML, используйте инструменты валидации, такие как xmllint
или онлайн-валидаторы.
3. Запуск PowerShell
Убедитесь, что вы запускаете PowerShell с правильными привилегиями. Вы упомянули использование psexec.exe
для запуска PowerShell как SYSTEM. Это хороший подход, однако, также убедитесь, что ваша учетная запись имеет локальные права администратора, так как это может негативно сказаться на возможности установки настроек MDM.
4. Логи и обработка ошибок
Чтобы лучше понять причину сбоя, рекомендую добавить элементарную логику для ведения собственных логов, обходя отсутствие фильтра для событий. Например, замените строку с $events = Get-WinEvent...
на свой собственный обработчик:
try {
$obj = Set-CimInstance -CimInstance $obj -ErrorVariable cimSetError -ErrorAction Stop
} catch {
Write-Output "Ошибка при установке MDM_AssignedAccess: $_"
# Запись общей информации о событии
$ErrorMessage = "Ошибка: $_"
Add-Content -Path "C:\path\to\log.txt" -Value $ErrorMessage
Exit 1
}
Такой подход поможет вам захватывать и сохранять ошибки, что значительно упростит дальнейшее чтение и анализ логов.
5. Проверка доступности WMI
Вы упомянули, что тестировались другой сценарий, чтобы проверить работоспособность WMI Bridge Provider. В этом случае убедитесь, что все необходимые файлы и компоненты MDM установлены. Используйте PowerShell-команды для проверки состояния:
Get-WmiObject -Namespace "root\cimv2\mdm\dmmap" -Class MDM_AssignedAccess
Это позволит удостовериться, что класс доступен для взаимодействия.
6. Обращение в поддержку
Если проблема не решается, возможно, стоит обратиться в поддержку Microsoft или на специализированные форумы, связанные с MDM и PowerShell, указав вашу версию Windows и дополнительные детали, связанные с вашей конфигурацией.
Эти рекомендации помогут вам продвинуться к решению проблемы с применением конфигурации Shell Launcher. Не забывайте документировать все изменения и результаты, чтобы облегчить анализ и последующие действия.