调用外部程序以从requiredAdministrator程序作为标准用户运行

时间:2016-04-29 04:43:48

标签: vb.net autoit invoke elevated-privileges

我的Visual Basic程序会将文件复制到程序文件文件夹,因此我必须使用requiredAdministrator权限,因为asInvoker将不允许在程序文件文件夹中写入。

复制文件后,我调用AutoIt脚本自动设置外部程序中的文件(为此脚本调用外部程序启动自动化)。创建文件并将文件复制到“结束”程序的程序运行正常。调用“结束”程序并执行自动设置的脚本也可以正常工作。

当我结合2时,“结束”程序(我没有编写也没有源代码)在以管理员身份运行时表现不规律(不读取数据库或所需文件返回错误并终止自身)。所以以管理员身份运行不是一种选择。但由于我的程序必须以管理员身份运行,因此它似乎将相同的权限传递给AutoIt脚本,该脚本也将“结束”程序称为管理员。如果我从我的应用程序而不是AutoIt脚本调用“结束”程序,也会发生这种情况。

在调用文件后,有没有办法将我的应用程序从管理员降级为标准用户,就在它调用AutoIt脚本或“结束”程序之前,以便“结束”程序不以管理员或具体使应用程序以标准用户身份调用外部程序的参数?

我正在使用Process.start("autoitscript.exe")来调用它。或者任何其他不涉及AutoIt脚本调用“结束”程序和我的应用程序的解决方法,因为它可以工作但不是我的意图。

1 个答案:

答案 0 :(得分:0)

这是一项棘手的任务,但是如何:

  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存储在某处,然后执行所有管理员所需的工作。

  4. 在您想要启动autoitscript.exe应用程序的最后,您需要创建一个流程变量并为其指定Process.GetProcessById(<your PID Integer here>)

    例如:

    Dim cmdProcess As Process = Process.GetProcessById(cmdPID)
    
  5. 既然你再次控制了cmd实例,你只需要写入它的标准输入(this article描述它的工作原理)。

    你想写两行。第一个是启动另一个应用程序:

    autoitscript.exe
    

    ,第二个是关闭cmd实例:

    exit
    
  6. 如果有任何不清楚的地方,请告诉我。