source

PowerShell 스크립트가 스케줄링된 작업을 통해 실행되지 않음

manysource 2023. 8. 18. 22:46

PowerShell 스크립트가 스케줄링된 작업을 통해 실행되지 않음

도메인 컨트롤러에 최신 보안 이벤트 4740에 대해 SMTP를 통해 전자 메일로 보내도록 설정된 작은 스크립트가 있습니다.

스크립트를 수동으로 실행하면 의도한 대로 실행되지만 예약된 작업을 통해 실행되도록 설정하고 실행된 것으로 표시되더라도 아무 일도 일어나지 않습니다(전자 메일 없음).

스크립트는 다음과 같습니다.

If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))

{   
$arguments = "& '" + $myinvocation.mycommand.definition + "'"
Start-Process powershell -Verb runAs -ArgumentList $arguments
Break
}

$Event = Get-EventLog -LogName Security -InstanceId 4740 -Newest 5
$MailBody= $Event.Message + "`r`n`t" + $Event.TimeGenerated

$MailSubject= "Security Event 4740 - Detected"
$SmtpClient = New-Object system.net.mail.smtpClient
$SmtpClient.host = "smtp.domain.com"
$MailMessage = New-Object system.net.mail.mailmessage
$MailMessage.from = "fromemail@domain.com"
$MailMessage.To.add("toemail.domain.com")
$MailMessage.IsBodyHtml = 1
$MailMessage.Subject = $MailSubject
$MailMessage.Body = $MailBody
$SmtpClient.Send($MailMessage)

스케줄링된 작업은 다음과 같이 설정됩니다.

RunsAs:LOCAL SYSTEM

Trigger: On event - Log: Security, Event ID: 4740

Action:  Start Program - C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

  Argument:  -executionpolicy bypass c:\path\event4740.ps1

저는 또한 다음을 시도했습니다.

Trigger: On event - Log: Security, Event ID: 4740

Action:  Start Program - C:\path\event4740.ps1

작업 기록에 따라:작업 시작, 작업 시작, 생성된 작업 프로세스, 작업 완료, 작업 완료.같은 '이슈'로 사이트의 여러 링크를 살펴봤지만 모두 제가 가지고 있지 않은 변수가 있는 것 같습니다.언급된 솔루션 중 일부는 관련이 있을 수 있다고 생각하여 시도해 보았지만, 효과가 없습니다.예약된 작업을 제거하고 여기에 언급된 대로 재설정해 보았습니다. http://blogs.technet.com/b/heyscriptingguy/archive/2012/08/11/weekend-scripter-use-the-windows-task-scheduler-to-run-a-windows-powershell-script.aspx

이전에 이런 유형의 오류가 발생했거나 이 문제를 우회하는 방법을 알고 있는 사람이 있습니까?

문제 해결:

예약된 작업을 통해 .bat 파일 호출을 시도하기로 했습니다.현재 날짜/시간을 모니터링되는 폴더에 반영하는 간단한 파일을 만들었습니다.4740 이벤트에 의해 트리거된 작업을 통해 수동으로 파일을 실행하면 원하는 결과를 얻을 수 있습니다..ps1 파일을 호출하는 대신 .bat 파일을 변경하면 수동으로 작업할 수 있습니다.4740 이벤트에 의해 트리거되면 이제 .bat이 더 이상 실행되지 않습니다.

작업을 다음으로 변경:

powershell -noprofile -executionpolicy bypass -file C:\path\event4740.ps1

윈도우즈 2008 서버 R2: 일반 탭의 작업 스케줄러 - '다른 이름으로 실행' 사용자가 스크립트를 실행하는 데 필요한 권한을 가진 계정으로 설정되어 있는지 확인합니다.

또한 "사용자가 로그온할 때만 실행" 옵션을 선택하지 않은 것 같습니다.사용자 로그온 여부와 상관없이 실행으로 변경합니다.암호 저장 안 함 옵션을 선택하지 않은 상태로 두면 "최고 권한으로 실행" 옵션이 표시되어야 합니다.

