我正在尝试将许多重复的安装任务封装到一个私人安装程序中。该程序供内部使用,用于为工业用户设置定制的单用途系统。我需要管理员特权才能为我们的环境调整许多Windows设置,然后我需要为要使用的应用程序软件包设置一些当前用户设置。
是否可以在不再需要admin特权的情况下,在清单中使用requireAdministrator的Windows程序(使用Visual Studio 2017创建的纯C语言)还原为启动该程序的用户?我已经在Linux上看到了此操作,但是无法找到在Windows中完成此操作的任何示例(甚至提及)。救命?请?
最终答案当我终于能够在备用系统上安装干净的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] 删除。
我来说两句