Quantcast
Channel: Task Scheduler Managed Wrapper
Viewing all 2206 articles
Browse latest View live

Updated Wiki: TaskSecurity

$
0
0

Security Explanations and Samples

Below are some discussions and sample code related to the following tasks:

Connecting to a remote server or local server with different credentials

Connecting to both a local and a remote server to manage tasks is done through the TaskService constructor.
public TaskService(
   // The name of the computer that you want to connect to. If the this parameter is// null or empty, then this will connect to the local computer.string targetServer,
   // The user name that is used during the connection to the computer. If the user// is not specified, then the current token is used.string userName = null,
   // The domain of the user specified in the userName parameter.string accountDomain = null,
   // The password that is used to connect to the computer. If the user name and// password are not specified, then the current token is used.string password = null,
   // If set to true force Task Scheduler 1.0 compatibility and disallow 2.0// functionality.bool forceV1 = false
)
In calling the constructor, there are some settings to note:
  • Either do not use the last boolean parameter (as in the example below) or set the value to 'false' to make sure that the newest version of the library is used.
  • Do not put backslashes in front of the server name.
  • If calling this method from within code, make sure that UAC or IIS settings aren't preventing your full rights from being available.
// Connect to the computer "REMOTE" using credentials
TaskService ts = new TaskService("REMOTE", "myusername", "MYDOMAIN", "mypassword");
There are some important security considerations too:
  • By default, to schedule a task, you must be a member of the Administrators, Backup Operators, or Server Operators group on the local computer.
  • By default, when creating a scheduled task, you cannot enter a user who belongs to a group that has more rights than the group you belong to.
  • By default, a user who creates a task can read, update, delete, and run the task.
  • Members of the Administrators group or the SYSTEM account can read, update, delete, and run any tasks. Members of the Users group, the LocalService account, and the NetworkService account can only read, update, delete, and run the tasks that they have created.
  • If you are connecting to a remote computer running Windows Vista or Windows Server 2008 from a computer running Windows Vista or Windows Server 2008, you need to enable the Remote Scheduled Tasks Management firewall exception on the remote computer. To allow this exception click Start , Control Panel , Security , Allow a program through Windows Firewall , and then select the Remote Scheduled Tasks Management check box. Then click the Ok button in the Windows Firewall Settings dialog box.
  • If you are connecting to a remote computer running Windows XP or Windows Server 2003 from a computer running Windows Vista or Windows Server 2008, you need to allow the File and Printer Sharing firewall exception on the remote computer. To allow this exception click Start , Control Panel , double-click Windows Firewall , select the Exceptions tab, and then select the File and Printer Sharing firewall exception. Then click the Ok button in the Windows Firewall dialog box.

Creating tasks that run as a system account

If you have the permissions (see above) to create a task for the desired system account, you can do so by registering it with that well-known account name ("SYSTEM" in the example below) and using the TaskLogonType.ServiceAccount value for the logonType parameter. You must set the password parameter to null.

This is a common model for running tasks that interact only with the system non-interactively and is generally required whenever using Triggers that run based on system events (boot, events, system state changes).
ts.RootFolder.RegisterTaskDefinition("TaskName", taskDefinition, TaskCreation.CreateOrUpdate,
   "SYSTEM", null, TaskLogonType.ServiceAccount);

Creating tasks that run as a different user

The only way to run a task as a user other than the one specified when instantiating the TaskService (or the current user if calling the default TaskService constructor), is to specify the user credentials, password and using the TaskLogonType.Password value for the logonType parameter. When registered
ts.RootFolder.RegisterTaskDefinition("TaskName", taskDefinition, TaskCreation.CreateOrUpdate,
   "userDomain\\userName", "userPassword", TaskLogonType.Password);

Running tasks with Administrator rights that ignore UAC warnings

Applications running from the Desktop in Windows Vista and later run under an access controlled environment unless specifically run "as Administrator" even if the user has Administrator rights. If you are getting Access Denied errors when registering tasks, this is often the cause.

To run tasks in a heightened security mode, you must set the Task.Definition.Principal.RunLevel to Highest. If a task is registered using the Builtin\Administrator account or the Local System or Local Service accounts, then the RunLevel property will be ignored. The property value will also be ignored if User Account Control (UAC) is turned off.