참고: Create Task Action이 아니라 Create a Basic Task Action을 선택해야 합니다.

저는 다음과 같은 해결책을 찾았습니다.

만들기powershell.exe

  1. 마우스 오른쪽 버튼을 클릭합니다.powershell.exe아이콘
  2. 바로 가기 키 메뉴에서 속성 클릭
  3. [고급사항] 단추를 누른 후 "관리자 권한으로 실행"이 선택되어 있는지 확인합니다.

작업 창 아래의 작업 스케줄러 창에서 다음 스크립트를 새 명령으로 추가합니다.

%SystemRoot%\syswow64\WindowsPowerShell\v1.0\powershell.exe -NoLogo -NonInteractive -ExecutionPolicy Bypass -noexit -File "C:\ps1\BackUp.ps1"

enter image description here

이미 문제 해결 방법을 찾으셨을 수도 있지만, 다른 사람에게 도움이 되기 위해 이 메모를 게시할 예정입니다.저도 비슷한 문제에 부딪혔습니다.저는 기본적으로 테스트하고 비교하기 위해 다른 도메인 계정을 사용했습니다.사용자 로그온 여부와 상관없이 실행을 선택한 상태에서 작업이 정상적으로 실행되었습니다.

명심해야 할 몇 가지 사항은 다음과 같습니다.

  1. 작업을 실행하는 데 사용되는 계정에는 서버의 로컬 보안 정책에 따라 "배치 작업으로 로그온" 권한이 있어야 합니다(또는 로컬 관리 그룹의 구성원이어야 합니다).스크립트/bat 파일을 실행하는 데 필요한 계정을 지정해야 합니다.
  2. 올바른 암호 문자를 입력하고 있는지 확인합니다.
  3. 2008 R2의 태스크는 특히 "사용자 로그온 여부와 상관없이 실행"으로 실행하는 경우 대화형으로 실행되지 않습니다.이 작업은 특히 스크립트에서 작업이 파워셸 세션으로 생성되었을 때 사용자 프로파일과 관련된 개체/리소스를 찾는 경우 실패할 수 있습니다. 그렇지 않으면 시작 및 즉시 종료됩니다.스크립트를 실행할 때 $Path를 "사용자 로그온 여부와 상관없이 실행"으로 정의하는 예로 매핑된 드라이브를 지정합니다.작업이 시작될 때 해당 드라이브를 찾습니다. 그러나 작업을 실행하기 위해 검증된 사용자 계정이 로그인되어 있지 않고 스크립트에서 작업해야 하는 소스\개체를 다시 참조하고 있기 때문에 현재 작업이 없습니다. 매핑된 드라이브(\server\share) x:\ vs. 실제 UNC 경로 \server\share
  4. 단계, 스크립트, 인수를 검토합니다.때로는 이 과정을 여러 번 수행했더라도 가장 작은 조각이 큰 차이를 만들 수 있습니다.비밀번호를 입력할 때 문자를 몇 번 놓치거나 스크립트나 작업을 작성할 때 세미콜론을 사용하는 경우가 있습니다.

링크를 확인하면 귀하 또는 다른 사람이 다음 정보를 이용할 수 있기를 바랍니다. https://technet.microsoft.com/en-us/library/cc722152.aspx

오류 메시지가 없고 문제가 무엇인지 모르는 경우 PowerShell 스크립트가 예약된 작업에서 시작하지 않는 이유를 확인하려면 다음 단계를 수행합니다.

  1. 스케줄링된 작업에 대해 설정된 사용자로 CMD를 실행하여 PowerShell 스크립트를 실행합니다.
  2. PowerShell 스크립트가 있는 폴더로 이동합니다.
  3. PowerShell 스크립트를 실행합니다(스크립트 내부에 $ErrorActionPreference= 'continue'와 같은 오류 알림이 있는 경우 해당 알림을 차단하는 모든 문 제거).

