调用外部程序作为标准用户从必需的管理员程序运行
我正在编写一个非常基本的程序(vb),它将一些文件从一个文件夹复制到一个程序文件文件夹,因此我必须使用所需的管理员权限因为asInvoker不允许我在程序文件夹中写入程序。 现在,我复制文件后,我调用自动创建的脚本来自动设置外部程序中的这些文件,因为我有脚本调用外部程序并启动自动化过程。调用外部程序作为标准用户从必需的管理员程序运行
创建文件并将文件复制到“结束”程序的程序正常运行。 调用“结束”程序并执行自动设置的脚本也适用。
我的问题是,当我将它们组合起来的2, 出于某种奇怪的原因“结束”程序(我没写,也有我的SORCE代码)时,作为管理员身份运行erraticly behives。 如果我右键单击并以管理员身份运行,程序不会读取数据库或所需文件返回错误并自行终止。因此,以管理员身份运行不是一个选项。 但是,由于我的程序必须以管理员身份运行,因此它看起来像将同样的特权配置为以admin身份调用“结束”程序的autoit脚本。 如果我从我的应用程序而不是自动脚本调用“结束”程序,也会发生这种情况。
因此,在它调用autoit脚本或“结束”程序之前,我们的应用程序从管理员降级到标准用户之后,以便“结束”程序不作为管理员运行或一个参数,特别是使应用程序作为标准用户调用外部程序,btw我使用Process.start(“autoitscript.exe”)来调用它。 或任何其他解决方法,我可以尝试。 这不涉及自动脚本来调用“结束”程序和我的应用程序,因为这有效,但不是我的意图。
谢谢。
这是执行一项棘手的任务,但这个怎么样:
-
让你的应用程序启动
asInvoker
,不显示任何窗口,并检查它是否与使用此代码提升的权限运行:Public Shared Function IsAdministrator() As Boolean Return (New WindowsPrincipal(WindowsIdentity.GetCurrent())).IsInRole(WindowsBuiltInRole.Administrator) End Function
如果它不以提升的权限运行,使其启动隐形
cmd
例如,您重定向标准输入。 获取cmd进程的PID,现在使用提升的权限启动应用程序的新实例(可以通过设置
StartInfo.Verb = "runas"
来完成),并将PID作为命令行参数传递。-
现在您的应用程序的新实例启动,
IsAdministrator()
应返回True
。因此,现在您知道您的应用具有管理员权限,您可以检查该应用是否具有可解析为Integer的命令行参数。如果是这样,将Integer存储在某个地方,然后执行所有管理员所需的工作。
-
最后,如果您想要启动
autoitscript.exe
应用程序,您可以创建一个过程变量并将其分配给Process.GetProcessById(<your PID Integer here>)
。例如:
Dim cmdProcess As Process = Process.GetProcessById(cmdPID)
-
现在你已经在CMD实例控制再次你只写它的标准输入(this article介绍一点它是如何工作)。
你想写两行。首先是启动其他应用:
autoitscript.exe
,第二个是关闭CMD例如:
exit
如果有什么不清楚只是让我知道。