Powershell: 사용자가 로그인하지 않았을 때 실행할 스케줄링된 작업 설정
저는 파워셸 스케줄링된 작업 cmdlet을 사용하여 서버에서 스케줄링된 작업을 생성해 왔습니다.
이 API를 사용하여 사용자 로그인 여부를 '실행'으로 선택하려면 어떻게 해야 합니까?
제가 만들어 놨습니다.action,trigger,principal그리고.settings합니다에 합니다.Register-ScheduledTask, 아래와 같이
$action = New-ScheduledTaskAction -Execute foo.exe -Argument "bar baz"
$trigger = New-ScheduledTaskTrigger -Once -At $startTime -RepetitionInterval (New-TimeSpan -Minutes 1) -RepetitionDuration ([Timespan]::MaxValue)
$principal = New-ScheduledTaskPrincipal -UserId "$($env:USERDOMAIN)\$($env:USERNAME)" -LogonType ServiceAccount
$settings = New-ScheduledTaskSettingsSet -MultipleInstances Parallel
Register-ScheduledTask -TaskName $taskName -TaskPath "\my\path" -Action $action -Trigger $trigger -Settings $settings -Principal $principal
 
이렇게 예약된 작업을 생성하면 기본적으로 '사용자가 로그온되어 있을 때만 실행'으로 설정됩니다.
이 질문은 COM 개체를 사용하여 수행하는 방법과 schtasks.exe를 사용하여 수행하는 방법을 보여 주지만,*-ScheduledTask* cmdlet?
저는 제 자격 증명을 스크립트에 내장하는 것을 좋아하지 않으며(여기에 있는 다른 몇 가지 예도 이를 수행합니다), 일반적으로 패커나 다른 시스템/구성 자동화 같은 것이나 의사 랜덤으로 생성된 암호를 사용하는 클라우드 프로바이더에서는 이 작업을 수행할 수 없습니다.또한 일반적으로 스크립트나 명령 또는 작업에 자격 증명을 코딩하는 것은 "나쁜 관행"이기 때문에 쉽게 유출될 수 있다고 생각합니다.
이를 위한 더 나은 방법이 있는데, 이 스레드의 댓글에서 애연이 언급은 했지만 시스템 사용자로 principal을 적절하게 설정하는 방법에 대해서는 자세히 설명하지 않았습니다.이 문제를 해결하고 자동으로 백그라운드에서 실행되며 로그인 여부에 따라 결정되지 않는 시스템 사용자로서 작업을 예약합니다.
아래 명령어 집합은 관리자 액세스가 필요한 중요한 작업을 백그라운드에서 예약해야 했던 몇 곳에서 사용한 것입니다.도움이 되길 바래요!
$action = New-ScheduledTaskAction -Execute foo.exe -Argument "bar baz"
$trigger = New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Minutes 1) -RepetitionDuration ([Timespan]::MaxValue)
$principal = New-ScheduledTaskPrincipal -UserID "NT AUTHORITY\SYSTEM" -LogonType ServiceAccount -RunLevel Highest
$settings = New-ScheduledTaskSettingsSet -MultipleInstances Parallel
Register-ScheduledTask -TaskName "tasknamehere" -TaskPath "\my\path" -Action $action -Trigger $trigger -Settings $settings -Principal $principal
$principal을 제거하고 사용자 및 암호로 작업을 등록해야 합니다.
Register-ScheduledTask -TaskName $taskname `
                       -TaskPath "\my\path" `
                       -Action $action `
                       -Trigger $trigger `
                       -User "$env:USERDOMAIN\$env:USERNAME" `
                       -Password 'P@ssw0rd' `
                       -Settings $settings