모든 오류 알림을 볼 수 있어야 합니다.

제 대본 중 하나는 다음과 같습니다.

"[시스템] 유형을 찾을 수 없습니다.서비스 프로세스.서비스 컨트롤러].이 형식을 포함하는 어셈블리가 로드되었는지 확인하십시오."

이 경우 스크립트 시작 부분에 누락된 어셈블리를 로드하기 위해 줄을 추가해야 합니다.

Add-Type - AssemblyName "System.서비스 프로세스"

다음 오류:

"1" 인수 "컴퓨터에서 서비스 제어 관리자를 열 수 없습니다."를 사용하여 "서비스 가져오기"를 호출하는 중 예외가 발생했습니다.이 작업에는 다른 권한이 필요할 수 있습니다."

선택 : "데이터베이스 이름" 속성이 이미 있으므로 속성을 처리할 수 없습니다.

좋은 아침이에요.

이 스레드가 오래된 스레드라는 것을 알고 있지만 스크립트가 성공적으로 실행되고 있지만 제대로 작동하지 않는 유사한 문제를 찾다가 우연히 발견했습니다.도움이 된 게시물을 찾을 수 없지만, 도메인 관리자로서 스크립트를 실행하는 것이 문제였습니다.게시물의 제안에 따라 도메인 관리자를 로컬 관리자 그룹에 추가했더니 작동했습니다.이것이 제가 겪었던 것과 같은 문제에 대해 다른 사람들에게 도움이 되기를 바랍니다.

조.

했습니다.ExecutionPolicy Bypass스케줄링된 작업을 수행하기 위한 인수입니다.

Program: Powershell.exe
Add Arguments: -ExecutionPolicy Bypass -File C:\pscommandFile.ps1

시나리오에 적용할 수 있는 성공적인 해결 방법 발견:

로그오프하지 말고 세션을 잠급니다!

이 스크립트가 도메인 컨트롤러에서 실행되고 있으므로 원격 데스크톱 콘솔을 통해 서버에 로그인한 다음 서버에서 로그오프하여 세션을 종료합니다.작업 스케줄러에서 작업을 설정할 때 오프라인 모드에서 실행하거나 스크립트를 실행하기 위해 엄격하게 로그온할 수 있는 권한이 없는 사용자 계정과 로컬 서비스를 사용했습니다.

Cole의 문제 해결 지원 덕분에 RunAs 기능에 대해 생각하게 되었고 작동하지 않는 로그온을 해결하기로 결정했습니다.

작업 스케줄러에서 수동으로 생성한 작업을 삭제했습니다.Server 2008 R2의 새로운 기능을 사용하여 Event Viewer의 4740 Security Event로 이동하고 마우스 오른쪽 버튼 > Attach Task to this Event...를 사용했습니다.지시에 따라 작업 페이지의 스크립트를 가리켰습니다.작업이 생성된 후 세션을 잠그고 원격 데스크톱 콘솔 연결을 종료했습니다.프로파일이 '잠금' 상태이고 로그오프되지 않으면 모든 것이 정상적으로 작동합니다.

위의 조언 외에도 오류가 발생하여 다음 링크 http://blog.vanmeeuwen-online.nl/2012/12/error-value-2147942523-on-scheduled.html 에서 해결책을 찾았습니다.

또한 다음과 같은 이점이 있습니다.

태스크 스케줄러에서 예약된 작업 속성을 클릭한 다음 설정을 클릭합니다.

마지막으로 나열된 옵션에서 "작업이 이미 실행 중인 경우 다음 규칙이 적용됩니다." 드롭다운 목록에서 "기존 인스턴스 중지"를 선택합니다.

저는 이에 대한 답도 관련이 있다고 생각합니다.

예약된 작업이 '마지막 실행 시간'을 올바르게 업데이트하고 '(0x0)'의 '마지막 실행 결과'를 제공하지만 실제로 작동하지 않는 이유는 무엇입니까?

