Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何更改非提升c#程序的系统时间_C#_Systemtime - Fatal编程技术网

如何更改非提升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
    包含与上述相同的消息:“缺少客户端权限”

  • 我已经使用PInvoke和
    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提示的情况下验证为管理员),但这似乎是唯一的出路。