[.NET/PoSh] UseUnifiedSchedulingEngine bij Scheduled Task

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • YellowOnline
  • Registratie: Januari 2005
  • Laatst online: 28-03-2023

YellowOnline

BEATI PAVPERES SPIRITV

Topicstarter
Ik heb een script geschreven dat de hele installatie van een server voor zich neemt. Dat klinkt eenvoudiger dan het is, aangezien er verschillende types servers zijn zowel qua hardware, qua schijfindeling als qua rol. het script is af - een kleine 2000 lijnen, wat niet veel is voor een programma, maar voor een script aardig uit de kluiten gewassen - op één detail na: een Scheduled Task. Een Scheduled Task maken op zich is geen probleem, behalve twee settings die niet voorkomen als properties in mijn object (Schedule.Service) en wel noodzakelijk zijn om het script naar behoren te doen functioneren op Windows 2008 R2

Code is Powershell, maar ik gebruik de C# flexer.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
Function Create-ScheduledTask()
    {
    $Service = New-Object -ComObject("Schedule.Service")
    $Service.Connect("localhost")
    $RootFolder = $Service.GetFolder("\")
    $TaskDefinition = $Service.NewTask(0)
    $RegistrationInfo = $TaskDefinition.RegistrationInfo
    $RegistrationInfo.Date = '2011-03-02T08:00:00.000000'
    $RegistrationInfo.Description = 'This task will modify the security on the roaming profiles folder. It will enable inheritance.'
    $RegistrationInfo.Author = "MyDomain\YellowOnline"
    $TaskPrincipal = $TaskDefinition.Principal
    # RunLevel values: * Run with lowest privileges = 0
    #                  * Run with highest privileges = 1
    $TaskPrincipal.RunLevel = 1
    $Settings = $TaskDefinition.Settings
    $Settings.Enabled = $True
    $Settings.StartWhenAvailable = $True
    $Settings.Hidden = $False
    $Settings.ExecutionTimeLimit = "PT1H"
    # MultipleInstances values: * Parallel = 0
    #                           * Queue = 1
    #                           * IgnoreNew = 2
    #                           * StopExisting = 3 
    $Settings.MultipleInstances = 2
    $Settings.DisallowStartIfOnBatteries = $False
    $Settings.StopIfGoingOnBatteries = $False
    $Settings.AllowHardTerminate = $False
    $Settings.StartWhenAvailable = $False
    $Settings.IdleSettings.StopOnIdleEnd = $False
    $Settings.IdleSettings.RestartOnIdle = $False
    $Settings.IdleSettings.WaitTimeOut = $Null
    $Settings.IdleSettings.IdleDuration = $Null
    $Settings.ExecutionTimeLimit = "PT1H"
    #Can't find these properties in Schedule.Service
    #$Settings.DisallowStartOnRemoteAppSession = $False
    #$Settings.UseUnifiedSchedulingEngine = $False
    $Triggers = $TaskDefinition.Triggers
    $Trigger = $triggers.Create(2)
    $Trigger.StartBoundary = "2011-03-29T23:00:10"
    $Trigger.DaysInterval = 1
    $Trigger.Id = "DailyTriggerId"
    $Trigger.Enabled = $True
    $Trigger.ExecutionTimeLimit = "PT4H"
    $Action = $TaskDefinition.Actions.Create(0)
    $Command = 'cmd.exe'
    $CommandArguments = '/c icacls.exe f:\Profiles\* /inheritance:e > C:\Windows\temp\ST_Roaming_Folder.log' 
    $Action.Path = $Command
    $Action.Arguments = $CommandArguments
    #Syntax: http://msdn.microsoft.com/en-us/library/windows/desktop/aa381365%28v=vs.85%29.aspx
    $Rootfolder.RegisterTaskDefinition('Modify security on Roaming Profiles Share', $TaskDefinition, 6, "System", $null , 5)
    }


Het probleem zit 'm in :
C#:
1
2
$Settings.DisallowStartOnRemoteAppSession = $False
$Settings.UseUnifiedSchedulingEngine = $False


Twee properties die niet bestaan in het object. Die zitten namelijk in de ITaskSettings2 property van C:\Windows\system32\taskschd.dll. Helaas kan ik die DLL niet laden. Een collega heeft een Interop DLL gemaakt voor me via Visual Studio, maar daar schiet ik voorlopig niet veel mee op. Die laadt wel ([Reflection.Assembly]::LoadWithPartialname("Interop.TaskScheduler")) maar ik kan geen enkele class enumereren ([enum]::GetNames("Interop.TaskScheduler")) en (dus) ook geen nieuw object aanmaken.

Na wat experimenteren probeerde ik een
C#:
1
 $b = [TaskScheduler.ITaskSettings2]

en voorwaar: geen foutmelding. Maar nu krijg ik een object van het type System.Runtime, wat ook niet is wat ik zoek.

Aangezien ik geen programmeur ben, ben ik nu even mijn weg aan het verliezen in DLL-land. Ik hoop dat iemand met .NET/VB.NET/C# mij hier een handje kan helpen.

PS. De rode lijnen in de code zijn een fout in de lexer waarvan crisp op de hoogte is.

Acties:
  • 0 Henk 'm!

  • YellowOnline
  • Registratie: Januari 2005
  • Laatst online: 28-03-2023

YellowOnline

BEATI PAVPERES SPIRITV

Topicstarter
Schopje

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Waarom zou je niet gewoon schtasks aanroepen met wat gegenereerde xml zoals hier?

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • YellowOnline
  • Registratie: Januari 2005
  • Laatst online: 28-03-2023

YellowOnline

BEATI PAVPERES SPIRITV

Topicstarter
pedorus schreef op zaterdag 03 maart 2012 @ 21:47:
Waarom zou je niet gewoon schtasks aanroepen met wat gegenereerde xml zoals hier?
Eerder uit principe dat ik niet graag externe executables aanroep. Ik kan de scheduled task via de GUI maken, exporteren naar XML en dan de XML via schtasks.exe importeren en doel is inderdaad bereikt. Maar voor de stabiliteit van mijn scripts heb ik liefst zo min mogelijk dependencies (al is een dll aanroepen dat ook natuurlijk).

't Is meer een geval van ik wil het voor elkaar krijgen via code. Enige maanden geleden had ik een gelijkaardig probleem met permissions waarbij iedereen iets had van "gebruik dan toch gewoon icacls.exe", maar ik ben best fier dat ik het met PoSh voor elkaar gekregen heb (en een hoop bloed, zweet en tranen).

Edit: Bij gebrek aan oplossing heb ik het maar met de .exe gedaan zodat ik 'mn tijd in iets anders kan steken :(

[ Voor 6% gewijzigd door YellowOnline op 05-03-2012 09:59 ]