You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 23:27:03