如何更改非提升c#程序的系统时间
我再次需要你的帮助:) 我想做什么:如何更改非提升c#程序的系统时间,c#,systemtime,C#,Systemtime,我再次需要你的帮助:) 我想做什么: 我有一个c#程序,它以正常的用户权限运行——这些权限无法提升——我想从该程序更改系统日期(而不是时间) [编辑]更具体一点:我确实有可以嵌入程序的管理员凭据(我知道,是的),但我想避免UAC提示 当我从Visual Studio外部启动cmd并尝试更改日期时,由于“缺少客户端权限”(大致翻译为德语)而失败。当我以管理员身份启动cmd时,请确认UAC提示是否成功执行相同的命令 我在家里写作,所以目前无法提供运行代码。但我所有的尝试都编译并运行了,没有出错,但日
我有一个c#程序,它以正常的用户权限运行——这些权限无法提升——我想从该程序更改系统日期(而不是时间) [编辑]更具体一点:我确实有可以嵌入程序的管理员凭据(我知道,是的),但我想避免UAC提示 当我从Visual Studio外部启动
cmd
并尝试更改日期时,由于“缺少客户端权限”(大致翻译为德语)而失败。当我以管理员身份启动cmd
时,请确认UAC提示是否成功执行相同的命令
我在家里写作,所以目前无法提供运行代码。但我所有的尝试都编译并运行了,没有出错,但日期没有改变
我所尝试的:
进程
实例,将管理员凭据应用于进程开始信息
,将文件名
设置为c:\windows\system32\cmd.exe
并将参数设置为/c日期{thedate}
。我重定向了StandardOutput
和StandardError
,执行后StandardError
包含与上述相同的消息:“缺少客户端权限”
AdvAPI32.LogonUser
修改了这个示例,以提升权限,并使用Kernel32.SetSystemTime
更改系统时间AdvAPI32.LogonUser
成功并WindowsIdentity.GetCurrent().Name
返回管理员名称,但调用Kernel32.SetSystemTime
失败,原因是“缺少客户端权限”
AdvApi32.OpenCurrentProcess
并使用以下示例调整权限AdvApi32.AdjustTokenPrivileges
,代码运行完全正常,但Kernel32.SetSystemTime
失败
我最终编写了一个带有嵌入式app.manifest的小程序,该程序请求管理员权限。此应用程序是从主程序调用的,因此普通用户仍可运行此应用程序。一旦启动,就无法更改进程的权限。原始进程必须以提升的权限启动另一个进程。第二个进程实际上可以是同一个.exe文件,但有一个命令参数,告诉进程做一些小事情并立即退出 要使用提升的权限启动进程,请使用process.start,但使用.Verb=“runas”,如中所述。如果机器上启用了UAC,这当然会导致弹出UAC提示。必须至少显示一个UAC提示,因为UAC提示是该防御机制的关键
如果您希望将多个UAC提示减少为一个,则可以将原始应用程序设置为以管理员身份启动(UAC提示在原始流程启动时显示),并且只有一个流程。或者在原始流程和提升流程之间进行一些进程间通信,以便提升流程只启动一次,并在原始流程结束时完成。在第二种情况下,UAC提示符显示第一次需要的时间。我可以问一下,为什么需要更改非特权应用程序的系统时间吗 如果要影响其他应用程序,则需要管理员权限,因为日期时间对于许多其他应用程序来说是非常重要的系统功能。但是,如果您只需要调整应用程序中的日期,那么我建议您创建自己的日期/时间提供程序,它可以将日期偏移量返回到您希望在应用程序中使用的日期 比如说
public DateTime GetDateWithOffset(int daysToOffset)
{
return DateTime.UtcNow.AddDays(daysToOffset);
}
我不明白你的问题。当您需要某些任务的特权时,您当然必须提供一些。或者换句话说:您需要管理员权限来更改系统日期。这是否回答了您的问题?你需要特权。在Windows中打开UAC以删除弹出窗口并创建一条始终以管理员身份运行的捷径。@HimBromBeere我确实有管理员凭据,我使用它们来创建进程/模拟,但似乎没有app.manifest/UAC提示程序,将使用限制令牌,不允许我更改日期。@Charlieface谢谢为了链接。代码更容易阅读,但MSDN中的代码确实有效
WindowsIdentity.GetCurrent().Name
确实确认了我是管理员,但即使这样也不允许我更改日期。我已经投票了,因为这是我最终得到的解决方案,但它不是我想要的解决方案(在没有UAC提示的情况下验证为管理员),但这似乎是唯一的出路。