요약: 윈도우즈 2012 스케줄링된 작업에 다음과 같은 올바른 환경 변수가 표시되지 않습니다.PATH태스크가 실행되도록 설정된 계정의 경우.하지만 여러분은 이것을 테스트할 수 있고, 만약 그것이 일어나고 있다면, 그리고 여러분이 무슨 일이 일어나고 있는지 이해하면, 그것을 해결할 수 있습니다.

효과가 있었던 아이디어가 하나 더 있습니다.정말 우스꽝스럽지만, 분명히, 기본 대상 OS 설정(화면 오른쪽 하단 모서리)은Vista / Windows Server 200810년이 지났기 때문에 Powershell 스크립트가 이러한 스크립트와 호환되지 않을 수 있습니다.

아래 스크린샷과 같이 대상을 Windows Server 2016으로 변경한 것이 저에게 도움이 되었습니다.

Change the setting on the screenshot

이 문제와 거의 동일하지만 Server 2012 R2에서는 약간 다릅니다.작업 스케줄러에 세 개의 파일을 한 위치에서 다른 위치로 복사하는 파워셸 스크립트가 있습니다.파워셸에서 스크립트를 수동으로 실행하면 마법처럼 작동합니다.그러나 작업 스케줄러에서 실행할 경우 처음 2개의 작은 파일만 복사한 다음 3번째(큰 파일)에 대기합니다.그리고 "운영자 또는 관리자가 요청을 거부했습니다"라는 결과도 얻었습니다.그리고 저는 이 포럼에서 거의 모든 것을 했습니다.

여기 시나리오와 제가 어떻게 수정했는지 나와 있습니다.다른 사람들에게는 효과가 없을 수도 있지만, 만약을 위해 다음과 같이 할 수 있습니다.

시나리오: 1.작업 스케줄러 2의 Powershell 스크립트입니다.서버 3의 로컬 관리자인 도메인 계정을 사용하여 실행.'사용자 로그온 여부와 상관없이 실행' 선택 4. 가장 높은 권한으로 실행

수정: 1. 도메인 계정을 사용하여 서버에 로그인하여 C:에 로컬 프로필을 생성해야 했습니다.\사용자 2.사용자가 내 스크립트에서 참조한 모든 드라이브에 액세스할 수 있는지 확인하고 사용자에게 알립니다.

저는 1번이 저에게 가장 중요한 해결책이라고 생각합니다.저는 이것이 다른 사람들에게 효과가 있기를 바랍니다.

나의 경우(같은 문제)는 작업 작업 명령 인수에 -NoProfile을 추가하고 "최고 권한으로 실행" 확인란을 선택하는 데 도움이 되었습니다. 왜냐하면 내 서버에서 UAC가 활성화되어 있기 때문입니다.

여기에 링크 설명을 입력하십시오.

저는 이 문제에 대한 다른 해결책이 있습니다. 여러분 중 일부에게 적용될 수도 있습니다.

파워셸(xyz.ps1) 스크립트를 만든 후 나중에 편집할 수 있도록 메모장에서 열었습니다.따라서 Windows는 내 xyz.ps1 파일과 메모장 간의 연결을 만들었습니다.exe와 스케줄러가 메모장으로 파워셸 스크립트(xyz.ps1)를 실행하려고 했습니다.실행하는 대신 백그라운드에서 exe를 실행합니다.메모장이 표시된 스케줄러의 "실행 중인 모든 작업 표시" 섹션에 주의를 기울여서 이 문제를 발견했습니다.exe가 xyz.ps1 스크립트를 실행하는 데 사용되고 있습니다.이를 확인하기 위해 Windows 탐색기에서 xyz.ps1 파일을 마우스 오른쪽 단추로 클릭하고 "속성"으로 이동한 후 "열기 위치" 섹션에 메모장이 표시되었습니다.그런 다음 "Open With"를 %SystemRoot%\로 변경했습니다.SysWOW64\Windows PowerShell\v1.0\powershell.exe입니다.이것은 효과가 있었습니다.이제 스케줄러는 powershell.exe를 사용하여 내 xyz.ps1을 실행하고 원하는 결과를 제공합니다.

