我有一套C#(v2)应用程序,我在Win7(以及较小程度上的Vista)中使用注册表虚拟化.
我有一个共享的注册表配置区域,我的应用程序需要在HKLM\Software\Company中访问...在Vista之前,所有内容都只是根据需要写入并从该位置读取.
代码适当地检测到写入该注册表项的失败并且会适当地回退(写入HKCU而不是通知用户他们应用的设置只会影响当前用户).
在Vista中,注册表虚拟化破坏了所有这一切,因为我们用于HKLM写入的访问检查将"成功"静默并虚拟化为HKCR\VirtualStore\Machine ...而不是.在这种情况下,用户会认为他们已经保存了机器范围的配置,而只是写入了虚拟商店.
遗憾的是,即使尝试枚举HKLM reg键的权限,也会显式返回指示用户是否访问的结果.
当我们添加Vista支持时,我们使用的解决方法是执行对HKLM的探测写入...然后在HKCR\VirtualStore\Machine ...中检查相同的值并注意如果找到该值则发生虚拟化.
Win7似乎已经打破了这个(再次),因为针对显式虚拟位置(HKCR)的查询现在显示来自HKLM位置的合并结果,即使写入未被虚拟化.
有没有人有任何解决这个问题的建议?
约束: - 我需要一个无需提升的解决方案(当我没有管理员级别权限时,我将回退到HKCU中的每用户配置,但我需要能够可靠地检测到这种情况).
它需要使用v2 C#应用程序(我看到的C++代码的一个选项是嵌入一个禁用.exe虚拟化的清单,但我无法在C#V2中执行此操作,请参阅Windows中的禁用文件夹虚拟化) .
它需要在没有"安装程序"的情况下工作(这排除了在注册表项上禁用虚拟化的能力,我们需要REG FLAGS ...命令).
我正在尝试使用非提升的进程启动提升的进程,但我还需要为具有管理凭据的用户提供用户名和密码.我已尝试过"runas"
提升方法以及使用清单,但两者都会产生不同的错误.
例如,如果我这样做(不使用需要提升的清单):
ProcessStartInfo info = new ProcessStartInfo(path);
info.UseShellExecute = false;
info.UserName = username;
info.Password = securePwd;
info.Domain = "MyDomain";
info.Verb = "runas";
var proc = Process.Start(info);
Run Code Online (Sandbox Code Playgroud)
该过程在不显示UAC确认对话框的情况下启动,并在尝试执行需要管理员权限的命令时失败(我只是尝试将测试文件写入Program Files目录).
如果我向目标应用程序添加一个表明它需要提升的清单,那么我得到一个Win32Exception
说明该操作需要提升的说明.
问题似乎是设置UseShellExecute
为false
(因为这两种方法都不正常),但我必须将其设置为false才能在不同的用户帐户下启动该进程.
如何从非提升的流程启动提升的流程并手动提供用户名和密码?
BOUNTY EDIT:虽然不能要求用户输入管理员凭据,但完全可以接受UAC nag对话框.我不想在这里绕过UAC.
是否可以在Vista中以编程方式禁用UAC?或者,我可以以任何方式使我的应用程序不受UAC设置的限制吗?仅供参考,应用程序需要动态安装硬盘驱动器,这就是我每次都不能要求UAC许可的原因......
更新:
我正在寻找符合Kosi2801提到的内容,基本上要求用户始终以"提升"模式启动程序.我希望权限是一次性的,我不是说我在没有先获得权限的情况下以编程方式禁用UAC.我确信有很多程序需要在这种模式下运行(特别是与硬件相关的程序),所以应该有某种方式来适应它.
我有一个dotnet控制台应用程序,需要管理员权限才能运行.我找不到怎么做.在常规项目中,我将添加app.manifest并设置
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
但我无法想象如何在构建中嵌入它.
我该怎么做呢?
我有一个应用程序,我必须以管理员身份运行.
该应用程序的一小部分是使用Process.Start启动其他应用程序
启动的应用程序也将作为管理员运行,但我宁愿看到它们作为"普通"用户运行.
我该如何做到这一点?
/约翰/
我目前正在为我的一个应用程序开发一个MSI包.效果很好; 但是,在安装开始之前,我得到了预期的UAC窗口,询问我是否信任来自Unidentified Publisher的程序.我并不关心UAC本身,而是关注Unidentified Publisher.我该如何改变?我听说我需要特殊证书......如果是这样的话,我在哪里可以得到它?
(来源:backuphowto.info)
在Windows上运行的C++应用程序是否有可能在运行时删除权限?
例如,如果用户以管理员身份启动我的应用程序,但没有理由以管理员身份运行我的应用程序,我是否可以某种方式放弃管理员权限?
简而言之,我想在main()函数中编写代码来删除我不需要的权限(例如,Windows目录上的写访问权限).
我想启动一个具有提升权限但具有隐藏窗口的子进程(实际上是相同的控制台应用程序).
我做下一个:
var info = new ProcessStartInfo(Assembly.GetEntryAssembly().Location)
{
UseShellExecute = true, // !
Verb = "runas",
};
var process = new Process
{
StartInfo = info
};
process.Start();
Run Code Online (Sandbox Code Playgroud)
这工作:
var identity = new WindowsPrincipal(WindowsIdentity.GetCurrent());
identity.IsInRole(WindowsBuiltInRole.Administrator); // returns true
Run Code Online (Sandbox Code Playgroud)
但是UseShellExecute = true
创建了一个新窗口,我也无法重定向输出.
所以我下次做的时候:
var info = new ProcessStartInfo(Assembly.GetEntryAssembly().Location)
{
RedirectStandardError = true,
RedirectStandardOutput = true,
UseShellExecute = false, // !
Verb = "runas"
};
var process = new Process
{
EnableRaisingEvents = true,
StartInfo = info
};
DataReceivedEventHandler actionWrite …
Run Code Online (Sandbox Code Playgroud) 我需要确定我的程序是否以完全管理员权限运行.我的意思是,如果打开uac(对于win vista/7),我需要确定该程序是否实际具有管理员权限(如果用户右键单击并选择"作为管理员运行")并且不受uac限制.我如何在C++中执行此操作?
我认为这CSIDL_COMMON_APPDATA\company\product
应该是放置应用程序的所有用户和应用程序可以修改的文件的地方,但是,在Vista上这是一个只读位置,除非安装程序修改(根据MSDN - http: //msdn.microsoft.com/en-us/library/ms995853.aspx),那么......什么是最好的?修改位置的安全设置以允许编写或使用CSIDL_COMMON_DOCUMENTS\company\product
?也许还有第三种选择?
此外,微软是否有某个"官方"推荐?