의 " or not"  GUI  "    과 은  의   과   은                  New-ScheduledTaskPrincipal -LogonType S4U.
PowerShell을 통한 스케줄링된 작업 생성에 대한 입문서
저도 파워쉘을 사용하여 윈도우 서버 2019에서 예약된 작업을 생성하려고 했습니다.어떤 대답도 통하지 않았습니다.모든 답은 정확한 해결책을 조금씩 가지고 있는 것 같지만, 어느 것도 완전한 해결책을 가지고 있지 않았습니다.어떤 사람들에게는 그 해답들 중 일부가 효과가 있을지 모르지만, 그것은 그들의 기존 시스템, 보안 설정 및 기타 요인들에 근거한 행운이었다고 확신합니다.애플리케이션 원격 측정을 수집하기 위해 PowerShell을 통해 매우 간단한 예약 작업을 작성하는 과정에서 배운 것이 많습니다.
그래서 원래 답변을 완전히 수정했으며, 이제 거의 모든 상황에서 예약된 작업(특히 서버)을 생성하는 데 필요한 단계를 단계별로 안내해 드리겠습니다.만약 그것이 아주 간단했다면.cron.
무인 태스크를 실행하는 사용자에 대한 배치 작업으로 로그온 할당
대부분의 사용자가 서버/응용 프로그램 유지보수를 위해 예약된 작업을 만들거나 주기적으로 어떤 작업을 실행하고자 할 때 첫 번째 중지는 Windows 작업 스케줄러입니다.좋은 GUI가 제공됩니다(음, 더 좋은/현대화 될 수도 있겠지만, 적어도 GUI는 가능합니다). 여기서는 사용자가 작업을 진행하는 데 필요한 모든 세부 정보를 지정할 수 있습니다.문제는 GUI를 자동화할 수 없다는 것입니다.그리고 제가 알아낸 바와 같이, GUI는 마이크로소프트가 어떻게 하고 있는지(또는 어떻게 하고 있지 않은지)에 대해서는 확실히 알려주지 않는 막후에서 작업을 하고 있습니다.실행되지 않는 작업이나 실행 중인 사용자 계정이 잠기는 등 많은 문제가 발생할 수 있습니다.
배치 작업으로 로그온()SeBatchLogonRight에 대한 Microsoft의 그룹 정책 제목 아래에 있는 문서에서 Microsoft는 "작업 스케줄러는 사용자가 작업을 예약할 때 자동으로 이 권한을 부여합니다."라고 설명합니다.이 진술이 항상 사실인 것은 아닙니다.
Task Scheduler GUI를 사용하여 예약된 작업을 생성할 때, 예, 예약된 작업이 사용자의 로그온 여부와 상관없이 실행으로 구성되어 있고 사용자에게 배치 작업 권한이 없는 경우 Task Scheduler는 해당 권한을 사용자에게 할당합니다(기본값이 변경되지 않는 한 위의 참조 링크 참조).
그러나 PowerShell ScheduledTask 모듈의 cmdlet을 사용하여 스케줄링된 작업을 생성할 때는 이 자동 사용자 권한 할당이 발생하지 않습니다.따라서 이 작업을 수동으로 수행해야 합니다.이를 위한 GUI 방법은 로컬 보안 정책 MMC(Microsoft Management Console)를 사용하는 것입니다.물론, GUI는 자동화 시나리오로 나와 있기 때문에, 여기 있는 당신의 친구는secedit.exe는 제가 했습니다.)secedit.exe.)
서버에서 실행 중인 응용 프로그램에 대한 원격 측정을 수집하는 예약된 작업이 있다고 가정해 보겠습니다. 그러면 원격 측정을 새 유물이나 Data Dog와 같은 원격 측정 수집 서비스로 전송합니다. 계정은자로다e로에서 됩니다.CONTOSO\AppTelemetry. 파란색/녹색 배포 중에 PowerShell을 통해 예약된 작업을 자동으로 생성하기 때문에 이 사용자에게 배치 작업 사용자 권한으로 로그온을 할당해야 합니다.
을 해서.secedit 권한을 하다 ③
 
여기서 단계는 매우 간단합니다.
- 기존 서버의 보안 정책을 보안 정책 템플리트로 내보냅니다(선택사항, 중요한 섹션만 포함).
 - 새 보안 정책 템플릿 생성
 - 예약된 작업을 실행할 사용자의 SID(보안 식별자)를 새 보안 정책 템플릿의 해당 사용자 오른쪽에 추가합니다.
 - 보안 정책 변경 내용이 들어 있는 보안 정책 템플릿을 새 데이터베이스로 가져옵니다.
 - 시스템의 보안 정책을 구성하여 4단계에서 작성한 보안 정책 데이터베이스의 변경 내용을 통합합니다.
 
이것을 실현할 수 있는 코드를 살펴봅시다.
기존 서버의 보안 정책을 보안 정책 템플릿으로 내보내기
이 작업은 CMD 또는 PowerShell(데스크탑 에디션 또는 Core)에서 수행할 수 있습니다.별도의 언급이 없는 한 모든 예는 PowerShell에 포함됩니다.
secedit.exe /export /cfg secpol.inf /areas USER_RIGHTS
 
위 명령은 시스템의 보안 정책을 내보내는 것이지만 사용자 권한 할당에 대한 정보가 포함된 섹션만 내보냅니다.레지스트리 키와 같은 추가 설정을 추가해야 하는 경우 보안 정책을 통해 이 작업을 수행할 수도 있습니다. Microsoft기서에서  읽기secedit.exe또는 일반적으로 보안 정책을 선택합니다.
새 를    을 된  의 를 SID에 합니다.SeBatchLogonRight을 매김
 