If a task is registered using the Administrators group for the security context of the task, then you must also set the RunLevel property to Highest if you want to run the task.
TaskDefinition td = ts.NewTask();
td.Principal.RunLevel = TaskRunLevel.Highest;
// Set trigger and action and other properties...
ts.RootFolder.RegisterTaskDefinition("Test", td);

Updated Wiki: TaskSecurity

$
0
0

Security Explanations and Samples

Below are some discussions and sample code related to the following tasks:

Connecting to a remote server or local server with different credentials

Connecting to both a local and a remote server to manage tasks is done through the TaskService constructor.
public TaskService(
   // The name of the computer that you want to connect to. If the this parameter is// null or empty, then this will connect to the local computer.string targetServer,
   // The user name that is used during the connection to the computer. If the user// is not specified, then the current token is used.string userName = null,
   // The domain of the user specified in the userName parameter.string accountDomain = null,
   // The password that is used to connect to the computer. If the user name and// password are not specified, then the current token is used.string password = null,
   // If set to true force Task Scheduler 1.0 compatibility and disallow 2.0// functionality.bool forceV1 = false
)
In calling the constructor, there are some settings to note:
  • Either do not use the last boolean parameter (as in the example below) or set the value to 'false' to make sure that the newest version of the library is used.
  • Do not put backslashes in front of the server name.
  • If calling this method from within code, make sure that UAC or IIS settings aren't preventing your full rights from being available.
// Connect to the computer "REMOTE" using credentials
TaskService ts = new TaskService("REMOTE", "myusername", "MYDOMAIN", "mypassword");
There are some important security considerations too:
  • By default, to schedule a task, you must be a member of the Administrators, Backup Operators, or Server Operators group on the local computer.
  • By default, when creating a scheduled task, you cannot enter a user who belongs to a group that has more rights than the group you belong to.
  • By default, a user who creates a task can read, update, delete, and run the task.
  • Members of the Administrators group or the SYSTEM account can read, update, delete, and run any tasks. Members of the Users group, the LocalService account, and the NetworkService account can only read, update, delete, and run the tasks that they have created.
  • If you are connecting to a remote computer running Windows Vista or Windows Server 2008 from a computer running Windows Vista or Windows Server 2008, you need to enable the Remote Scheduled Tasks Management firewall exception on the remote computer. To allow this exception click Start , Control Panel , Security , Allow a program through Windows Firewall , and then select the Remote Scheduled Tasks Management check box. Then click the Ok button in the Windows Firewall Settings dialog box.
  • If you are connecting to a remote computer running Windows XP or Windows Server 2003 from a computer running Windows Vista or Windows Server 2008, you need to allow the File and Printer Sharing firewall exception on the remote computer. To allow this exception click Start , Control Panel , double-click Windows Firewall , select the Exceptions tab, and then select the File and Printer Sharing firewall exception. Then click the Ok button in the Windows Firewall dialog box.

Creating tasks that run as a system account

If you have the permissions (see above) to create a task for the desired system account, you can do so by registering it with that well-known account name ("SYSTEM" in the example below) and using the TaskLogonType.ServiceAccount value for the logonType parameter. You must set the password parameter to null.

This is a common model for running tasks that interact only with the system non-interactively and is generally required whenever using Triggers that run based on system events (boot, events, system state changes).
ts.RootFolder.RegisterTaskDefinition("TaskName", taskDefinition,
   TaskCreation.CreateOrUpdate, "SYSTEM", null,
   TaskLogonType.ServiceAccount);

Creating tasks that run as a different user

The only way to run a task as a user other than the one specified when instantiating the TaskService (or the current user if calling the default TaskService constructor), is to specify the user credentials, password and using the TaskLogonType.Password value for the logonType parameter. When registered
ts.RootFolder.RegisterTaskDefinition("TaskName", taskDefinition,
   TaskCreation.CreateOrUpdate, "userDomain\\userName", "userPassword",
   TaskLogonType.Password);

Running tasks with Administrator rights that ignore UAC warnings

Applications running from the Desktop in Windows Vista and later run under an access controlled environment unless specifically run "as Administrator" even if the user has Administrator rights. If you are getting Access Denied errors when registering tasks, this is often the cause.

