使用清单中的requireAdministrator还原为Windows程序中的普通用户?

史蒂夫·瓦利埃(Steve Valliere)

我正在尝试将许多重复的安装任务封装到一个私人安装程序中。该程序供内部使用,用于为工业用户设置定制的单用途系统。我需要管理员特权才能为我们的环境调整许多Windows设置,然后我需要为要使用的应用程序软件包设置一些当前用户设置。

是否可以在不再需要admin特权的情况下,在清单中使用requireAdministrator的Windows程序(使用Visual Studio 2017创建的纯C语言)还原为启动该程序的用户?我已经在Linux上看到了此操作,但是无法找到在Windows中完成此操作的任何示例(甚至提及)。救命?请?

史蒂夫·瓦利埃(Steve Valliere)

最终答案当我终于能够在备用系统上安装干净的Windows 10进行测试并创建纯非管理员帐户进行测试时,新的,改进的答案不起作用。我在模拟之后添加了GetUserName()调用,并将其写入调试日志,以了解模拟之前和之后的用户名相同,即使所有函数都返回成功。我只能假定GetShellWindow()[我也尝试过GetDesktopWindow(),以防万一]在Admin上下文下向资源管理器/ shell返回了一个句柄。因此,现在我使用的是在这里找到的GetConsoleUserToken()函数的经过清理的版本(将其简化为C):https://social.msdn.microsoft.com/Forums/windowsdesktop/zh-CN/17db92be-0ebd-4b54-9e88-a122c7bc351d/strange-problem-with-wtsqueryusertoken-and-impersonateloggedonuser?forum=windowsgeneraldevelopmentissues这对两个都起作用我的开发系统在干净的Windows 10非管理员用户。该函数实际上在所有正在运行的进程中搜索属于控制台会话的explorer.exe(已附加?),在调试它时,我确实发现它找到了多个explorer.exe进程,但只有一个是正确的。

感谢您的所有建议和评论!他们给了我很好的主意,使我走上了一条道路,使我可以使用更好的搜索词来查找所需的内容。

对Microsoft:做某件事对于管理员级别的过程来说应该并不困难,这似乎不必要地复杂。

新的改进的答案:根据eryksun的建议,我创建了以下示例函数,该函数显示了程序打开当前用户密钥所需的所有步骤。我的程序在清单中有requireAdministrator,如果您的清单中没有,则可能需要对示例进行更改或添加。这是最适合我的方法(但显然不是在非管理员帐户下的干净机器上):

BOOL ChangeHkcuSettings( void )
{
   BOOL     bResult = FALSE;  // HKCU was not accessed
   HWND     hwndShell;
   DWORD    dwThreadId;
   DWORD    dwProcessId;
   HKEY     hKeyUserHive;
   HANDLE   hToken;
   HANDLE   hProcess;

   hwndShell  = GetShellWindow();
   dwThreadId = GetWindowThreadProcessId( hwndShell, &dwProcessId );
   hProcess   = OpenProcess( PROCESS_QUERY_INFORMATION, FALSE, dwProcessId );
   if( NULL != hProcess )
   {
      if( OpenProcessToken( hProcess,
                            TOKEN_QUERY
                          | TOKEN_DUPLICATE
                          | TOKEN_IMPERSONATE,
                            &hToken ) )
      {
         if( ImpersonateLoggedOnUser( hToken ) )
         {
            if( ERROR_SUCCESS == RegOpenCurrentUser( KEY_ALL_ACCESS, &hKeyUserHive ) )
            {
               // ... use the user hive key to access necessary HKCU items ...
               RegCloseKey( hKeyUserHive );
               bResult = TRUE;   // HKCU was accessed
            }
            RevertToSelf();
         }
         CloseHandle( hToken );
      }
      CloseHandle( hProcess );
   }
   return bResult;
}

再次感谢eryksun的建议!

原始答案:我想我找到了另一种对我有用的方法...代替使用HKEY_CURRENT_USER(将成为管理员),管理员帐户可以在HKEY_USERS下打开特定用户的注册表项。我将需要找到适当的用户的SID,但是我的设置知道该用户的名称(以及用于设置自动登录的密码),因此我认为这是可行的。对我来说,这要容易得多,因为所有代码都已经存在于一个程序中,该程序以前将EVERYTHING写入HKEY_LOCAL_MACHINE,这很容易且效果很好。试图“正确”是更多的工作,也许比应该做的更多!:-(

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Linux中以普通用户身份使用rpm -i

普通用户到Linux中的admin用户?

使用python中的子过程自动从普通用户切换到root用户

在Kali普通用户中安装XAMPP

普通用户在/ var / run中触摸文件失败

计算多个表中的普通用户数

无法以普通用户身份在Youtrack 6中登录

在Linux Mint 17.1中以普通用户挂载共享?

我无法在Ubuntu 18.04中以普通用户身份使用MySql

pgcrypto:普通用户无法使用

声音在root用户中无法正常运行,但在普通用户中可以正常运行

在python中如何从root用户获取普通用户名?

终端中普通用户和 root 用户的 $ 和 # 符号的含义

如何为普通用户启动/停止Tomcat(Linux CentOS中的root用户除外)

阻止普通用户访问 Windows 设置

在root脚本中以普通用户身份运行python run命令

如何在NixOS中以普通用户身份安装内部驱动器?

包管理器,用作家庭目录中的普通用户

在Docker centos映像中无法以普通用户身份ping

Telegram 中普通用户和机器人的区别

如何对普通用户隐藏DX DataGrid中的编辑选项

如何以普通用户的身份在nautilus中挂载分区?

普通用户应该如何阅读/ usr / share / doc中的文档?

如何在Ubuntu中为普通用户禁用时间和日期设置?

基于Ubuntu的发行版本构建:实时系统中的普通用户无法读取SKEL

在 ODOO V8 中无法以普通用户身份查看计算字段的结果

在 Linux 中以普通用户身份安装 Hyperledger Fabric 会引发错误

使用 sudoers 文件阻止普通用户访问命令

通过fstab以普通用户身份使用sshfs