이제 새로운 보안 정책이 무엇인지 대 현재 보안 정책이 무엇인지에 대한 델타를 포함하는 새로운 보안 정책 템플릿을 만들어야 합니다.새 보안 정책 템플릿에는 변경해야 하는 설정만 포함하여 가능한 한 적은 정보를 포함하는 것이 좋습니다.
어떤 사람은 당신이 해야 할 일은 다음과 같이 지정하는 것뿐이라고 생각할 것입니다.SeBatchLogonRight사용자에 대한 SID를 포함해야 합니다.하지만 당신이 그렇게 생각했다면 틀렸을 거에요.SeBatchLogonRight에는 기본적으로 일부 사용자가 할당되어 있습니다(Microsoft 문서에 대한 위의 참조 링크 참조).새 정책 템플릿에서 사용자의 SID를 이 오른쪽에 할당하면 시스템 보안 정책의 기존 값을 효과적으로 대체할 수 있습니다.따라서 추가적인 변경 작업을 진행하고 있으므로 위에서 내보낸 시스템 보안 정책에서 기존 값으로 템플릿에 이 사용자 권한을 추가한 다음 사용자 SID를 목록에 추가해야 합니다.
으로,SeBatchLogonRight합니다. SID는 다음과 같습니다.
SeBatchLogonRight = *S-1-5-32-544,*S-1-5-32-551,*S-1-5-32-559,*S-1-5-32-568
 
사용자가 이 권한을 가져야 하는 일부 표준 Windows 보안 그룹에 대한 "잘 알려진" SID입니다.SID에 해 보겠습니다.CONTOSO\AppTelemetry이다 ㅇS-1-5-21-0000000000-1111111111-2222222222-3333잠깐만요.? 하지만 잠깐만요, 어떻게 그걸 얻죠?
function ConvertTo-SecurityIdentifier {
    Param (
        [Parameter(Position = 0, Mandatory, ValueFromPipeline)]
        [string[]] $UsernameOrGroup
    )
    Process {
        foreach ($Name in $UsernameOrGroup) {
            $Account = New-Object -Type System.Security.Principal.NTAccount `
                                  -Argument $Name
            $Account.Translate([System.Security.Principal.SecurityIdentifier]).Value
        }
    }
}
Set-Alias -Name ConvertTo-SID -Value ConvertTo-SecurityIdentifier
function ConvertFrom-SecurityIdentifier {
    Param (
        [Parameter(Position = 0, Mandatory, ValueFromPipeline)]
        [string[]] $SecurityIdentifier
    )
    Process {
        foreach ($SID in $SecurityIdentifier) {
            $Account = New-Object -Type System.Security.Principal.SecurityIdentifier `
                                  -ArgumentList $SID
            $Account.Translate([System.Security.Principal.NTAccount]).Value
        }
    }
}
Set-Alias -Name ConvertFrom-SID -Value ConvertFrom-SecurityIdentifier
 
