mirror of
https://github.com/hakril/PythonForWindows
synced 2026-06-08 14:31:45 +00:00
92 lines
3.1 KiB
Python
92 lines
3.1 KiB
Python
import pytest
|
|
import subprocess
|
|
import os.path
|
|
|
|
import windows
|
|
import windows.generated_def as gdef
|
|
|
|
SCHTASKS = r"c:\Windows\System32\schtasks.exe"
|
|
|
|
task_scheduler = windows.system.task_scheduler
|
|
|
|
def do_schtasks(*args):
|
|
return subprocess.check_output([SCHTASKS] + list(args))
|
|
|
|
# /SC MONTHLY allows to create the task without admin privileges
|
|
def schtasks_create_task(taskname, binary, sc="MONTHLY"):
|
|
return do_schtasks("/create", "/tn", taskname, "/tr", binary, "/sc", sc)
|
|
|
|
def schtasks_delete_task(taskname):
|
|
return do_schtasks("/delete", "/tn", taskname, "/f")
|
|
|
|
def schtasks_task_exists(taskname):
|
|
try:
|
|
return do_schtasks("/query", "/tn", taskname)
|
|
except subprocess.CalledProcessError as e:
|
|
if e.returncode == 1:
|
|
return False
|
|
raise
|
|
|
|
SCHEDULED_TASK_PARAMS = [
|
|
{"DIR": "", "NAME": "PFW_TEST1", "PATH": r'"c:\windows\system32\notepad.exe"', "ARGS": "PFW_TEST_PARAM.txt"},
|
|
# Test in subdir
|
|
{"DIR": "PFW_TEST_DIR", "NAME": "PFW_TEST1", "PATH": r'"c:\windows\system32\notepad.exe"', "ARGS": "PFW_TEST_PARAM.txt"}
|
|
]
|
|
|
|
|
|
@pytest.fixture(params=SCHEDULED_TASK_PARAMS)
|
|
def sheduled_task(request):
|
|
descr = request.param
|
|
fullpath = os.path.join(descr["DIR"], descr["NAME"])
|
|
full_binary = "{0} {1}".format(descr["PATH"], descr["ARGS"])
|
|
schtasks_create_task(fullpath, full_binary)
|
|
yield descr
|
|
schtasks_delete_task(fullpath)
|
|
if descr["DIR"]:
|
|
schtasks_delete_task(descr["DIR"])
|
|
|
|
|
|
def test_list_simple_task(sheduled_task):
|
|
# taskdir = os.path.dirname(sheduled_task)
|
|
# taskname = os.path.basename(sheduled_task)
|
|
print(sheduled_task)
|
|
if sheduled_task["DIR"]:
|
|
tdir = windows.system.task_scheduler(sheduled_task["DIR"])
|
|
else:
|
|
tdir = windows.system.task_scheduler.root
|
|
task = tdir[sheduled_task["NAME"]]
|
|
assert task.name == sheduled_task["NAME"]
|
|
triggers = task.definition.triggers
|
|
assert len(list(triggers)) == 1
|
|
assert triggers[1].type == gdef.TASK_TRIGGER_MONTHLY
|
|
actions = task.definition.actions
|
|
assert len(list(actions)) == 1
|
|
assert actions[1].type == gdef.TASK_ACTION_EXEC
|
|
assert actions[1].path == sheduled_task["PATH"]
|
|
assert actions[1].arguments == sheduled_task["ARGS"]
|
|
|
|
|
|
@pytest.mark.parametrize("taskdict", SCHEDULED_TASK_PARAMS)
|
|
def test_create_delete_task(taskdict):
|
|
tsched = tdir = windows.system.task_scheduler
|
|
# Check task does not exists
|
|
assert not schtasks_task_exists(os.path.join(taskdict["DIR"], taskdict["NAME"]))
|
|
# Create Task
|
|
if taskdict["DIR"]:
|
|
tdir = windows.system.task_scheduler.root.create_folder(taskdict["DIR"])
|
|
else:
|
|
tdir = windows.system.task_scheduler.root
|
|
ntd = tsched.create()
|
|
actions = ntd.actions
|
|
nea = actions.create(gdef.TASK_ACTION_EXEC)
|
|
nea.path = taskdict["PATH"]
|
|
nea.arguments = taskdict["ARGS"]
|
|
tdir.register(taskdict["NAME"], ntd)
|
|
# Check task presence
|
|
assert schtasks_task_exists(os.path.join(taskdict["DIR"], taskdict["NAME"]))
|
|
# Delete task
|
|
del tdir[taskdict["NAME"]]
|
|
if taskdict["DIR"]:
|
|
tdir = windows.system.task_scheduler.root.delete_folder(taskdict["DIR"])
|
|
|
|
# Test COM tasks ? |