我在c#中编写了一个小程序,可帮助我在公司的许可证之间切换。这是一个带有不同选择菜单的托盘图标。
它更改了一个环境变量,并且需要在其清单中具有提升的权限。
这意味着每次程序启动时都会显示UAC警告,这并不理想,因为在Windows启动时将程序置于自动启动状态会非常好,而且不会一直显示警告。
有一个很好的方法吗?
是否可以:
我知道UAC可以防止恶意软件,但是以一种能让我在Windows启动时启动程序的方式解决这个问题真的很不错。
我无法解决这个问题。
有任何建议吗?
答案 0 :(得分:0)
通常的做法是你有一个以系统权限运行的Windows服务,它将为你设置环境变量。
您需要让安装程序安装该服务并将其设置为自动启动。然后您的托盘应用程序需要通过某种进程间通信(如WCF)与服务进行通信,然后托盘程序可以发送更改变量的请求,服务可以执行这些更改。
另一种处理此问题的方法是启动您的程序,然后当您需要执行需要UAC权限launch a new copy of your program as an administrator的操作时,并传入命令行参数,告诉它执行您需要完成的工作然后退出。您还可以检查程序是否为管理员,如果已经提升,则可以跳过启动新副本的步骤。
答案 1 :(得分:0)
您需要做的是将许可证信息移动到所有用户都可以写入的位置:
C:\ProgramData
,所有用户都可以写入)理想的解决方案是写入机器范围的通用位置:
C:\ProgramData
)但是假设有许多现有的不可更改的应用程序无法更改为除了环境变量之外的其他任何地方,您可以(在您击中那个设计该项目的人之后):
您的切换工具会致电:
SetEnvironmentVariable("ContosoLicenseInfo", "V2h5IGFyZSB5b3UgZGVjb2RpbmcgdGhpbmdzIHRoYXQgZG9uJ3QgYmVsb25nIHRvIHlvdT8=");
所有这些都是关于UAC的。你必须问自己:
在Windows XP下我会做什么?
如果没有UAC,并且用户以标准用户身份运行,您的许可证切换工具会做什么?
更好的是,您必须询问您在Windows 7下运行的用户会做些什么?标准用户登录,并且您的启动组中有一个声称需要管理权限的程序。
用户需要在登录期间获得管理员才能运行您的工具?那不会飞。
然后将您的工具更改为无需用户权限即可运行。
只有当用户去做某事时,需要管理员权限。
检查用户是否是管理员:
Boolean IsUserAnAdmin()
{
PSID administratorsGroup;
administratorsGroup = AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0);
Boolean result = CheckTokenMembership(0, administratorsGroup);
FreeSid(administratorsGroup);
}
如果他们是管理员,您可以按照。
执行操作如果用户不是管理员,则将UAC屏蔽放在 应用按钮上。
然后,您以管理员身份重新启动工具:
ShellExecute("runas", "C:\Program Files\Contoso\LicenseSwitcher.exe", ...); //the "runas" verb triggers elevation
如果禁用UAC,UAC的所有内容都不起作用。在这种情况下:你是一个标准用户,就是这样。
在这种情况下,最好转换为:
答案 2 :(得分:-2)
UAC通过向特定应用程序请求提升权限的警报(并要求显式操作)来保护Windows用户。如果可以通过应用程序本身绕过它,那么它会让它变得毫无意义:)
我认为您希望全局更改环境变量,因为我相信您可以为当前流程更改它们而不会被提升。