C# Windows 用户的服务打开文件
C# Windows Service Opening File For User
这是我第一次创建 windows 服务,我正在尝试为当前 登录用户 [=80= 打开一个 可执行文件 ],虽然服务是 运行ning 作为 Local Service, 或 Local System, 但我遇到的是 Executable 运行s 作为 SYSTEM 用户但不显示给 User 我的意思是该进程是 运行 在 SYSTEM 用户下,没有显示 Window 登录用户.
如果我的windows服务运行宁作为本地服务,那么可执行文件能够运行。任务管理器中没有生命迹象。
我已经尝试查找我的问题并尝试了这些解决方案:
- Process.Start("文件名");
- File.Open("文件名", FileMode.Open);什么都没做! (任务管理器中没有生命迹象)
- ProcessStartInfo("FileName") with Verb = "运行 as";没有改变任何东西(运行 作为 SYSTEM)
- 尝试了来自命令提示符的 shell 命令:Process.Start("运行 as (忘记了我输入的整个命令行)");什么都没做! (任务管理器中没有生命迹象)
- ProcessStartInfo("FileName") with Username = "User" without Password;什么都没做! (任务管理器中没有生命迹象)
我确实认为解决方案 4 和 5 不起作用,因为需要 密码,但根据 Microsoft Post 关于 Local System 它说 SYSTEM 不需要 Password 来访问 User (Impersonation),但我不明白 Impersonation 到底是什么,它似乎用 [=25 做了一些事情=]赢得 API 本地人.
我认为 可执行文件 Window 实际上显示给 SYSTEM 当 可执行文件 是运行ning。不是当前登录的用户.
现在:
- 如果没有 WinAPI Natives,是否有解决我的问题的解决方案?
- 如果需要Natives,能不能也给我解释一下?什么时候 post 输入代码?我只了解 Handles of WinAPI 这就是我真正了解的。
- 这在 本地系统 运行ning 服务上是否可行?至于我的服务重点是做系统管理?而不是 Local Service.
- 是否可以在 C# 编程语言 中完成所有这些?
PS: 我正在从事的项目是我公司的系统管理工具包。对于未来的项目。
PS2: 如果你需要更多信息告诉我,我会查看这个post 经常.
PS3: 如果您看到任何语法错误,请原谅我的英语。
解决方案代码:
using (TaskService taskService = new TaskService())
{
TaskDefinition taskDefinition = taskService.NewTask();
taskDefinition.RegistrationInfo.Description = "Does something";
taskDefinition.RegistrationInfo.Author = "SYSTEM";
taskDefinition.Principal.DisplayName = "Testing Display Task Name C#";
taskDefinition.Principal.RunLevel = TaskRunLevel.Highest;
taskDefinition.Principal.GroupId = "Administrators";
taskDefinition.Principal.UserId = "ACCOUNT";
taskDefinition.Principal.LogonType = TaskLogonType.InteractiveToken;
taskDefinition.Settings.AllowDemandStart = true;
taskDefinition.Settings.AllowHardTerminate = true;
taskDefinition.Settings.DisallowStartIfOnBatteries = false;
taskDefinition.Settings.DisallowStartOnRemoteAppSession = true;
taskDefinition.Settings.Hidden = false;
taskDefinition.Settings.RestartCount = 0;
taskDefinition.Settings.RunOnlyIfIdle = false;
taskDefinition.Settings.RunOnlyIfNetworkAvailable = false;
taskDefinition.Settings.StartWhenAvailable = true;
taskDefinition.Settings.StopIfGoingOnBatteries = false;
taskDefinition.Settings.Volatile = false;
taskDefinition.Settings.WakeToRun = false;
taskDefinition.Actions.Add(new ExecAction("notepad.exe"));
const string taskName = "Testing TASK";
taskService.RootFolder.RegisterTaskDefinition(taskName, taskDefinition);
taskService.FindTask("Testing TASK").Run();
}
解决方案是Task Scheduler API,我不想解释太多,但这很简单。
要执行此操作,您需要访问 Task Scheduler API,但大部分代码是 Unmanaged(c++) 而我们不希望这样。我们需要 C# Managed Task Scheduler API,为此我们需要下载此 Nuget 包:LINK。
这将使我们能够在 C# 中访问 Task Scheduler API Managed 和 记录的 代码。如果您不知道 Task Scheduler API 是什么,那么查找它非常容易理解。
然后我们写 Task 我们 运行 它,它去 Start/Open/Execute 在指定的 User 上指定了 Application,使用 UAC,如果需要则没有提示。就这么简单! 无需本地人!
现在为了更详细的解释,让我们从答案的顶部获取我们的示例解决方案代码。在 RegisterInfo.Author 我们指定哪个 User 正在创建这个 Task,在这种情况下我们写SYSTEM 因为我们的服务是 Local System。然后在 Principal.GroupID 我们写 which Group 我们的 User 我们想要执行文件是。在我的例子中,User 可以说是 Administrator,这意味着它将在 Administrators 组中。然后最后在 Principal.UserId 我们写 Administrators Group 中的哪个用户而不是 ACCOUNT 我们想要 Start/Open/Execute 假设 John 上的文件。而已!如果您 运行 代码将在 User! 上打开 notepad.exe。如果有人想要改进我的答案,我不想解释太多,但这是做到这一点的方法。
PS:请记住,您至少需要 管理员权限 才能创建 任务。
PS2:非常好的 文档 关于这个 C# Managed Task Scheduler API 检查这个 LINK.
就这些!稍后我可能会改进这个答案我现在没有太多时间。
这是我第一次创建 windows 服务,我正在尝试为当前 登录用户 [=80= 打开一个 可执行文件 ],虽然服务是 运行ning 作为 Local Service, 或 Local System, 但我遇到的是 Executable 运行s 作为 SYSTEM 用户但不显示给 User 我的意思是该进程是 运行 在 SYSTEM 用户下,没有显示 Window 登录用户.
如果我的windows服务运行宁作为本地服务,那么可执行文件能够运行。任务管理器中没有生命迹象。
我已经尝试查找我的问题并尝试了这些解决方案:
- Process.Start("文件名");
- File.Open("文件名", FileMode.Open);什么都没做! (任务管理器中没有生命迹象)
- ProcessStartInfo("FileName") with Verb = "运行 as";没有改变任何东西(运行 作为 SYSTEM)
- 尝试了来自命令提示符的 shell 命令:Process.Start("运行 as (忘记了我输入的整个命令行)");什么都没做! (任务管理器中没有生命迹象)
- ProcessStartInfo("FileName") with Username = "User" without Password;什么都没做! (任务管理器中没有生命迹象)
我确实认为解决方案 4 和 5 不起作用,因为需要 密码,但根据 Microsoft Post 关于 Local System 它说 SYSTEM 不需要 Password 来访问 User (Impersonation),但我不明白 Impersonation 到底是什么,它似乎用 [=25 做了一些事情=]赢得 API 本地人.
我认为 可执行文件 Window 实际上显示给 SYSTEM 当 可执行文件 是运行ning。不是当前登录的用户.
现在:
- 如果没有 WinAPI Natives,是否有解决我的问题的解决方案?
- 如果需要Natives,能不能也给我解释一下?什么时候 post 输入代码?我只了解 Handles of WinAPI 这就是我真正了解的。
- 这在 本地系统 运行ning 服务上是否可行?至于我的服务重点是做系统管理?而不是 Local Service.
- 是否可以在 C# 编程语言 中完成所有这些?
PS: 我正在从事的项目是我公司的系统管理工具包。对于未来的项目。
PS2: 如果你需要更多信息告诉我,我会查看这个post 经常.
PS3: 如果您看到任何语法错误,请原谅我的英语。
解决方案代码:
using (TaskService taskService = new TaskService())
{
TaskDefinition taskDefinition = taskService.NewTask();
taskDefinition.RegistrationInfo.Description = "Does something";
taskDefinition.RegistrationInfo.Author = "SYSTEM";
taskDefinition.Principal.DisplayName = "Testing Display Task Name C#";
taskDefinition.Principal.RunLevel = TaskRunLevel.Highest;
taskDefinition.Principal.GroupId = "Administrators";
taskDefinition.Principal.UserId = "ACCOUNT";
taskDefinition.Principal.LogonType = TaskLogonType.InteractiveToken;
taskDefinition.Settings.AllowDemandStart = true;
taskDefinition.Settings.AllowHardTerminate = true;
taskDefinition.Settings.DisallowStartIfOnBatteries = false;
taskDefinition.Settings.DisallowStartOnRemoteAppSession = true;
taskDefinition.Settings.Hidden = false;
taskDefinition.Settings.RestartCount = 0;
taskDefinition.Settings.RunOnlyIfIdle = false;
taskDefinition.Settings.RunOnlyIfNetworkAvailable = false;
taskDefinition.Settings.StartWhenAvailable = true;
taskDefinition.Settings.StopIfGoingOnBatteries = false;
taskDefinition.Settings.Volatile = false;
taskDefinition.Settings.WakeToRun = false;
taskDefinition.Actions.Add(new ExecAction("notepad.exe"));
const string taskName = "Testing TASK";
taskService.RootFolder.RegisterTaskDefinition(taskName, taskDefinition);
taskService.FindTask("Testing TASK").Run();
}
解决方案是Task Scheduler API,我不想解释太多,但这很简单。
要执行此操作,您需要访问 Task Scheduler API,但大部分代码是 Unmanaged(c++) 而我们不希望这样。我们需要 C# Managed Task Scheduler API,为此我们需要下载此 Nuget 包:LINK。
这将使我们能够在 C# 中访问 Task Scheduler API Managed 和 记录的 代码。如果您不知道 Task Scheduler API 是什么,那么查找它非常容易理解。
然后我们写 Task 我们 运行 它,它去 Start/Open/Execute 在指定的 User 上指定了 Application,使用 UAC,如果需要则没有提示。就这么简单! 无需本地人!
现在为了更详细的解释,让我们从答案的顶部获取我们的示例解决方案代码。在 RegisterInfo.Author 我们指定哪个 User 正在创建这个 Task,在这种情况下我们写SYSTEM 因为我们的服务是 Local System。然后在 Principal.GroupID 我们写 which Group 我们的 User 我们想要执行文件是。在我的例子中,User 可以说是 Administrator,这意味着它将在 Administrators 组中。然后最后在 Principal.UserId 我们写 Administrators Group 中的哪个用户而不是 ACCOUNT 我们想要 Start/Open/Execute 假设 John 上的文件。而已!如果您 运行 代码将在 User! 上打开 notepad.exe。如果有人想要改进我的答案,我不想解释太多,但这是做到这一点的方法。
PS:请记住,您至少需要 管理员权限 才能创建 任务。 PS2:非常好的 文档 关于这个 C# Managed Task Scheduler API 检查这个 LINK.
就这些!稍后我可能会改进这个答案我现在没有太多时间。