2023年12月14日发(作者:)

C#以管理员(RunasAdministrator)的权限打开程指

定序并执行命令

项目需要用wix#(wix sharp)打包程序,使用wix中的ServiceInstaller安装一个WINDOWS SERVICE ,服务可以正常启

动,但是使用的时候有问题(目前还不清楚原因),但是服务如果使用原来的CMD安装方式是可以正常工作的。 所以我就

改变方向在WIX#打包代码里面修改以ADMINISTARTOR权限调出CMD并运行安装服务。

VS以管理员模式启动

注意一定要用管理员(Run as Administrator)权限打开VS,这样才能以管理员的权限启动应用程序(从而调出来的CMD才是Administrator权限的) 必

须这么做:

右键VS的快捷方式->“以管理员方式运行

以管理员身份运行程序

其实要以管理员的身份运行cmd命令提示符,我们只需要让c#开发的程序自身以管理员身份运行就可以了,我们打开

visual studio - 解决方案资源管理器 -右键项目名称 - 属性 ,弹出下面的窗口:

点击选择左侧的“安全性”,我们在“启用ClickOnce安全设置”前面打勾,然后再返回解决方案资源管理器界面,这时,在项目名称里

的“Properties”下面会多出一个“st”的文件,如下图所示:

我们点击选中它,看左侧窗口中代码,如下:

我们找到代码段: ,将其改

为:

改过后,不要急于重新编译生成,我们重新返回上图那个界面,将“启用ClickOnce安全设置”前面的勾去掉后再编译运

行,不然程序会报错无法运行。

C#程序程序中调用CMD的代码public class RunCmd

{

public RunCmd()

{

}

private static string CmdPath = @"C:";

///

/// 执行cmd命令

/// 多命令请使用批处理命令连接符:

///

/// &:同时执行两个命令

/// |:将上一个命令的输出,作为下一个命令的输入

/// &&:当&&前的命令成功时,才执行&&后的命令

/// ||:当||前的命令失败时,才执行||后的命令]]>

/// 其他请百度

///

///

///

public static void run(string cmd, out string output)

{

cmd = ().TrimEnd('&') + "&exit";//说明:不管命令是否成功均执行exit命令,否则当调用ReadToEnd()

方法时,会处于假死状态

using (Process p = new Process())

{

me = CmdPath;

llExecute = false; //是否使用操作系统shell启动

ctStandardInput = true; //接受来自调用程序的输入信息

ctStandardOutput = true; //由调用程序获取输出信息

ctStandardError = true; //重定向标准错误输出

NoWindow = false; //不显示程序窗口

();//启动程序

//向cmd窗口写入命令

ine(cmd);

ush = true;

//ine("exit");

//向标准输入写入要执行的命令。这里使用&是批处理命令的符号,表示前面一个命令不管是否执行成功都执行后

面(exit)命令,如果不执行exit命令,后面调用ReadToEnd()方法会假死

//同类的符号还有&&和||前者表示必须前一个命令执行成功才会执行后面的命令,后者表示必须前一个命令执行失

败才会执行后面的命令

//获取cmd窗口的输出信息

output = End();

rExit();//等待程序执行完退出进程

();

}

}

}

调用命令如下: string commond, output;

commond = """+ @"C:Program FilesXXX" + @"" + """ + @" --install";

(commond, out output);

("output=" + output);

这几个步骤下来,成功以管理员的权限调出CMD执行了命令。