Windows服务以LocalSystem运行时读写注册表结果与手动操作不一致问题
问题原因
你遇到的执行结果差异由WOW64注册表重定向机制导致,和LocalSystem账户本身访问HKLM的权限/路径无关:
你在C#代码中调用的是C:\Windows\SysWOW64\路径下的PowerShell,这是32位版本的PowerShell程序。64位Windows系统会对所有32位程序的注册表访问做自动重定向:当32位程序访问HKLM:\SOFTWARE路径时,系统会自动将请求映射到HKLM:\SOFTWARE\WOW6432Node路径下;而你手动打开的注册表编辑器默认是64位版本,直接访问原生64位HKLM:\SOFTWARE路径,两者读写的根本不是同一个注册表项,因此结果不一致。
解决方案
方案1:调用64位PowerShell(最简便)
将C#代码中PowerShell的启动路径替换为64位版本即可,修改后的代码如下:
var process = new Process(); process.StartInfo.UseShellExecute = false; process.StartInfo.FileName = @"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"; process.StartInfo.Arguments = "\"&'" + cacheFile + "'\""; process.StartInfo.Verb = "runas"; process.Start();
修改后服务内执行的PowerShell不会触发注册表重定向,访问的路径和手动操作注册表编辑器的路径完全一致。
方案2:32位PowerShell指定访问64位注册表视图
如果必须使用32位PowerShell,可以修改PowerShell代码,显式指定访问64位注册表视图,代码如下:
$reg = [Microsoft.Win32.RegistryKey]::OpenBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine, [Microsoft.Win32.RegistryView]::Registry64) $winlogonKey = $reg.OpenSubKey("SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon") $DefaultUserName = $winlogonKey.GetValue("DefaultUserName") Write-Host $DefaultUserName
内容的提问来源于stack exchange,提问作者user3077796
相关产品推荐
相关产品推荐

