【发布时间】:2021-01-18 16:21:36
【问题描述】:
我再次需要你的帮助:)
我想做的事:
我有一个 c# 程序,它以普通用户权限运行 - 无法提高 - 我想从该程序更改系统日期(而不是时间)。
[编辑] 更具体一点:我确实有可以嵌入到程序中的管理员凭据(哎呀,我知道),但我想避免 UAC 提示.
当我从 Visual Studio 外部启动 cmd 并尝试更改日期时,它会因“缺少客户端权限”而失败(大致翻译自德语)。当我以管理员身份启动 cmd 时,确认 UAC 提示相同的命令成功。
我是在家写作,所以目前无法提供运行代码。但是我所有的尝试都编译并运行没有错误,但日期没有改变。
我尝试过的:
-
创建了一个
Process实例,将管理员凭据应用到ProcessStartInfo,将FileName设置为c:\windows\system32\cmd.exe,并将参数设置为/C date {thedate}。我重定向了StandardOutput和StandardError,执行后StandardError包含与上述相同的消息:“缺少客户端权限” -
我已经修改了这个示例MSDN: WindowsIdentity.Impersonate,使用带有
AdvAPI32.LogonUser的PInvoke 来提高权限,并使用Kernel32.SetSystemTime来更改系统时间。AdvAPI32.LogonUser成功,WindowsIdentity.GetCurrent().Name返回管理员名称,但调用Kernel32.SetSystemTime失败并显示“缺少客户端权限”。 -
我已经尝试打开当前进程
AdvApi32.OpenCurrentProcess并使用AdvApi32.AdjustTokenPrivileges按照此示例StackOverflow: Change system time programmaticaly using datetimepeaker 调整权限,代码运行完全正常,但Kernel32.SetSystemTime失败...
[编辑] 解决方案:
我最终编写了一个带有嵌入式 app.manifest 的小程序,请求管理员权限。这个应用程序是从主程序调用的,所以它仍然可以由普通用户运行。
【问题讨论】:
-
我不明白你的问题。当您需要某些任务的权限时,您肯定必须提供一些权限。或者换句话说:您需要管理员权限来更改系统日期。
-
这能回答你的问题吗? How do you do Impersonation in .NET?
-
您需要特权。在 Windows 中关闭 UAC 以删除弹出窗口并创建一个快捷方式以始终以管理员身份运行。
-
@HimBromBeere 我确实有管理员凭据,我用它们来创建进程/模拟但似乎没有 app.manifest/UAC 提示程序,将使用一个不允许的受限令牌我来更改日期。
-
@Charlieface 感谢您的链接。代码更容易阅读,但来自 MSDN 的代码确实有效。
WindowsIdentity.GetCurrent().Name确实确认我是管理员,但即使这样也不允许我更改日期。
标签: c# systemtime