【问题标题】:install as administrator but run as current user以管理员身份安装但以当前用户身份运行
【发布时间】:2015-08-21 20:38:32
【问题描述】:

我的安装程序以管理员身份运行,但完成后我希望 exe 以当前用户身份运行。

我正在使用 nsis 并且已经尝试过 UAC

!insertmacro UAC_AsUser_ExecShell "" "some.exe" "" "" ""

但它仍然以管理员身份运行。

尝试使用任务调度器

                    string path = System.Reflection.Assembly.GetExecutingAssembly().Location;
                td.Actions.Add(new ExecAction("" + path + "", "", null));
                td.Settings.DisallowStartIfOnBatteries = false;
                td.Settings.AllowHardTerminate = false;
                td.Settings.StopIfGoingOnBatteries = false;
                td.Settings.ExecutionTimeLimit = System.TimeSpan.Zero;
                td.Settings.IdleSettings.StopOnIdleEnd = false;
                // Register the task in the root folder
                ts.RootFolder.RegisterTaskDefinition("task", td);

但该任务也转到管理员,我无法将其发送给当前用户。

有什么想法吗?

【问题讨论】:

  • 在这个低流量标签上期望在 45 分钟内得到答复有点苛刻恕我直言。

标签: c# scheduled-tasks nsis uac


【解决方案1】:

我个人的建议是,您只需在安装程序结束时删除运行应用程序的选项即可。用户可以从开始菜单启动它,它应该被突出显示为新的和一切。

您可能知道,UAC 确实改变了应用程序以与“登录”用户不同的用户身份运行的普遍性。您只需要处理 UAC 存在的事实,并决定是否值得花费大量时间来解决它以及可能出现的错误和问题。

至少有 4 种方法可以以“当前用户”身份运行某些东西,所有这些方法都有问题,可能会失败或最终以“错误”非管理员用户身份运行:

  • 使用(希望是)非提升父级的令牌,这就是 NSIS UAC 插件的作用。
  • 使用 Windows 任务计划程序。这是早期 Vista 时代的推荐做法,但我相信 Microsoft 已经放弃了这种方法。
  • 在托管任务栏的 Explorer 进程中使用 shell COM 对象为您调用 ShellExecute。 StdUtils plugin 提供了一个执行此操作的 ExecShellAsUser 方法。
  • 使用 Windows NT 服务。因为它以 SYSTEM 身份运行,所以它可以在任何会话中获取用户的令牌句柄。

如果您决定仍要尝试这样做,那么您需要在选择方法之前确定您对当前用户的定义。

是在欢迎屏幕上登录的用户吗? Explorer shell(任务栏等)是作为用户运行的吗?它是您的设置过程的父过程吗?您还应该记住,runas.exe 存在并且用户可能出于某种原因尝试以特定用户身份运行某些东西...

【讨论】:

    猜你喜欢
    • 2017-05-27
    • 2012-07-14
    • 1970-01-01
    • 2022-01-23
    • 2012-07-11
    • 2016-09-20
    • 2010-11-26
    • 2012-05-28
    • 2011-03-24
    相关资源
    最近更新 更多