Windows Server 2012 R2 — сценарий Powershell — запуск от имени администратора — сбой в планировщике заданий Произошло нарушение ограничения

Этот скрипт работает при запуске вручную двойным щелчком или из консоли powershell, запущенной не от имени администратора. Этот скрипт требует прав администратора. Скрипт проверяет, отключено ли наследование учетной записи пользователя (Security-Advanced), и если да, то включает его.

#### START ELEVATE TO ADMIN #####
param(
    [Parameter(Mandatory=$false)]
    [switch]$shouldAssumeToBeElevated,

    [Parameter(Mandatory=$false)]
    [String]$workingDirOverride
)

# If parameter is not set, we are propably in non-admin execution. We set it to the current working directory so that
#  the working directory of the elevated execution of this script is the current working directory
if (-not($PSBoundParameters.ContainsKey('workingDirOverride')))
{
   $workingDirOverride = (Get-Location).Path
}

function Test-Admin {
    $currentUser = New-Object Security.Principal.WindowsPrincipal $([Security.Principal.WindowsIdentity]::GetCurrent())
    $currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
}

# If we are in a non-admin execution. Execute this script as admin
if ((Test-Admin) -eq $false)  {
    if ($shouldAssumeToBeElevated) {
        Write-Output "Elevating did not work :("

    } else {
        #                                                         vvvvv add `-noexit` here for better debugging vvvvv 
        Start-Process powershell.exe -Verb RunAs -ArgumentList ('-noprofile -file "{0}" -shouldAssumeToBeElevated -workingDirOverride "{1}"' -f ($myinvocation.MyCommand.Definition, "$workingDirOverride"))
    }
    #exit
}

#Set-Location "$workingDirOverride"
##### END ELEVATE TO ADMIN #####

# Add actual commands to be executed in elevated mode here:
Write-Output "I get executed in an admin PowerShell"



    # Error handling
    Function Exception {
         $err = $_.Exception.Message
         write-output $err | timestamp >> $LogFile
         return $err  
     }
    
     # Create logs directory and file if not exist
    $LogFile = "C:\gpo\inheritance.log"
    filter timestamp {"$(Get-Date -Format G): $_"}
      
    If (-not(Test-Path -Path $LogFile)){
        New-Item -Path $LogFile -ItemType File -Force -ErrorAction Stop
    }
    
    
    # Truncate log file
      
    # Get number of lines of log file
    $logfileLines = Get-content $LogFile | Measure-Object –Line | select -ExpandProperty Lines
    if ($logfileLines -gt '5000') {
        (Get-Content $LogFile | Select-Object -Skip 4000) | Out-File $LogFile
      }
      
    
    
    $users = Get-ADUser -ldapfilter "(objectclass=user)" -searchbase "OU=something.local,DC=example,DC=local"
    
    ForEach($user in $users)
    {
        Try{
            $dn= [ADSI](“LDAP://” + $user)
            $acl= $dn.psbase.objectSecurity
            if ($acl.get_AreAccessRulesProtected()){
                $isProtected = $false # $false to enable inheritance
                                 # $true to disable inheritance
                $preserveInheritance = $true # $true to keep inherited access rules
                                         # $false to remove inherited access rules.
                                         # ignored if isProtected=$false
                $acl.SetAccessRuleProtection($isProtected, $preserveInheritance)
                $dn.psbase.commitchanges()
                $output = ($user.SamAccountName + "|" + `
                        $user.DistinguishedName + `
                        "|inheritance set to enabled")
                write-output $output | timestamp >> $LogFile
              }
             }
          Catch{
               Exception
           }
        }

Однако он не работает из планировщика заданий, почему-то он не работает с правами администратора, учетная запись пользователя, указанная в планировщике заданий, является администратором домена. Запускать с наивысшими привилегиями - проверено

Программа/сценарий:C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe Добавьте аргументы (необязательно):-ExecutionPolicy Bypass -file "C:\GPO\enable-inheritance.ps1" Начать через (необязательно):C:\GPO

Пробовал вставлять powershell в bat-скрипт, опять работает вручную, но не через Планировщик

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File ""C:\GPO\inheritance.ps1""' -Verb RunAs}"

Сценарий выполняется на контроллере домена, добавлено «Вход в систему как пакетное задание rigts».

Ошибка при выполнении запланированного задания:

Exception calling "CommitChanges" with "0" argument(s): "A constraint violation occurred.

Нет ошибки при запуске вручную

Вы запустили powershell, щелкнув правой кнопкой мыши ярлык и выбрав «Запуск от имени администратора»? Обычный пользователь не может перейти на администратора. Если вы запустите powershell как обычный пользователь, вы не сможете обновиться до администратора внутри скрипта.

jdweng 09.12.2022 13:14

как я уже писал, пользователь, запускающий задачу, является администратором домена

overflowed 09.12.2022 13:15

Powershell не запускается от имени администратора (даже если вы входите в систему как администратор), если вы не щелкнете правой кнопкой мыши по ярлыку и не выберите «Запуск от имени администратора».

jdweng 09.12.2022 13:53

пробовал, та же ошибка

overflowed 09.12.2022 14:03

Какую учетную запись использует планировщик заданий? Содержит ли учетная запись окружающую среду? Сценарий может завершиться ошибкой, если у него нет PSModulePath.

jdweng 09.12.2022 14:04

Какую учетную запись использует планировщик? Когда вы планируете задачу, вы можете добавить параметр для запуска от имени.

jdweng 09.12.2022 14:55

уже делал, при запуске от имени администратора домена указана учетная запись

overflowed 09.12.2022 15:03

Я подозреваю, что он запускает разные версии командлетов. Powershell ищет командлеты в текущей папке и, если не находит, проверяет PSModulePath. Вы получаете какой-либо вывод из скрипта при нормальном запуске? Выходные данные могут вызывать сбой задачи. См.: developercommunity.visualstudio.com/t/…

jdweng 09.12.2022 15:26

да, вывод перенаправляется в файл журнала, который заполняется, когда скрипт работает нормально, а при выполнении задачи в журнал записывается только следующее, это ошибка в блоке Catch:Exception calling "CommitChanges" with "0" argument(s): "A constraint violation occurred.

overflowed 09.12.2022 15:37

Возможно, отсутствует атрибут manageby, как в этом сообщении: social.technet.microsoft.com/Forums/ie/en-US/…

jdweng 09.12.2022 15:58
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
10
92
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Исправлено отключением UAC и перезагрузкой сервера

Другие вопросы по теме