Windows服务中操作HKEY_CURRENT_USER注册表
2017-01-03 17:16
555 查看
主要思想是:在Windows服务(System)中,通过模拟用户登录,获得Session ID,然后对当前用户注册表项操作。
public IntPtr GetTokenAsCurrentUser()
{
IntPtr hTokenUser = IntPtr.Zero;
string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
if (String.Compare(@”NT AUTHORITY\SYSTEM”, userName, true) == 0)
{
int consoleSessionId = WTSGetActiveConsoleSessionId();
if (WTSQueryUserToken(consoleSessionId, out hTokenUser))
{
return hTokenUser;
}
}
return hTokenUser;
}
public bool GetCurrentUserSID(ref string CurrentUserSID)
{
IntPtr hUserToken = GetTokenAsCurrentUser();
if (hUserToken != IntPtr.Zero)
{
if (!ImpersonateLoggedOnUser(hUserToken))
{
return false;
}
CloseHandle(hUserToken);
}
public void Do()
{
string CurrentUserSID = string.Empty;
if (CTControlCenter.Common.AnalogLogon.AnalogLogon.GetCurrentUserSID(ref CurrentUserSID))
{
RegistryKey rsg = Registry.Users.OpenSubKey(CurrentUserSID + “\” + @”Software\Microsoft”, true);
if (rsg != null)
{
rsg.Close();
}
}
}
注:部分API属于C++接口,需要导入使用。
public IntPtr GetTokenAsCurrentUser()
{
IntPtr hTokenUser = IntPtr.Zero;
string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
if (String.Compare(@”NT AUTHORITY\SYSTEM”, userName, true) == 0)
{
int consoleSessionId = WTSGetActiveConsoleSessionId();
if (WTSQueryUserToken(consoleSessionId, out hTokenUser))
{
return hTokenUser;
}
}
return hTokenUser;
}
public bool GetCurrentUserSID(ref string CurrentUserSID)
{
IntPtr hUserToken = GetTokenAsCurrentUser();
if (hUserToken != IntPtr.Zero)
{
if (!ImpersonateLoggedOnUser(hUserToken))
{
return false;
}
CloseHandle(hUserToken);
System.Security.Principal.WindowsIdentity windowsIdentity = System.Security.Principal.WindowsIdentity.GetCurrent(); CurrentUserSID = windowsIdentity.User.ToString(); if (!RevertToSelf())//come back { } return true; } return false;
}
public void Do()
{
string CurrentUserSID = string.Empty;
if (CTControlCenter.Common.AnalogLogon.AnalogLogon.GetCurrentUserSID(ref CurrentUserSID))
{
RegistryKey rsg = Registry.Users.OpenSubKey(CurrentUserSID + “\” + @”Software\Microsoft”, true);
if (rsg != null)
{
rsg.Close();
}
}
}
注:部分API属于C++接口,需要导入使用。
相关文章推荐
- 如何在Windows服务程序中读写HKEY_CURRENT_USER注册表
- 如何读取指定用户的 HKEY_CURRENT_USER 注册表键
- VC 用服务进程开启有UI的进程和写注册表HKEY_CURRENT_USER子键的问题
- windows下服务或SYSTEM权限读取当前用户注册表HKEY_CURRENT_USER
- NT服务程序中对注册表中HKey_Current_User读取的问题
- 服务中读取当前用户注册表HKEY_CURRENT_USER
- 如何读取指定用户的 HKEY_CURRENT_USER 注册表键
- 如何读取指定用户的 HKEY_CURRENT_USER 注册表键收藏
- 服务中读取当前用户注册表HKEY_CURRENT_USER
- 如何读取指定用户的 HKEY_CURRENT_USER 注册表键
- system 权限读取注册表HKEY_CURRENT_USER
- 服务中访问 HKEY_CURRENT_USER
- 在内核中之获取HKEY_CURRENT_USER对应路径
- 2014-04-15第十六周周二工作日志:HKEY_CURRENT_USER
- 从系统服务进程访问HKEY_CURRENT_USER主键
- Impersonate时读取HKEY_CURRENT_USER的问题(Registry.CurrentUser为空)
- 在服务中模拟当前登录用户读取HKEY_CURRENT_USER
- SQLite Developer破解 cmd 运行 reg delete "HKEY_CURRENT_USER\SharpPlus\SqliteDev" /v "StartDate" /f
- 【转】在内核中之获取HKEY_CURRENT_USER对应路径
- [Delphi]解决Delphi Distiller运行报错"HKEY_CURRENT_USER\\" is of wrong kind or size