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.
Het probleem zit 'm in :
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
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.
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.