Привет всем!!!
Не удается настроить групповую политику для создания задачи в шедулере. Вернее политику создал, но на рабочей станции не создается задача. сохраняю результат примененной политики в ХТМЛ и вижу ошибку Result: Failure (Error Code: 0x80070005)
Насколько я помню этот код говорит о нехватке прав, но каких прав не хватает не понятно.
В момент применения политики на машину, в логах машины какие ошибки появляются? Если попробовать на машине - поиграть с restriction policy и если скрипт положить локально на тестовую машину? И как прошел тест запуска скрипта на машине руками из указаной в политике сетевой папки?
В логах ошибок нет, скрипт из шары ручками выполняется. Это тестовая среда по этому restriction policy сразу убрал ограничение.
Причина видно в том что когда создаю задание в разделе компьютера и указываю запуск от уз. пользователя, тогда выходит ошибка. Даже если пользователь в ходит в группу локальных админов. Если в настройках задачи меняю уз пользователя на систем, тогда задача создается.
Как через повершел поменять параметр?
В смысле команда powershell которая выставляет галочку в этом GPO?
Решил через скрип PS создать задачу. Как выставить переключатель в нужное положение нашел.
$taskUser = New-ScheduledTaskPrincipal -UserId ‘vini\s.scheduler’ -RunLevel Highest -LogonType Password
Set-ScheduledTask -TaskName Test-321 -Principal $taskUser -Settings $taskSettings
Но завершается с ошибкой
Set-ScheduledTask : The user name or password is incorrect.
At line:1 char:1
Прошерстил интернет, понял что такие задания можно создавать для уз типа MSA\gMSA
Как создать задание, которое будет запускаться от нужной уз через GPO или с помощью PS?
Решил чуть изменить подход. Буду использовать скрипт без импорта модуля SQLServer. Тогда не важно от какой уз запускается скрипт.
$shares = get-smbshare -Special $false | get-smbshareaccess
$Pc = get-wmiobject Win32_ComputerSystemProduct -Property * | Select-Object UUID, "__SERVER"
$PcSusID = Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\ | select SusClientId
$date=get-date -Format "dd.MM.yyyy HH:mm:ss"
$PcName = $Pc.__SERVER
$PcUID = $Pc.UUID
$CompSusID = $PcSusID.SusClientId
#Подключение к базе данных и Insert
$dataSource = “sql-server\instance”
$database = “name_DB”
$auth = “Integrated Security=SSPI;”
$connectionString = “Provider=sqloledb; ” +
“Data Source=$dataSource; ” +
“Initial Catalog=$database; ” +
“$auth; “
$connection = New-Object System.Data.OleDb.OleDbConnection $connectionString
for ($s=0; $s -lt $shares.Count; $s++) {
$PcSharesName = $shares[$s].name
$ShareAccName = $shares[$s].AccountName
$ShareAccControl = $shares[$s].AccessControlType
$ShareAccRight = $shares[$s].AccessRight
$sql = "BEGIN
IF EXISTS (SELECT * FROM Comp_Data
WHERE CompName = N'$PcName' AND CompShareName = '$PcSharesName' AND AccessRight = '$ShareAccRight')
BEGIN
UPDATE Comp_Data SET CompUID='$PcUID', CompShareName='$PcSharesName', AccountName='$ShareAccName', AccessControlType='$ShareAccControl', AccessRight='$ShareAccRight', CompSusID='$CompSusID',DateRun='$date'
WHERE CompName = N'$PcName' AND CompShareName = '$PcSharesName' AND AccessRight = '$ShareAccRight'
END
ELSE
BEGIN
INSERT INTO Comp_Data (CompName,CompUID,CompShareName,AccountName,AccessControlType,AccessRight,CompSusID,DateRun)
VALUES (N'$PcName',N'$PcUID','$PcSharesName','$ShareAccName','$ShareAccControl','$ShareAccRight','$CompSusID','$date')
END
END"
$command = New-Object System.Data.OleDb.OleDbCommand $sql,$connection
$connection.Open()
$command = New-Object data.OleDb.OleDbCommand $sql
$command.connection = $connection
$rowsAffected = $command.ExecuteNonQuery()
$connection.Close()
}
Но проблема теперь в том что в базу пишется одна запись.
хотя в переменной $shares в данном случае 2 записи.

Как сделать что бы все строки попали в базу?
Если руками запустить, есть какой-нибудь ответ от сервера почему попадет только одна запись? И то что ли записей более, чем одна?
Ответа от сервера нет. Записей в переменной больше чем одна. На скрине вывод переменной $shares
Спасибо, твой ответ навел на мысль посмотреть что в переменную $sql попадает.
И ошибка была в селекте.
SELECT * FROM Comp_Data
WHERE CompName = N’$PcName’ AND CompShareName = ‘$PcSharesName’ AND AccessRight = ‘$ShareAccRight’
из-за того что имя шары одинаковое, различие только в именах (AccountName), получается правильный запрос такой
SELECT * FROM Comp_Data
WHERE CompName = N’$PcName’ AND CompShareName = ‘$PcSharesName’ AND AccessRight = ‘$ShareAccRight’ AND AccountName = ‘$ShareAccName’
и в блок запроса UPDATE так же нужно в условие добавить AccountName = ‘$ShareAccName’
Тогда все работает как нужно!
Теперь проблема с запускам скрипта из шедулера. Так как скрипт запускается от уз система, соответственна у нее нет прав на sql сервере. Как можно это обойти?
Не самый лучший вариант, но пока ищется решение можно использовать например такой способ:
Спс, скрипт работает!!!
Но теперь не пойму почему не работает шедулер от уз система. Т.е она запускается и все, весит в таком состоянии пока не тормазну. Если шедулер запускать от уз пользователя, то все работает. Но мне нужно запускать от системы, что бы шедуллер работал даже на тех серверах куда по долгу могут не логинется админы.
Без скрипта шедулер отрабатывает? Возможно из-под SYSTEM есть ограничения на доступ к сетевому ресурсу, гдескрипт лежит.
P.S. из-под SYSTEM что-либо запускать не очень хорошая идея
Если руками скрипт запускать то все работает. На доменную шару NETLOGON у доменных компов есть доступ.
если не от системы, то как еще запускать что бы не указывать пользователя?
В ГПО в разделе компьютер, если создавать задание от имени пользователя, то на компьютерах задание не создается, из-за отсутствие прав.
Методом тыка заметил такую вещь после перегрузки, захожу в планировщик, запускаю задачу, проверяю в базе данных, запись обновилась. Последующие запуски не обновляют запись с бд. Еще раз перегружаю и запускаю задание, опять запись обновляется, но последующие запуски не дают результата. После ребута только первый запуск обновляет запись в бд.
Забыл отписаться что вопрос решен. Проблема с запуском задачи в ручную только на моей машине, но задача работает по расписанию без проблем. На других компах и вручную и по расписанию задача отрабатывает без ошибок. @sysadmin, спасибо за помощь!
1 Like
Всегда welcome. Спасибо за фидбек 