To run tasks in a heightened security mode, you must set the Task.Definition.Principal.RunLevel to Highest. If a task is registered using the Builtin\Administrator account or the Local System or Local Service accounts, then the RunLevel property will be ignored. The property value will also be ignored if User Account Control (UAC) is turned off.

If a task is registered using the Administrators group for the security context of the task, then you must also set the RunLevel property to Highest if you want to run the task.
TaskDefinition td = ts.NewTask();
td.Principal.RunLevel = TaskRunLevel.Highest;
// Set trigger and action and other properties...
ts.RootFolder.RegisterTaskDefinition("Test", td);

Created Unassigned: System.NullReferenceException exception in web service call task [11850]

$
0
0
I wrote an c# console app which calls web service.
I needed to run this app for every night, so I decided to use this task scheduler as it seems a good one to do my job.

But I got an issue which says "Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object. ..."
I read many articles described about same issue, but nothing is helpful.

For example,

```
TaskDefinition td = ts.NewTask();
td.RegistrationInfo.Description = "Does something";
td.Principal.Id = "any string";
td.Principal.GroupId = "NETWORK SERVICE";
td.Principal.RunLevel = TaskRunLevel.LUA;
td.Principal.LogonType = TaskLogonType.S4U;
ts.RootFolder.RegisterTaskDefinition(@"NetsuiteInvoiceGetTask", td);
```

My OS is Windows7 64bit.
Can anyone help me? Thanks.

Commented Unassigned: System.NullReferenceException exception in web service call task [11850]

$
0
0
I wrote an c# console app which calls web service.
I needed to run this app for every night, so I decided to use this task scheduler as it seems a good one to do my job.

But I got an issue which says "Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object. ..."
I read many articles described about same issue, but nothing is helpful.

For example,

```
TaskDefinition td = ts.NewTask();
td.RegistrationInfo.Description = "Does something";
td.Principal.Id = "any string";
td.Principal.GroupId = "NETWORK SERVICE";
td.Principal.RunLevel = TaskRunLevel.LUA;
td.Principal.LogonType = TaskLogonType.S4U;
ts.RootFolder.RegisterTaskDefinition(@"NetsuiteInvoiceGetTask", td);
```

My OS is Windows7 64bit.
Can anyone help me? Thanks.
Comments: ** Comment from web user: dahall **

At what line are you getting the exception? Some other things: RunLevel defaults to LUA. TaskLogonType.S4U is reserved for user accounts. I, personally, would eliminate the GroupID, RunLevel and LogonType lines from your code and just call the RegisterTaskDefinition as outlined [here](https://taskscheduler.codeplex.com/wikipage?title=TaskSecurity&referringTitle=Documentation#system).

Commented Unassigned: System.NullReferenceException exception in web service call task [11850]

$
0
0
I wrote an c# console app which calls web service.
I needed to run this app for every night, so I decided to use this task scheduler as it seems a good one to do my job.

But I got an issue which says "Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object. ..."
I read many articles described about same issue, but nothing is helpful.

For example,

```
TaskDefinition td = ts.NewTask();
td.RegistrationInfo.Description = "Does something";
td.Principal.Id = "any string";
td.Principal.GroupId = "NETWORK SERVICE";
td.Principal.RunLevel = TaskRunLevel.LUA;
td.Principal.LogonType = TaskLogonType.S4U;
ts.RootFolder.RegisterTaskDefinition(@"NetsuiteInvoiceGetTask", td);
```

My OS is Windows7 64bit.
Can anyone help me? Thanks.
Comments: ** Comment from web user: richardk1031 **

Thanks for your post, but still doesn't work.
I tested 2 cases:
1) This doesn't run task.

```
TaskDefinition td = ts.NewTask();
td.RegistrationInfo.Description = "Does something";
ts.RootFolder.RegisterTaskDefinition("TaskName", taskDefinition,
TaskCreation.CreateOrUpdate, "SYSTEM", null,
TaskLogonType.ServiceAccount);
```

2) System.NullReferenceException

```
TaskDefinition td = ts.NewTask();
td.Principal.RunLevel = TaskRunLevel.Highest;
// Set trigger and action and other properties...
ts.RootFolder.RegisterTaskDefinition("Test", td);
```
My console app uses Netsuite webservice and taskeng.exe says that issue occurs in line 524.
(Screenshot attached)