(단순히 사용하지 않은 이유는 무엇입니까?Get-ADUser사용자 계정에 대한 SID를 얻기 위해서요?두 가지 이유.를을는은다지자정다지은째ta,tastet,'tdrstdod는여자을정를Get-ADUser. 할 수 있지만 위의 코드가 더 명확합니다.둘째, 그리고 가장 중요한 것은 모든 사용자가Get-ADUser그들의 기계에 설치되어 있습니다.에는 RSAT Tools설치되어  "RSAT(Windows Remote Server Administration Tools)"가 설치되어 .Get-ADUser이용할 수 있는. PowerShell 상태에서 RSAT " Active Directory PowerShell "을 합니다.Get-ADUser사용할 수 없습니다.의 cmdlet Windows 이외의 다른 합니다.NET 프레임워크: 사용자 계정 SID를 가져오려고 하고 PowerShell을 사용하는 경우 정의상 두 가지 전제 조건이 있을 가능성이 높습니다.)
그러면 간단히 다음을 실행할 수 있습니다.
$SID = 'CONTOSO\AppTelemtry' | ConvertTo-SecurityIdentifier
 
이제 SID가 생겼으니 보안 정책 템플릿을 만들 수 있습니다(이를 위한 더 나은 방법이 있습니다. 이 INF 파일과 프로그래밍적으로 상호 작용할 수 있도록 PowerShell cmdlet을 만들었지만 여기 문서만 사용하려고 합니다).는든안 SID과다가이에낸hn다fne이dtl과낸안y,ddusy든*은 쉼표로 구분됩니다 ,  은 로 됩니다  됩니다 로  은        
$NewPolicy = @'
[Unicode]
Unicode=yes
[Version]
signature="$CHICAGO$"
Revision=1
[Privilege Rights]
SeBatchLogonRight = *S-1-5-32-544,*S-1-5-32-551,*S-1-5-32-559,*S-1-5-32-568,*S-1-5-21-0000000000-1111111111-2222222222-3333
'@
$NewPolicy | Set-Content batchlogon.inf
 
새 보안 정책 템플릿을 새 보안 정책 데이터베이스로 가져옵니다.
제목에 다 적혀 있습니다.
secedit.exe /import /db batchlogon.sdb /cfg batchlogon.inf
 
새 보안 정책 데이터베이스에 포함된 변경 내용으로 시스템 보안 정책 구성
다시 한번 머리말에 이렇게 적혀있습니다.
secedit.exe /configure /db batchlogon.sdb
 
CLI에서 바로 일괄 작업으로 로그온에 사용자를 추가하면 됩니다.
PowerShell을 통해 스케줄링된 작업 생성
로그인 여부에 관계없이 사용자가 예약된 작업을 실행할 수 있는 권한을 가지게 되었으므로, 사용자의 로그인 여부에 관계없이 실행할 예약된 작업을 만들어야 합니다.유형이 하다는 많은 이저는히에한를은다는수볼이&a에히e다u수볼를한tnoytseq&sylyurtsneda(q은는이n저는이,)e )S4U아니면ServiceAccount) 또는 최고 권한 등으로 실행합니다.그 어떤 것도 듣지 마세요.그것은 대부분 틀렸습니다.이 섹션에서는 사용자가 로그온되어 있는지 여부에 관계없이 실행되는 예약된 작업을 생성하는 데 필요한 최소 단계를 설명합니다.
스케줄링된 작업 작업 만들기
먼저 작업 작업을 만듭니다.예약된 작업은 다음과 같은 몇 가지 부분으로 구성됩니다.
- 행동들
 - 트리거
 - 설정
 - 교장(들)
 - 등록.
 
그 이름들은 상당히 설명이 가능합니다.프로그램을 실행하는 예약된 작업 작업을 만듭니다.(다른 액션 유형도 있습니다.작업 수행에 대한 설명서 참조).
 할  Scheduler  에   은 한 가 입니다 한다는 를 의  입니다  한다는  의 인스턴스를 생성한다는 입니다.cmd.exe제공된 프로그램을 실행합니다.이는 프로그램에 인수를 지정해야 하는 경우 CMD 명령의 어려운 인용 규칙을 따라야 한다는 것을 의미합니다. (인수에 따라 이러한 인용 규칙은 명령이 예상대로 실행되는지 확인하기 위해 많은 테스트가 필요할 수 있습니다.간단한 경우에도 틀렸고, 작업이 제대로 실행되는 것 같았습니다.0종료 코드—그러나 아무 것도 하지 않았습니다!) 참조cmd.exe /? 웹 을 통해서도 많은 를 찾을 수 또한 웹 검색을 통해서도 많은 정보를 찾을 수 있습니다.
작업 작업을 만듭니다.
$TaskAction = New-ScheduledTaskAction -Execute 'powershell.exe' `
    -Argument ('-NoLogo -ExecutionPolicy Bypass -NoProfile -NonInteractive' + `
     '-File "C:\Telemetry\Send-ApplicationTelemetry.ps1"')
 
