最近的项目可能会运行在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文件夹下为可执行程序的源代码:
2.我使用的Unity版本是Unity2017.4.2f2
Unity打包PC读取的是/Variations文件夹中已经打包好的WindowsPlayer.exe文件与其他各种依赖文件
我们需要做的是从源项目重新构建一个WindowsPlayer.exe然后把该exe替换掉
3.如图所见,WindowsPlayer.exe就是我们需要修改的exe,WindowsPlayer1.exe是我修改之前备份改了名字的exe。
接下来我们需要来到 /Source 文件夹 可以看到WindowsPlayer.exe的项目源码,可以看到.sln 的visual studio工程文件,项目是C++工程,我使用VS2017打开
4.要编译项目需要安装C++桌面开发与WindowsXP支持,确保图中几个勾选已安装:
5.接下来我们打开项目:
找到WindowsPlayer.manifest文件,找到图中那一行修改为 level="requireAdministrator" ,然后保存即可。
6.接下来可以开始打包:
确保改为Release,然后Ctrl+F5打包64位与32位,成功之后可以看到在项目的Build/bin目录下生成exe成功,接下来我们把exe拷贝到对应的目录
注意备份原来的不会默认请求管理员权限的exe,
接下来我们回到Unity进行正常打包,即可得到带有小盾牌的管理员权限程序了。
>>> 拷贝到
OK完毕完美!