```
522 System.Uri originalUri = new System.Uri(this.Url);
523 DataCenterUrls urls = getDataCenterUrls(account).dataCenterUrls;
524 Uri dataCenterUri = new Uri(urls.webservicesDomain + originalUri.PathAndQuery);
525 this.Url = dataCenterUri.ToString();

```
__Here__
this.Url = {https://webservices.netsuite.com/services/NetSuitePort_2013_2}
urls.webservicesDomain = "https://webservices.na1.netsuite.com"
originalUri.PathAndQuery = "/services/NetSuitePort_2013_2"

I think to try with
ts.RootFolder.RegisterTaskDefinition("TaskName", taskDefinition,
TaskCreation.CreateOrUpdate, "userDomain\\userName", "userPassword",
TaskLogonType.Password)

But don't know how to give parameters - "userDomain\\userName", "userPassword".
Would you help?

Commented Unassigned: System.NullReferenceException exception in web service call task [11850]

$
0
0
I wrote an c# console app which calls web service.
I needed to run this app for every night, so I decided to use this task scheduler as it seems a good one to do my job.

But I got an issue which says "Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object. ..."
I read many articles described about same issue, but nothing is helpful.

For example,

```
TaskDefinition td = ts.NewTask();
td.RegistrationInfo.Description = "Does something";
td.Principal.Id = "any string";
td.Principal.GroupId = "NETWORK SERVICE";
td.Principal.RunLevel = TaskRunLevel.LUA;
td.Principal.LogonType = TaskLogonType.S4U;
ts.RootFolder.RegisterTaskDefinition(@"NetsuiteInvoiceGetTask", td);
```

My OS is Windows7 64bit.
Can anyone help me? Thanks.
Comments: ** Comment from web user: dahall **

If the exception occurs on line 524, then it is happening with either "urls" or "originalUri" and not anything to do with task registration. Something else to be aware of, you need to connect to the TaskService using credentials that can create tasks. See [this link](https://taskscheduler.codeplex.com/wikipage?title=TaskSecurity&referringTitle=Documentation#remote) for information on connecting using a known account with permissions.

Source code checked in, #91368

$
0
0
* Lots of documentation updates * Added editor for EventTrigger subscription queries and associated support methods and controls

Released: Release 2.2.1 (Sep 09, 2014)

$
0
0
Some bug fixes, better support for Windows 8 additions to core library, addition of Fluent syntax, and crontab syntax, since the 1.9.4 release. Since 2.0.3 release, added support for .NET 2.0 and 4.0, security handling, version compatibility handling (for connecting to up or down-stream versions), bug fixes, enhancements to history control and event trigger editor, compensation for deprecated email and message actions on Win8, and improved performance and marshalling. SeeSource Code for full details of changes.

Download Descriptions
  • TaskScheduler.zip - Includes the base library (Microsoft.Win32.TaskScheduler.dll) with no UI code. Works with .NET 2.0 and higher. Separate assemblies for .NET 2.0 and 4.0. Add this assembly as a reference to interact with Task Scheduler on all systems with IE4 and later. This package is also available via NuGet with package name TaskScheduler.
  • TaskSchedulerEditor.zip - Includes the UI library (Microsoft.Win32.TaskSchedulerEditor.dll) with all supporting assemblies. Works with .NET 2.0 and higher. Separate assemblies for .NET 2.0 and 4.0. Add this assembly as a reference along with Microsoft.Win32.TaskScheduler.dll to get editor controls and dialogs that allow for viewing and editing tasks, triggers, actions, lists, etc. This package is also available viaNuGet with package nameTaskSchedulerEditor.
  • TaskSchedulerHelp.zip - Includes the Microsoft Help compatible help files for both the base and editor libraries. Extract all files and then run Install_TaskScheduler.bat to integrate the help.

Updated Release: Release 2.2.1 (Sep 09, 2014)

$
0
0
Some bug fixes, better support for Windows 8 additions to core library, addition of Fluent syntax, and crontab syntax, since the 1.9.4 release. Since 2.0.3 release, added support for .NET 2.0 and 4.0, security handling, version compatibility handling (for connecting to up or down-stream versions), bug fixes, enhancements to history control and event trigger editor, compensation for deprecated email and message actions on Win8, and improved performance and marshalling. See Source Code for full details of changes.

Download Descriptions
  • TaskScheduler.zip - Includes the base library (Microsoft.Win32.TaskScheduler.dll) with no UI code. Works with .NET 2.0 and higher. Separate assemblies for .NET 2.0 and 4.0. Add this assembly as a reference to interact with Task Scheduler on all systems with IE4 and later. This package is also available via NuGet with package name TaskScheduler.
  • TaskSchedulerEditor.zip - Includes the UI library (Microsoft.Win32.TaskSchedulerEditor.dll) with all supporting assemblies. Works with .NET 2.0 and higher. Separate assemblies for .NET 2.0 and 4.0. Add this assembly as a reference along with Microsoft.Win32.TaskScheduler.dll to get editor controls and dialogs that allow for viewing and editing tasks, triggers, actions, lists, etc. This package is also available via NuGet with package name TaskSchedulerEditor.
  • TaskSchedulerHelp.zip - Includes the Microsoft Help compatible help files for both the base and editor libraries. Extract all files and then run Install_TaskScheduler.bat to integrate the help.

Created Unassigned: Doesn't allow remote unless force v1 not specify credentials [11860]

$
0
0
Hi, I have domain admin permissions.

I can create tasks on the remote machine using the Task Scheduler GUI.

When I use the TaskService class and create a new instance, I specify the remote server ONLY and do not specify credentials and it gives me an access denied exception.

If I explicitly hard code my username, domain and password it works fine, however this is not ideal.

If I do not specify my credentials and leave it blank, so it uses the current token (which is the same account as the one I typed in mind you) it does not work unless I force it to v1.

I need the email send feature so forcing to v1 is not acceptable. Why is it forcing me to enter a username and password for the account that is already running the process?

New Post: Allows remote task creation when forcev1 = true ONLY

$
0
0
Hello,

I am using Windows 7 computer, .NET 4.0 application running as administrator.

Now the process is running using MyUserAccount and from this account I can connect to computer MyRemoteComputer using the Task Scheduler GUI that comes with Windows 7 and I can create Windows 7 compatible tasks (>v1) using the GUI.

Now if I use new TaskService(MyRemoteComputer) it fails with an access denied exception. If I call TaskService(MyRemoteComputer,MyUserAccount,MyDomain,MyPassword, false) same thing. If however I cange false to true (so force v1) it works!

I can also call TaskService(MyRemoteComputer,null,null,null,true) and that works as well so it is not an issue with credentials as you can see it is successfully creating a v1 task remotely, so why will it not allow v2 given that MyRemoteComputer is WIndows 7 and I can do this via the GUI?

Closed Unassigned: Delete found Forum Trying there first [11860]

$
0
0
Delete found Forum Trying there first

New Post: Allows remote task creation when forcev1 = true ONLY

$
0
0
Look in the Documentation area for information on connecting and how permissions work with UAC and within containers like ASP.NET. I think you may find your answer there.

New Post: Allows remote task creation when forcev1 = true ONLY

$
0
0
Hello, I had a look however I am not using IIS, I have a WPF application, and the process is not being interrupted by UAC definitely.

Also it works if I forcev1.

So I can't see any reason why it would allow connection forced as v1 but not as newer? I have looked at the documentation, what reason can there possibly be to only allow legacy connection? Especially as I can remote to computer using the GUI and create tasks that send emails manually, I clearly have permission so why is your code giving me an access denied exception?

New Post: Allows remote task creation when forcev1 = true ONLY

$
0
0
Have you tried launching the process using the "Run as Administrator" for either the actual .EXE or launching Visual Studio that way and then running your process? Let me know what errors you see when you run it that way.

New Post: Allows remote task creation when forcev1 = true ONLY

$
0
0
V1 and V2 have completely different connection models at the core Microsoft library level. This wrapper library hides those differences. The forceV1 parameter literally forks the code to run a V1 connection routine.

New Post: Allows remote task creation when forcev1 = true ONLY

$
0
0
dahall wrote:
Have you tried launching the process using the "Run as Administrator" for either the actual .EXE or launching Visual Studio that way and then running your process? Let me know what errors you see when you run it that way.
Yes I had done, but I found what the issue is today.

The McAfee firewall that we are using seems to block v2 requests from my code! It allows v1 fine but not newer!

If I disable the firewall (or create a rule) then it works, so this is interesting why McAfee will allow v1 connection but not v2!

Anyway at least I now know the problem thanks!

New Post: RegisterTaskDefinition throws 0x80070005 (E_ACCESSDENIED) exception

$
0
0
Hi,

I have the following scenario:
  • Windows 8, 7 and Vista
  • Computer: PC1234
  • User: John
  • Admin: Admin
My application requires admin rights, so if my app is started from John, it runs as Admin.

If run the code to add a task to the task scheduler, the task is added for Admin and not for John.

So I tried the following code to add the task for John:
using (TaskService ts = new TaskService())
            {

                var task = ts.FindTask("TEST");
                if (task != null)
                    ts.RootFolder.DeleteTask("TEST");

                                 TaskDefinition td = ts.NewTask();
                    td.RegistrationInfo.Description = "Daily shutdown";

                    // Create a trigger that will fire the task at this time every other day
                    var now = DateTime.Now;
                    var timeSpan = TimeSpan.Parse(ConvertedValue as string);
                    var dateTime = new DateTime(now.Year, now.Month, now.Day, timeSpan.Hours, timeSpan.Minutes, 0);
                    td.Triggers.Add(new DailyTrigger { DaysInterval = 1, StartBoundary = dateTime });

                    td.Actions.Add(new ExecAction("shutdown", "/s", null));

                    td.Settings.ExecutionTimeLimit = TimeSpan.FromMinutes(15); // also tried without this line
                    td.Principal.RunLevel = TaskRunLevel.LUA; // also tried Highest
                    td.Principal.LogonType = TaskLogonType.S4U; // also tried without this line
                    td.Principal.UserId = @"PC1234\John"; // also tried without this line

                    // Register the task in the root folder
                    var folder = ts.RootFolder.CreateFolder("Testfolder"); // also tried directly to add the task to RootFolder
                    folder.RegisterTaskDefinition("TEST", td, TaskCreation.CreateOrUpdate, @"PC1234\John");
                

            }
If I remove the "PC1234\John", everything is working without an error, but the task is added for Admin. If I add the user name, I got the access denied exception.

As you can see, I tried all suggestions from this forum, to fix this (custom folder, execution time, etc.).

How can I fix this? I searched the whole forum, but all tips are not working.

Best regards,
Sascha

New Post: RegisterTaskDefinition throws 0x80070005 (E_ACCESSDENIED) exception

$
0
0
Glad you got it. Another options is to remove the 3 lines where you set td.Principal properties and then supply all the parameters to the RegisterTaskDefinition method, including the password and the S4U logon type.

Released: Release 2.2.1 (Sep 09, 2014)

$
0
0
Some bug fixes, better support for Windows 8 additions to core library, addition of Fluent syntax, and crontab syntax, since the 1.9.4 release. Since 2.0.3 release, added support for .NET 2.0 and 4.0, security handling, version compatibility handling (for connecting to up or down-stream versions), bug fixes, enhancements to history control and event trigger editor, compensation for deprecated email and message actions on Win8, and improved performance and marshalling. SeeSource Code for full details of changes.

Download Descriptions
  • TaskScheduler.zip - Includes the base library (Microsoft.Win32.TaskScheduler.dll) with no UI code. Works with .NET 2.0 and higher. Separate assemblies for .NET 2.0 and 4.0. Add this assembly as a reference to interact with Task Scheduler on all systems with IE4 and later. This package is also available via NuGet with package name TaskScheduler.
  • TaskSchedulerEditor.zip - Includes the UI library (Microsoft.Win32.TaskSchedulerEditor.dll) with all supporting assemblies. Works with .NET 2.0 and higher. Separate assemblies for .NET 2.0 and 4.0. Add this assembly as a reference along with Microsoft.Win32.TaskScheduler.dll to get editor controls and dialogs that allow for viewing and editing tasks, triggers, actions, lists, etc. This package is also available viaNuGet with package nameTaskSchedulerEditor.
  • TaskSchedulerHelp.zip - Includes the Microsoft Help compatible help files for both the base and editor libraries. Extract all files and then run Install_TaskScheduler.bat to integrate the help.
Viewing all 2206 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>