Powershell 스크립트에 대한 예약된 작업

Powershell 스크립트에 대한 예약된 작업

그래서 일정에 따라 powershell 스크립트를 실행하려고합니다. 매일 아침 6시, 매 시간마다 반복하세요. 스크립트 자체는 다음과 같습니다.

Get-Content C:\Users\administrator\Desktop\users.txt | ForEach-Object {
    Set-AdUser -Identity $_ -LogOnWorkstations $null
}

이제 스크립트를 직접 실행하면 완벽하게 작동합니다. 하지만 스크립트가 실행 예정일 때 제대로 실행되지 않는 것 같습니다. 내 생각에는 실행 정책이 스크립트를 실행하기 전에 스크립트를 실행하는 것이 안전한지 계속 묻는 것입니다. 이것이 스크립트가 자체적으로 시작될 수 없는 이유일 수 있다는 데 다른 사람이 동의하는 경우 이 장벽에 대한 솔루션을 제공해 주시겠습니까?

답변1

예정된 작업은 어디에 있나요? GPO 또는 로컬 컴퓨터에 있습니까? 스크립트와 스크립트가 실행되어야 하는 시스템이 동일한 네트워크에 있습니까?

다음과 같이 예약해 보세요(아직 수행하지 않은 경우).

Programm/Script: PowerShell.exe

Arguments: -ExecutionPolicy Bypass -Command "& 'FilePathToScript.ps1'"

Set-ADUser편집: 또한 명령을 찾을 수 없기 때문에 스크립트를 실행하려는 워크스테이션에 AD-PS 모듈을 설치해야 하는지 잘 모르겠습니다.

답변2

실행 정책은 확인하기 쉬운데, 정상적으로 로그온했을 때 스크립트로 실행할 수 있나요? 그렇지 않은 경우 '실행 정책 원격 서명'을 실행하면 관리 Powershell 세션에서 실행되어 hte 서버에 대해 전역적으로 설정됩니다.

예약된 작업을 실행하는 사용자는 이 작업이 실행되는 컴퓨터에 대해 '배치로 로그온' 권한이 있어야 합니다. 이것이 AD 모듈인 경우 도메인 컨트롤러에서 실행하고 있다고 가정합니다. 이 경우 기본 도메인 컨트롤러 GPO를 수정하여 사용자에게 올바른 '일괄 로그온'을 할당해야 합니다. RSAT가 있는 워크스테이션이나 구성원 서버에서 실행 중인 경우 로컬 보안 정책을 사용하여 이 권한(SecPol.MSC)을 할당해야 합니다.

스크립트를 실행하는 사용자는 사용자 개체를 수정할 수 있는 수준까지 Active Directory에 액세스할 수 있어야 합니다. 일반적으로 도메인 컨트롤러에 로그인하는 경우 도메인 관리자 마녀가 이 권한을 부여하지만 서비스 계정을 만든 경우 올바른 권한이 없을 수 있습니다. 필요한 권한 수준을 조사하고 이를 AD 도메인의 관련 영역에 적용해야 합니다. 조심하세요.

나는 그것이 배치로 로그온(Log on as Batch)이었다고 확신합니다. 그것은 나를 몇 번 붙잡았고 그것이 당신을 막을 때 분명하지 않습니다.

추가로 예약된 작업 기록 탭을 조사해야 하는 경우 이벤트 뷰어와 마찬가지로 도움이 될 수 있습니다.

답변3

실행 정책은 시스템 전체에 적용됩니다. 대화형으로 작동한다면 예약된 작업으로 실행할 때 문제가 되지 않을 것 같습니다.

여기서 누락된 것은 정보입니다. 두 개의 명령을 사용하고 로깅을 수행하지 않으면 정보를 얻을 수 없습니다. 그리고 Active Directory 모듈을 로드하지 않고 있으므로 몇 가지 이유가 설명될 수 있습니다.

다음은 예약된 작업으로 PowerShell 스크립트를 실행하고 출력을 기록하는 방법의 예입니다.

Program/Script: PowerShell  
Arguments:  
-NonInteractive -WindowStyle minimized -c "powershell -c C:\Apps\AppName\SomeScript.ps1 -verbose > C:\Apps\AppName\Logs\SomeScript.log 2>&1"  

다음은 Active Directory 모듈을 로드하는 예입니다.

$startTime = Get-Date
$logDateFormat = "yyyy-MM-dd HH:mm:ss"
[console]::WriteLine("{0} Loading Active Directory Module", [datetime]::Now.ToString($logDateFormat))
import-module ActiveDirectory  

Get-Content C:\Users\administrator\Desktop\users.txt | ForEach-Object {  
    [console]::WriteLine("{0} Clearing workstations for user: {1}", [datetime]::Now.ToString($logDateFormat), $_)
    Set-AdUser -Identity $_ -LogOnWorkstations $null
}

$endTime = Get-Date
[console]::WriteLine("{0} Finished.  Time Required: {1}", [datetime]::Now.ToString($logDateFormat), $endTime.Subtract($startTime).ToString())

답변4

다음과 같은 프로그램/스크립트입니다. Powershell.exe 인수 및 경로

 -ExecutionPolicy Bypass -File "C:\alert.ps1"

여기에 이미지 설명을 입력하세요

관련 정보