의 일부를   를  할 에는  해야 을 이 에  해야  을   를                        에는       에     이 할 -Command파라미터를 사용하는 것과 같은 매개 변수-File내가 여기서 했던 것입니다.여기에 몇 가지 지적할 사항이 있습니다.
- 사용할 수 있었습니다.
pwsh.exePowerShell "PowerShell Core " 를 합니다. -NoLogo에서는 PowerShell을 시작할 때 나타나는 "배너"를 인쇄하지 않습니다.이렇게 하면 로그 파일로 리디렉션된 출력을 더 좋게 만들 수 있습니다.-ExecutionPolicy Bypass이 스크립트가 시스템의 현재 실행 정책을 무시하도록 지정합니다.본행은은 입니다.Restricted하지 않는 한 할 수 에서 온 할 수 . , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , .이 스위치를 사용하면 기본적으로 스크립트가 실행됩니다.항상 그럴 필요는 없겠지만, 예약 중인 스크립트를 신뢰한다면 이 또한 피해가 가지 않을 것입니다.-NoProfile프로파일을 데 의 PowerShell을지는다데의다한과(다다osa데 ).bash프로파일(Linux OS)을 선택합니다.그러나 전역 프로파일 스크립트도 있을 수 있습니다.PowerShell을 시작할 때 프로파일 스크립트를 실행해야 한다는 것을 모르는 한 이 스위치를 추가해도 문제가 없으며 대부분의 경우 오류를 방지할 수 있습니다.-NonInteractive매우 중요한 스위치입니다.기본적으로 파워셸이 사용자 입력(예: 확인 또는 사용자 입력이 필요한 cmdlet)을 요구하지 않도록 합니다.이는 또한 스크립트에 확인/사용자 입력이 필요한 경우(즉, 사용자가 로그온되어 있지 않은 경우) 대화식으로 작동하지 않는다는 것을 의미합니다.-File지정된 파일을 실행하도록 PowerShell에 지시합니다.사용할 수도 있습니다.-Command대신 어떤 "스트링된" PowerShell 코드를 전달합니다.
스케줄링된 작업 주체 생성
이 단계는 사용자의 로그인 여부와 관계없이 실행될 예약된 작업을 올바르게 생성하기 위한 가장 중요한 단계입니다.실제로 이 단계는 사용자가 로그온했는지 여부에 관계없이 예약된 작업을 실행하도록 구성하는 데 필요합니다.
$TaskPrincipal = New-ScheduledTaskPrincipal -Id 'Author' `
                                            -UserId 'CONTOSO\AppTelemetry' `
                                            -LogonType Password `
                                            -RunLevel Limited
 
이 설정에 대해 좀 더 자세히 알아보겠습니다.
-Id
 
제가 알 수 있는 한, 자유 형식의 텍스트 필드입니다.Task Scheduler GUI에서는 항상 'Author'라는 용어를 사용하지만 일반적으로 여기서 원하는 대로 사용할 수 있습니다.하지만 주의해야 할 점은 예약된 작업에 여러 가지 작업(최대 32개)이 포함될 수 있다는 것입니다.또한 수행에는 수행과 연관된 "맥락"도 있습니다.작업 스케줄러는 컨텍스트를 자동으로 '작성자'에 할당합니다(단순한 단일 작업 작업의 경우).문서에는 예약된 작업에 두 개 이상의 주체를 제공할 수 있음을 나타내는 것으로 보이며, 주체의 ID는 작업의 컨텍스트와 관련되어 작업이 실행될 주체를 결정합니다.싱글 액션 작업은 그냥 '작성자'로 하겠습니다.
-UserId아니면-GroupId
 
태스크는 사용자 계정 또는 지정된 그룹에 속한 모든 사용자 아래에서 실행될 수 있습니다.그룹을 사용할 때는 해당 그룹의 사용자가 로그온한 경우에만 예약된 작업이 실행됩니다.그룹 ID를 사용하면 작업의 암호를 지정할 수 없기 때문입니다.
99의 경우 %를 사용하고  -UserId위에서 한 바와 같이  it 같이  id  qualified  user  fully  to '  a 위에서  be  doesn t  need 한 바와  id  user <nat> <nat>정규화된 사용자 ID일 필요는 없습니다.비밀번호는 본인과 함께 저장하지 않습니다.그것은 나중에 옵니다.
-LogonType
 
이것은 아마도 이 cmdlet의 가장 오해 받는 매개 변수 중 하나일 것입니다.LogonType에 대한 설명서는 상당히 양호합니다.PowerShell의 지원이 아쉽습니다.New-ScheduledTaskPrincipal링크가 되지 않습니다(그것에 대한 피드백을 넣었습니다).
기본적으로, 으로, 은, 가, 입니다, 에 대해 전혀  쓸 입니다.S4U로그온 유형.일부 시나리오에서는 관련이 있을 수 있지만(그래서 존재하는 것입니다), 대부분의 경우에는 하고 싶어할 것입니다. 아마 그렇지 않을 수도 있습니다.
당신은 오직 사용할 것입니다.ServiceAccount NT AUTHORITY\LOCALSYSTEM,NT AUTHORITY\SYSTEM예를 들어 사용자 계정이 있습니다. (세 번째 계정이 있지만 현재 이름은 저를 피합니다.)시스템 계정으로 작업이 실행되지 않기 때문에 원하는 값이 아닙니다.
 하시겠지만,Interactive사용자의 합니다.작업이 GUI 응용 프로그램을 시작해야 하거나 시스템에 대화 상자를 표시하기 위해 작업 작업이 Message Box일 때 유용할 수 있습니다.분명히, 이것은 우리의 경우에 유용하지 않습니다.InteractiveOrPassword유형과  유형을 입니다.이온가는을다한과다한을eh는이sse온,tne과Password 더. 그래서 더 이상은 논의하지 않겠습니다.
그리고 이제, 물론,Password로그온 유형을 선택할 수 있습니다.이것은 암호가 예약된 작업과 함께 저장되며, 이 암호는 사용자가 로그온되었는지 여부에 관계없이 작업을 실행할 수 있도록(배치 작업으로) 사용됩니다.예, 이 값은 Task Scheduler UI에서 Run what user on logoned or not 확인란을 설정하는 결과를 가져옵니다.
-RunLevel
 
이 옵션은 태스크가 상승된 권한으로 실행되어야 하는지 여부를 지정하는 것으로 간주합니다.일부 소프트웨어 설치와 같은 명령을 실행하면 UAC(사용자 액세스 제어)가 실행되고 프로그램이 컴퓨터를 변경하도록 허용할지 묻는 대화 상자가 표시됩니다.당신은 아마 다음을 클릭할 것입니다.Yes심지어 읽지도 않고 반만 있었어요.이개를로정정으로 설정Highest클릭하는 것과 같습니다.YesUAC 대화상자(또는 권한 상승으로 프로세스를 시작하는 것)로 이동합니다.Administrator(관리자)로 실행합니다.이것은 나쁜 일입니다. 당신이 그것이 필요하다는 것을 알지 못하는 한 말이죠.당신은 항상 시작해야 합니다.Limited된 작업이 권한 되지 않는다는elivery., 에  되지  을 합니다  한 된 이  합니다   한 된  을      이       그래서 제가 해온 일입니다.저는 최소한의 특권의 원칙부터 시작하고 있습니다.Limited런 레벨
스케줄링된 작업 트리거 생성
하나 이상의 트리거를 사용하여 예약된 작업을 트리거할 수 있습니다.다양한 트리거 유형이 있습니다.다양한 유형에 대해서는 설명서를 참조하십시오.저는 아주 간단한 것만 하려고 합니다.
$TaskTrigger = New-ScheduledTaskTrigger -Once -At ([DateTime]::Now.AddMinutes(5)) `
                                        -RepetitionInterval ( `
                                            [TimeSpan]::FromMinutes(5) `
                                        )
 
