C#学习教程:在C#中处理UAC的正确方法除了这个应用程序之外,还有另一个WinForms应用程序配置服务(除其他外)。配置时,它会将更改保存到与服务一起存在的配置文件中。在Vista/Win7上运行时,UAC会阻止用户保存到配置文件。我想做什么:我真的不想以管理员身份运行整个应用程序,因为它也用于不需要UAC权限的其他目的(因此设置应用程序清单文件不是正确的解决方案)。我还假设(如果我错了请纠正我)一旦授予UAC,我现有的流程将无法执行操作,我需要启动一个新流程。我怎样才能成为最好的?这很容易。在按钮上放置一个盾牌图标,用于保存对配置文件的更改,而不是菜单项。这是遵循Windows直到最后一刻才请求UAC权限的行为。该按钮实际上将以管理员身份再次启动您的可执行文件,并使用一个特殊的命令行(您决定)来执行配置文件保存。如果您不想使用命令行进行数据传递,请使用命名管道(确保赋予它正确的权限)将配置数据传递给第二个实例。启动可执行文件:ProcessStartInfoinfo=newProcessStartInfo();info.FileName="你的EXE";info.UseShellExecute=true;info.Verb="runas";//提供以管理员身份运行info.Arguments="YOURSPECIALCOMMANDLINE";if(Process.Start(info)!=null){//用户接受了UAC提示。这在UAC不存在时(WindowsXP)也有效,因为它将尝试以管理员身份运行或提示输入凭据。您可以通过简单地执行Environment.OSVersion.Version.Major==6来检查操作系统是否需要UAC。6是WindowsVista和7。您可以通过查看Environment.OSVersion.Platform来确保您使用的是Windows。要检测您的应用程序是否已经是管理员,您可以执行以下操作:publicstaticboolIsAdministrator(){WindowsIdentityidentity=WindowsIdentity.GetCurrent();if(identity!=null){WindowsPrincipalprincipal=newWindowsPrincipal(identity);返回principal.IsInRole(WindowsBuiltInRole.Administrator);}返回假;MatthewFerreira的回答详细说明了为什么以及何时需要重新启动整个应用程序,但他没有介绍如何显示盾牌图标。这是我使用的一些代码(我想我最初是从这个网站的某个地方得到的)只在程序没有提升时显示盾牌图标//////是一个带有UAC盾牌的按钮///publicpartialclassElevatedButton:Button{//////必要时使用UAC屏蔽创建按钮的构造函数。///publicElevatedButton(){FlatStyle=FlatStyle.System;如果(!IsElevated())ShowShield();}[DllImport("user32.dll")]privatestaticexternIntPtrSendMessage(HandleRefhWnd,uintMsg,IntPtrwParam,IntPtrlParam);私人单位BCM_SETSHIELD=0x0000160C;privateboolIsElevated(){WindowsIdentityidentity.GetCurrent=Windows);WindowsPrincipal主体=newWindowsPrincipal(identity);返回principal.IsInRole(WindowsBuiltInRole.Administrator);}privatevoidShowShield(){IntPtrwParam=newIntPtr(0);IntPtrlParam=newIntPtr(1);SendMessage(newHandleRef(this,Handle),BCM_SETSHIELD,wParam,lParam);如果按钮在托管上下文中,按钮将检查它是何时构建的,如果不是,按钮将在按钮上显示一个盾牌图标。如果您想要使用屏幕图标窗口,这里有一个偷偷摸摸的技巧,可以将盾牌图标作为位图对象返回。以上就是C#学习教程:C#处理UAC的正确方法分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
