如何在我的非模拟自定义操作中获取SYSTEM帐户的环境变量?

时间:2018-01-22 18:57:21

标签: wix windows-installer custom-action

我有一个我在提交时运行的延迟自定义操作,并设置来模拟。在我的操作中调用System.Security.Principal.WindowsIdentity.GetCurrent()确认当前标识是针对NT AUTHORITY \ SYSTEM。

但是当我使用Environment.GetEnvironmentVariable()为我的操作获取一些输入时,它会返回我正常登录用户的值而不是SYSTEM的值:

var profilePath = Environment.GetEnvironmentVariable("USERPROFILE");
// profilePath == "c:\users\[myname]", expecting "C:\Windows\system32\config\systemprofile"

为什么会这样,我怎样才能获得SYSTEM的环境?谢谢!

2 个答案:

答案 0 :(得分:1)

一些可能有帮助的想法。

Windows Installer使用模拟很多,但它不会像LoadUserProfile那样加载用户的配置文件(就像交互式登录一样),因为该进程可能会在每次自定义操作调用时加载新的用户配置文件,具体取决于是否被冒充。作为系统帐户运行只是模仿,并不意味着加载了系统帐户的配置文件。

据我所知,您通过拥有系统帐户的访问令牌来获取此文件夹,然后使用Win32 API GetUserProfileDirectory()或托管等效项。

如果你描述了你想要完成的最终目标,这可能会有所帮助。目前尚不清楚这是XY Problem or not

答案 1 :(得分:0)

使用促进功能的overload

public static string GetEnvironmentVariable(
    string variable,
    EnvironmentVariableTarget target
)