저는 단지 지금부터 5분 후에 한 번 실행하고 그 후에 5분마다 실행되는 작업을 원합니다.
태스크 설정 집합
설정을  지정해야 할   해야   을 하여 을 할   을    할    을            하여     을 을 New-ScheduledTaskSettingsSet. 기본값은 괜찮으니 이만 생략하겠습니다.그러나 Task Scheduler 설명서에서는 이 모든 것을 자세히 설명하고 있으며, 실제로 설정은 대부분의 부분에 대해 설명할 수 있습니다(RunOnlyIfNetworkIsAvailable은 제외하지만 이해하기는 그리 어렵지 않습니다).
스케줄링된 작업 생성
여기서 작업을 생성하고 작업 스케줄러에서 작업을 볼 수 있다고 생각할 수 있습니다.틀렸어.그러나 Scheduled Task 개체를 만듭니다.반드시 이 단계를 수행해야 합니다. 그렇지 않으면 작업이 올바르게 등록되지 않습니다. 가장 중요한 것은 사용자가 로그인했든 하지 않았든 실행으로 설정되지 않는다는 것입니다.
$Task = New-ScheduledTask -Description 'Collects application telemetry' `
                          -Action $TaskAction `
                          -Principal $TaskPrincipal `
                          -Trigger $TaskTrigger
 
여기서 일어나는 모든 일은 우리가 계획된 작업 인스턴스를 만들고 있다는 것입니다.그러나 작업 스케줄러의 작업 목록에 추가되지 않았습니다.그것은 등록이라고 알려져 있고, 우리는 다음에 그것을 할 것입니다.타이핑만 하면.$Task위 명령을 실행한 후 셸에서 작업 이름과 경로가 공백으로 표시됩니다.통화의 일부로 지정할 수도 없습니다.New-ScheduledTask. 다시 말하지만, 이상하게도 그것은 등록 중에 일어납니다.그럼 두 번째로 중요한 부분인 등록에 대해 이야기해 보겠습니다.
스케줄링된 작업 등록
제가 간단하게 다음과 같은 것을 할 수 있다는 것은 사실입니다.
$Task = Register-ScheduledTask -TaskName 'Foo' -TaskPath `\` `
                               -Action $TaskAction -Trigger $TaskTrigger `
                               -User 'SomeUser' -Password '$uper53cr37'
 
그러나 이렇게 하면 대화형으로 실행되는 작업이 발생합니다(사용자가 로그온되어 있을 때만 실행).그리고 이건 우리가 원하는게 아닙니다.이것이 우리가 위의 태스크 주체와 태스크 주체를 포함하는 태스크 인스턴스를 만든 이유입니다.
그럼 작업을 등록해 보겠습니다.
$Task = $Task | Register-ScheduledTask -TaskName 'Collect Telemetry' `
                                       -TaskPath '\Awesome App' `
                                       -User 'CONTOSO\AppTelemetry' `
                                       -Password 'ShhD0ntT3ll4ny0n3!'
 
