调用外部程序作为标准用户从必需的管理员程序运行

问题描述:

我正在编写一个非常基本的程序(vb),它将一些文件从一个文件夹复制到一个程序文件文件夹,因此我必须使用所需的管理员权限因为asInvoker不允许我在程序文件夹中写入程序。 现在,我复制文件后,我调用自动创建的脚本来自动设置外部程序中的这些文件,因为我有脚本调用外部程序并启动自动化过程。调用外部程序作为标准用户从必需的管理员程序运行

创建文件并将文件复制到“结束”程序的程序正常运行。 调用“结束”程序并执行自动设置的脚本也适用。

我的问题是,当我将它们组合起来的2, 出于某种奇怪的原因“结束”程序(我没写,也有我的SORCE代码)时,作为管理员身份运行erraticly behives。 如果我右键单击并以管理员身份运行,程序不会读取数据库或所需文件返回错误并自行终止。因此,以管理员身份运行不是一个选项。 但是,由于我的程序必须以管理员身份运行,因此它看起来像将同样的特权配置为以admin身份调用“结束”程序的autoit脚本。 如果我从我的应用程序而不是自动脚本调用“结束”程序,也会发生这种情况。

因此,在它调用autoit脚本或“结束”程序之前,我们的应用程序从管理员降级到标准用户之后,以便“结束”程序不作为管理员运行或一个参数,特别是使应用程序作为标准用户调用外部程序,btw我使用Process.start(“autoitscript.exe”)来调用它。 或任何其他解决方法,我可以尝试。 这不涉及自动脚本来调用“结束”程序和我的应用程序,因为这有效,但不是我的意图。

谢谢。

这是执行一项棘手的任务,但这个怎么样:

  1. 让你的应用程序启动asInvoker,不显示任何窗口,并检查它是否与使用此代码提升的权限运行:

    Public Shared Function IsAdministrator() As Boolean 
        Return (New WindowsPrincipal(WindowsIdentity.GetCurrent())).IsInRole(WindowsBuiltInRole.Administrator) 
    End Function 
    

    如果它不以提升的权限运行,使其启动隐形cmd例如,您重定向标准输入。

  2. 获取cmd进程的PID,现在使用提升的权限启动应用程序的新实例(可以通过设置StartInfo.Verb = "runas"来完成),并将PID作为命令行参数传递。

  3. 现在您的应用程序的新实例启动,IsAdministrator()应返回True

    因此,现在您知道您的应用具有管理员权限,您可以检查该应用是否具有可解析为Integer的命令行参数。如果是这样,将Integer存储在某个地方,然后执行所有管理员所需的工作。

  4. 最后,如果您想要启动autoitscript.exe应用程序,您可以创建一个过程变量并将其分配给Process.GetProcessById(<your PID Integer here>)

    例如:

    Dim cmdProcess As Process = Process.GetProcessById(cmdPID) 
    
  5. 现在你已经在CMD实例控制再次你只写它的标准输入(this article介绍一点它是如何工作)。

    你想写两行。首先是启动其他应用:

    autoitscript.exe 
    

    ,第二个是关闭CMD例如:

    exit 
    

如果有什么不清楚只是让我知道。