powershell.exe를 찾으려면 다음 문서를 참조하십시오. https://www.powershelladmin.com/wiki/PowerShell_Executables_File_System_Locations

저도 비슷한 문제가 있었습니다. 스케줄 작업을 수동으로 실행할 때 항상 파워셸 스크립트가 있는 VSC 창을 유지했습니다.방금 닫았고 예상대로 작동하기 시작했습니다.

스크립트 몇 개를 실행하는 동안 저도 같은 문제가 있었습니다.작업 스케줄러에서 수동으로 실행했을 때 스크립트가 완벽하게 실행되고 있었습니다.그러나 예약된 시간에 자동으로 실행되지 않았습니다.

다음의 결심은 나에게 효과가 있었습니다.

powershell exe의 위치를 찾고 마우스 오른쪽 단추를 클릭하여 보안 옵션으로 이동한 후 그룹 또는 사용자 이름에 "인증된 사용자"를 추가하고 모든 권한을 부여합니다.

이 작업이 완료되면 스크립트가 실행될 때까지 기다립니다.

만약 당신이 WIN 10에서 이 문제를 겪고 있다면, 이것은 나에게 그랬던 것처럼 당신의 문제를 해결할 수 있을 것입니다.업데이트로 인해 작업 스케줄러가 엉망이 되었습니다.

http://answers.microsoft.com/en-us/windows/forum/windows_10-performance/anniversary-update-version-1607-build14393-breaks/d034ab52-5d49-4b92-976a-a1355b5a6e6d?page=2

이 댓글로 저의 고민이 해결되었습니다.

"일회성" 작업에 대한 팁은 효과적입니다. MS가 문제를 해결할 때까지 해결책으로 충분합니다.제가 볼 수 있는 한 "매일"의 유일한 장점은 실행 시간과 관련된 임의의 날짜가 없다는 것입니다.작업이 X 날짜에 시작하도록 설정된 이유에 대해 다른 사람들에게 혼란스러울 수 있습니다.

트리거 설정 "Einmal"은 "One-time"을 의미하며, "Sort"는 "한 번에"를 의미합니다.

저의 경우 서명되지 않은 ps1 스크립트 내의 .ps1 참조와 관련이 있습니다(파일 속성에서 차단을 해제해야 함). 또한 첫 번째 줄로 추가했습니다.

실행 정책 설정 - 실행 정책 제한 없음 - 적용

그 후 효과가 있었습니다.

이 문제에 대한 저의 해결책은 ps1 파일의 모든 파일 이름에 대한 전체 경로를 사용하는 것이었습니다.

작업 스케줄러를 사용하여 스크립트의 절반만 실행되지만 스크립트를 수동으로 실행하는 동일한 계정에서 정상적으로 실행되는 유사한 문제가 있었습니다.문제는 제가 제 모듈을 참조하고 있다는 것이었습니다.스크립트 파일에 직접 기능을 추가하면 작업 스케줄러가 작동했지만 모듈을 사용하면 작업 스케줄러가 실패했습니다.동일한 계정으로 실행 중인 동일한 코드화된(모듈)이 작업 스케줄러 없이도 정상적으로 작동했습니다.

Windows에서 실행 중인 환경 변수를 처리하는 방법에 대한 문제가 있었습니다.모듈 이름 대신 전체 경로를 통해 모듈을 참조하면 작업 스케줄러에서 작동했습니다.

많은 시간을 시도한 후에...

작업 스케줄러: powershell.exe -noexit & .\your_script.ps1

다음 폴더에 스크립트를 넣으십시오. windows\system32

행운을 빕니다.

언급URL : https://stackoverflow.com/questions/18259951/powershell-script-does-not-run-via-scheduled-tasks