>

문제는 모두 제목에있다. 시스템 작업 스케줄러에서 실행할 작업을 등록하려고합니다. 내 코드의이 부분에 주석을 달면 :

HRESULT hr = taskDefinition->get_Principal(&taskSecuritySettings);
if (SUCCEEDED(hr))
    hr = taskSecuritySettings->put_RunLevel(TASK_RUNLEVEL_HIGHEST);

작업 등록이 예상대로 작동합니다. 주석 처리를 제거하면 "액세스가 거부되었습니다"오류와 함께 실패합니다. 작업 등록 코드는 다음과 같습니다.

  const HRESULT hr = taskFolder->RegisterTaskDefinition(
      _bstr_t(defaultTaskName), taskDefinition,
      TASK_CREATE_OR_UPDATE, username, password,
      logonType,
      _variant_t(L""),
      registeredTask
   );

여기서 로그온 유형은 일반적으로 TASK_LOGON_INTERACTIVE_TOKEN_OR_PASSWORD입니다. TASK_LOGON_PASSWORD 또는 TASK_LOGON_INTERACTIVE_TOKEN으로 변경해도 아무런 변화가 없습니다.

제공하는 사용자/암호는 로컬 관리자입니다. 관리자 계정을 사용하면 동일한 결과가 나타납니다. 사용자/암호를 사용하지 않고 TASK_LOGON_NONE을 사용하면 동일한 결과를 얻을 수 있습니다.

어떤 아이디어?


  • 답변 # 1

    문제는 API 사용이 아니라 실행 권한에있었습니다. TASK_RUNLEVEL_HIGHEST로 성공적으로 실행하려면 관리자 권한으로 실행해야합니다.

    이 동작은 Microsoft 설명서에서 찾을 수 있습니다. https://docs.microsoft.com/en-us/windows/desktop/taskschd/security-contexts-for-running-tasks

관련 자료

  • 이전 스위프트 - 바이트 배열에서 임의의 기본 문자열 만들기
  • 다음 github - 힘내, 치명적 - 원격 끝이 예기치 않게 끊어졌습니다