我正在设置或读取作为本地系统运行的windows服务中的reg键。但是当我在注册表编辑器中读取或设置值时,它们与我从windows服务中读取和设置它们时不一样。
如果我从windows服务在powershell中执行以下命令,或者当我以用户身份登录时,结果也会不同。为什么?LocalSystem帐户是否有不同的LocalMachine ?
$DefaultUserName = (Get-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" -Name "DefaultUserName").DefaultUserName
Write-Host $DefaultUserName
我使用以下c#行从windows服务中执行powershell脚本:
var process = new Process();
process.StartInfo.UseShellExecute = false;
process.StartInfo.FileName = @"C:WindowsSysWOW64WindowsPowerShellv1.0powershell.exe";
process.StartInfo.Arguments = ""&'" + cacheFile + "'"";
process.StartInfo.Verb = "runas";
process.Start();
您需要小心比特。在64位Windows上,32位应用程序使用"Windows上的Windows"子系统运行,默认情况下使用不同的文件系统路径和注册表路径。您正在从SysWOW64
文件夹执行powershell,这意味着您正在执行32位版本,它将使用32位注册表单元。
如果你打开regedit,你的注册表项的32位hive是:ComputerHKEY_LOCAL_MACHINESOFTWAREWOW6432NodeMicrosoftWindows NTCurrentVersionWinlogon
。我怀疑你正在获取/设置这个值。
请参考如何使用32位Powershell访问64位注册表键而不重定向到WOW6432Node,了解您可以采取的策略,包括使用Sysnative
而不是SysWOW64
版本的Powershell。
如果您需要支持32位和64位操作系统,则需要确保使用了适当的技术。
这个答案对Windows内置帐户有很好的解释:"本地系统"帐户和"网络服务"帐户有什么区别?
一个有限的服务帐户,与Network service非常相似,用于运行标准的最低特权服务。然而,与网络服务不同的是,它以匿名用户
的身份访问网络
完全受信任的帐户,比管理员帐户更可信。在单个机器上没有什么是这个帐户不能做的,并且它有权作为机器访问网络(这需要活动目录并授予机器帐户对某些东西的权限)
你也可以尝试以SYSTEM的方式运行服务吗?