그래서 보시는 것처럼 암호를 입력해야 합니다.자동화된 방식으로 안전하고 안전하게 작업할 수 있는 방법은 다양하지만 시연용으로는 쉽지 않습니다.(저는 최근에 이 블로그 게시물을 발견했습니다.PowerShell 비밀 관리 무기고에서 또 다른 도구의 개요를 설명하는 비밀 모듈의 사용 방법)여기서 중요한 부분은 사용자와 암호를 제공하는 것입니다.Register-ScheduledTask. 지정한 사용자는 우리가 만든 주체에 지정된 사용자와 동일해야 합니다.그리고 분명히 그 사용자의 암호가 정확해야 합니다.다른 사용자를 사용하여 예약된 작업을 등록하는 경우 작업 등록 시 지정된 사용자 계정을 사용하여 작업을 실행하도록 작업 주체가 업데이트됩니다.(이 문서는 여기에 나와 있습니다.)
사용자가 PowerShell을 사용하여 로그온했는지 여부에 관계없이 실행할 작업을 예약하는 것이 전부입니다.하지만 완료하기 전에 한 가지 더 논의해야 할 주제가 있습니다. 바로 예약된 작업을 업데이트하는 것입니다.
스케줄링된 작업 업데이트
믿거나 말거나, 이것은 생각만큼 간단하지 않습니다.문의 입니다.Set-ScheduledTask정확하게 문서화되어 있지 않습니다.이 예약된 작업의 일부로 어딘가에 파일을 작성해야 하지만 파일을 작성하는 코드가 절대 경로를 사용하지 않는 것으로 가정해 보겠습니다.그래서 작업 디렉토리를 설정해야 하는데 잊어버렸습니다.작업을 수정하고 작업을 업데이트하도록 하겠습니다.
이것이 제대로 하는 방법입니다.사용할 수 있는 다양한 방법이 있습니다.Set-ScheduledTask, 하지만 다른 방법으로 사용자 계정을 잠그거나 아예 작동하지 않을 수 있다는 것을 알게 되었습니다(즉, 오류가 발생함).다른 방법들이 틀렸다는 것은 아니지만, 단지 이런 종류의 변화에 대해서는 이것이 매번 저에게 효과가 있었습니다.
$Task = Get-ScheduledTask -TaskName 'Collect Telemetry' -TaskPath '\Awesome App'
$Task.Actions[0].WorkingDirectory = 'C:\AwesomeApp'
$Task | Set-ScheduledTask -User 'CONTOSO\AppTelemetry' -Password 'ShhD0ntT3ll4ny0n3!'
 
다시 말하지만, 작업을 등록할 때 사용하는 사용자와 암호를 동일하게 사용하는 것이 중요합니다.다른 사용자 이름/비밀번호를 사용하는 경우 태스크 주체도 업데이트됩니다.그건 아마 당신이 원하는게 아닐겁니다.
Powershell에서 스케줄링된 작업을 수행하는 데는 이 정도밖에 되지 않습니다.
사용하다schtasks 도움말을  다음과 같이 .
 
