Unity打包发布PC程序之——默认管理员权限运行

时间:2024-04-02 18:56:43

最近的项目可能会运行在C盘,然而在程序的本地路径写入文件时却没有权限,因此需要默认以管理员身份运行。

 

但是如果让用户手动右键管理员运行时不太好的,了解到C#、C++的原生windows工程都可以在visual studio里配置manifest文件可以默认以管理员权限运行,会在exe上加一个小盾牌。

 

但是Unity并没有提供这种方式,于是尝试了C#版的代码方法:

但是经过各种代码测试,发现在Unity并没有卵用,只在winform程序中有效

像这样: 

static void Main(string[] Args){
            /**
             * 当前用户是管理员的时候,直接启动应用程序
             * 如果不是管理员,则使用启动对象启动程序,以确保使用管理员身份运行
             */
            //获得当前登录的Windows用户标示
            System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
            //创建Windows用户主题
            Application.EnableVisualStyles();
            System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity);
            //判断当前登录用户是否为管理员
            if (principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator))
            {
                //如果是管理员,则直接运行
                Application.EnableVisualStyles();
                Application.Run(new Form1());
            }
            else
            {
                //创建启动对象
                System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
                //设置运行文件
                startInfo.FileName = System.Windows.Forms.Application.ExecutablePath;
                //设置启动参数
                //startInfo.Arguments = String.Join(" ", Args);
                //设置启动动作,确保以管理员身份运行
                startInfo.Verb = "runas";
             try
             {
                    //如果不是管理员,则启动UAC
                    System.Diagnostics.Process.Start(startInfo);
                    //退出
                    System.Windows.Forms.Application.Exit();
             }catch{ }
     }
}

 

于是我各种百度、google,发现也有人遇到这个问题。

但是最终解决办法都是类似于使用bat启动、或者另外创建一个exe项目启动Unity的exe之类不太靠谱的方案。

于是我开始自己寻求解决办法:

 

最终解决办法:

修改Unity安装目录中的Windows打包插件模板,重新生成一个新的默认以管理员权限启动的模板exe,然后再进行打包

 

1.找到Unity安装目录的Data/PlaybackEngines/windowsstandalonesupport/

   该目录是Unity的PC平台打包插件所在目录,官方文档可以看到根据Source文件夹下为可执行程序的源代码:

Unity打包发布PC程序之——默认管理员权限运行

Unity打包发布PC程序之——默认管理员权限运行

 

2.我使用的Unity版本是Unity2017.4.2f2

Unity打包PC读取的是/Variations文件夹中已经打包好的WindowsPlayer.exe文件与其他各种依赖文件

我们需要做的是从源项目重新构建一个WindowsPlayer.exe然后把该exe替换掉

Unity打包发布PC程序之——默认管理员权限运行

3.如图所见,WindowsPlayer.exe就是我们需要修改的exe,WindowsPlayer1.exe是我修改之前备份改了名字的exe。

接下来我们需要来到 /Source 文件夹 可以看到WindowsPlayer.exe的项目源码,可以看到.sln 的visual studio工程文件,项目是C++工程,我使用VS2017打开​​​​​​​

Unity打包发布PC程序之——默认管理员权限运行

4.要编译项目需要安装C++桌面开发与WindowsXP支持,确保图中几个勾选已安装:

Unity打包发布PC程序之——默认管理员权限运行

Unity打包发布PC程序之——默认管理员权限运行

 

 

5.接下来我们打开项目:

找到WindowsPlayer.manifest文件,找到图中那一行修改为 level="requireAdministrator" ,然后保存即可。

Unity打包发布PC程序之——默认管理员权限运行

6.接下来可以开始打包:

确保改为Release,然后Ctrl+F5打包64位与32位,成功之后可以看到在项目的Build/bin目录下生成exe成功,接下来我们把exe拷贝到对应的目录

注意备份原来的不会默认请求管理员权限的exe

接下来我们回到Unity进行正常打包,即可得到带有小盾牌的管理员权限程序了。

 

Unity打包发布PC程序之——默认管理员权限运行

Unity打包发布PC程序之——默认管理员权限运行

>>> 拷贝到

Unity打包发布PC程序之——默认管理员权限运行

 

OK完毕完美!