标签: uac

检测注册表虚拟化

我有一套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 ...命令).

registry virtualization uac windows-7 c#-2.0

21
推荐指数
2
解决办法
1万
查看次数

使用不同的用户凭据通过提升启动另一个进程

我正在尝试使用非提升的进程启动提升的进程,但我还需要为具有管理凭据的用户提供用户名和密码.我已尝试过"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说明该操作需要提升的说明.

问题似乎是设置UseShellExecutefalse(因为这两种方法都不正常),但我必须将其设置为false才能在不同的用户帐户下启动该进程.

如何从非提升的流程启动提升的流程并手动提供用户名和密码?

BOUNTY EDIT:虽然不能要求用户输入管理员凭据,但完全可以接受UAC nag对话框.我不想在这里绕过UAC.

.net security uac

20
推荐指数
1
解决办法
8987
查看次数

以编程方式禁用UAC

是否可以在Vista中以编程方式禁用UAC?或者,我可以以任何方式使我的应用程序不受UAC设置的限制吗?仅供参考,应用程序需要动态安装硬盘驱动器,这就是我每次都不能要求UAC许可的原因......

更新:

我正在寻找符合Kosi2801提到的内容,基本上要求用户始终以"提升"模式启动程序.我希望权限是一次性的,我不是说我在没有先获得权限的情况下以编程方式禁用UAC.我确信有很多程序需要在这种模式下运行(特别是与硬件相关的程序),所以应该有某种方式来适应它.

uac windows-vista

19
推荐指数
3
解决办法
1万
查看次数

dotnet核心应用以管理员身份运行

我有一个dotnet控制台应用程序,需要管理员权限才能运行.我找不到怎么做.在常规项目中,我将添加app.manifest并设置

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

但我无法想象如何在构建中嵌入它.

我该怎么做呢?

c# uac .net-core

19
推荐指数
4
解决办法
4367
查看次数

如何在Vista(.NET)中运行NOT raise

我有一个应用程序,我必须以管理员身份运行.

该应用程序的一小部分是使用Process.Start启动其他应用程序

启动的应用程序也将作为管理员运行,但我宁愿看到它们作为"普通"用户运行.

我该如何做到这一点?

/约翰/

.net uac elevation windows-vista

18
推荐指数
2
解决办法
1万
查看次数

MSI,UAC和Unidentified Publisher.如何更改Unidentified Publisher?

我目前正在为我的一个应用程序开发一个MSI包.效果很好; 但是,在安装开始之前,我得到了预期的UAC窗口,询问我是否信任来自Unidentified Publisher的程序.我并不关心UAC本身,而是关注Unidentified Publisher.我该如何改变?我听说我需要特殊证书......如果是这样的话,我在哪里可以得到它?

替代文字
(来源:backuphowto.info)

c# windows-installer uac certificate

18
推荐指数
2
解决办法
9094
查看次数

在Windows上删除C++中的权限

在Windows上运行的C++应用程序是否有可能在运行时删除权限?

例如,如果用户以管理员身份启动我的应用程序,但没有理由以管理员身份运行我的应用程序,我是否可以某种方式放弃管理员权限?

简而言之,我想在main()函数中编写代码来删除我不需要的权限(例如,Windows目录上的写访问权限).

c++ permissions uac

18
推荐指数
1
解决办法
1万
查看次数

提升权限不适用于UseShellExecute = false

我想启动一个具有提升权限但具有隐藏窗口的子进程(实际上是相同的控制台应用程序).

我做下一个:

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)

c# uac processstartinfo elevated-privileges

18
推荐指数
2
解决办法
2万
查看次数

检测程序是否以完全管理员权限运行

我需要确定我的程序是否以完全管理员权限运行.我的意思是,如果打开uac(对于win vista/7),我需要确定该程序是否实际具有管理员权限(如果用户右键单击并选择"作为管理员运行")并且不受uac限制.我如何在C++中执行此操作?

c++ winapi uac administrator detect

18
推荐指数
1
解决办法
1万
查看次数

在哪里放置常见的可写应用程序文件?

我认为这CSIDL_COMMON_APPDATA\company\product应该是放置应用程序的所有用户和应用程序可以修改的文件的地方,但是,在Vista上这是一个只读位置,除非安装程序修改(根据MSDN - http: //msdn.microsoft.com/en-us/library/ms995853.aspx),那么......什么是最好的?修改位置的安全设置以允许编写或使用CSIDL_COMMON_DOCUMENTS\company\product?也许还有第三种选择?

此外,微软是否有某个"官方"推荐?

c++ windows winapi uac application-data

17
推荐指数
3
解决办法
5778
查看次数