PowerShell을 통해 예약된 작업을 만드는 데 어려움을 겪을 때는 GUI를 통해 로컬 컴퓨터에 비슷한 예약된 작업을 만드는 것도 한 가지 방법입니다.그러면 당신은 사용할 수 있습니다.schtasksGUI를 통해 생성한 스케줄링된 작업을 쿼리하고 PowerShell을 통해 생성한 스케줄링된 작업과 비교합니다.사용방법schtasks, 예를 들어 다음과 같습니다.
# To get the XML for the task:
schtasks /query /tn '\My Task Path\MyTask' /xml ONE
# To get a nice formatted list of the task properties:
schtasks /query /tn '\My Task Path\MyTask' /v /fo LIST
 
 하여 의  된 을 XML  를 사용하여 PowerShell을 통해 예약된 태스크의 XML 표현을 가져올 수 있습니다.Export-ScheduledTask. 여기에서 모든 PowerShell Scheduled Task cmdlet에 대한 설명서를 찾을 수 있습니다.설명서는 괜찮습니다.일부는 오해의 소지가 있으며, 대부분은 불완전합니다(즉, PowerShell cmdlet 자체와는 별도로 작업 스케줄러에 대한 지식이 있다고 가정함).Task Scheduler, COM 인터페이스, XML 스키마 등에 대한 설명서는 여기에서 찾을 수 있습니다.
결론
이 모든 것을 파악하는 데 오랜 시간이 걸렸기 때문에 누군가에게 도움이 되었으면 좋겠습니다.주로 "이 작업이 성공했다고 하는데도 아무 작업도 수행하지 않는 이유는 무엇인가요?" 또는 "왜 계정이 계속 잠기나요?"(잘못된 로그온 유형, 암호, 사용자 권한 할당 또는 모두 3개!)라는 의견이 많습니다.
gui에서 작업을 설정했으면 다음을 실행합니다.
$task = Get-ScheduledTask "test task for notepad"
$task.Principal.LogonType = "Password"
Set-ScheduledTask $task
또한 제어 Run level check:
런 레벨
주체와 연결된 작업을 실행하는 데 필요한 권한 수준을 지정합니다.
예: "최고" 또는 "제한"
매핑된 드라이브에 파일을 복사하기 위해 파워셸에서 예약된 작업을 만들 때도 비슷한 문제가 있었습니다.
제가 해결한 방법은 다음과 같습니다.
먼저 UNC 경로를 사용하여 매핑된 드라이브의 경로를 지정해야 했습니다.
Get-ChildItem -Path "C:\MyFiles\*" -Include *.jpg -Recurse | Copy-Item -Destination "\\192.168.54.20\CopiedFiles"
 
다음으로 아래 명령을 사용하여 예약된 작업을 설정합니다.
$TaskName = "FileSync"
$Description = "This task will run periodically to sync .fin files from a specified source directory to a specified destination directory"
$ScriptPath = "C:\Users\my_userDesktop\file_sync.ps1"
$UserAccount = "COMP1\my_user"
$Action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-ExecutionPolicy Bypass -File $ScriptPath"
$Principal = New-ScheduledTaskPrincipal -UserID $UserAccount -LogonType ServiceAccount
$Trigger = New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Minutes 1) -RepetitionDuration ([System.TimeSpan]::MaxValue)
Register-ScheduledTask -TaskName $TaskName -Action $Action -Description $Description -Trigger $Trigger -Principal $Principal
 
참고: 더$Principal사용자가 로그인했는지 여부에 관계없이 태스크를 실행할 수 있도록 하는 것은 매핑된 드라이브에 동기화되도록 예약된 작업에 매우 중요합니다.
그게 전부입니다.
이게 도움이 됐으면 좋겠습니다.
Windows에서 무슨 일이 일어나고 있는지 확실하지 않지만 해결책을 찾지 못하는 것이 마음에 들지 않습니다. 이 문제가 발생하여 사용자가 SYSTEM을 실행하도록 하여 해결했습니다(사용자 이름 변경 -> 고급 -> 찾기 -> SYSTEM 선택).
그러면 자동으로 "사용자가 로그온하지 않았을 때 실행"으로 예약된 작업이 강제로 수행됩니다. 이후 PS 스크립트를 실행할 수 있습니다.
Windows 11 Pro에서 작동 중인 것으로 테스트했습니다.
[완전한 경로 사용]
언급URL : https://stackoverflow.com/questions/13965997/powershell-set-a-scheduled-task-to-run-when-user-isnt-logged-in
'programing' 카테고리의 다른 글
| 단지 부작용을 위해 목록 이해를 사용하는 것이 피토닉입니까? (0) | 2023.09.06 | 
|---|---|
| 자동 완성 목록에서 VBA 및 HTML로 항목 클릭 (0) | 2023.09.06 | 
| Angular2 클릭 요소 ID (0) | 2023.09.06 | 
| 레코드를 업데이트하는 동안 "ORA-00903: 잘못된 테이블 이름" 오류가 발생했습니다. (0) | 2023.09.01 | 
| mysql 커넥터 오류 1130: 호스트가 이 MySQL 서버에 연결할 수 없습니다. (0) | 2023.09.01 |