gpt4 book ai didi

c# - Redmon 的用户运行身份不加载用户的环境变量

转载 作者:行者123 更新时间:2023-11-30 14:04:04 24 4
gpt4 key购买 nike

我正在尝试使用 Redmon http://www.winimage.com/misc/redmon/将打印作业发送到自定义 C# 应用程序。 Redmon 以 SYSTEM 身份“运行”(实际上是打印后台处理程序),但可以选择以用户身份运行,以允许您的应用程序在打印作业的用户下运行。问题是它似乎没有加载用户的环境。因此调用 Path.GetTempPath() 之类的函数指向\windows\temp 而不是用户的。此外,当尝试通过 MAPI 调用(添加附件)运行 Outlook 2007+ 时,它会报告由于临时文件夹位置而导致的表单错误。

有没有办法“重新加载”配置文件或至少在模拟应用程序中获取您的环境变量?到目前为止我唯一的想法是直接从注册表重建 vars,但我想避免这种情况,因为它是一个 hack around(避免实现细节和所有这些)。或者制作一个 Redmon 调用的 stub 程序,然后以具有完整配置文件的自定义应用程序正确地以用户身份运行。

还有其他元素或技巧吗?

最佳答案

我最终找到了一种方法来加载用户的 EnvironmentBlock,提取每个变量并将它们加载到我现有的环境中。基于几个页面的代码和想法:

请原谅我的 C# 代码,感谢任何调整:

[DllImport("userenv.dll", SetLastError = true)]
private static extern bool CreateEnvironmentBlock(ref IntPtr lpEnvironment, IntPtr hToken, bool bInherit);

[DllImport("advapi32.dll", SetLastError = true)]
private static extern bool OpenProcessToken(IntPtr ProcessHandle, UInt32 DesiredAccess, ref IntPtr TokenHandle);
private const uint TOKEN_QUERY = 0x0008;

[DllImport("kernel32.dll")]
static extern IntPtr GetCurrentProcess();

[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool CloseHandle(IntPtr hObject);

private static void ReloadEnviroVars()
{
IntPtr hToken = IntPtr.Zero;
IntPtr envBlock = IntPtr.Zero;

//Load this user's environment variables
OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, ref hToken);
bool retVal = CreateEnvironmentBlock(ref envBlock, hToken, false);

//Extract each environment variable from the envroblock and add it to
// our running program's environment vars
int offset = 0;
while (true) {
//EnviroBlock is an array of null-terminated unicode strings
IntPtr ptr = new IntPtr(envBlock.ToInt64() + offset);
string Enviro = Marshal.PtrToStringUni(ptr);
offset += Encoding.Unicode.GetByteCount(Enviro) + 2;
if (string.IsNullOrEmpty(Enviro))
break;
string EnviroKey = Enviro.Substring(0, Enviro.IndexOf("="));
string EnviroValue = Enviro.Substring(Enviro.IndexOf("=") + 1, Enviro.Length - 1 - Enviro.IndexOf("="));
Environment.SetEnvironmentVariable(EnviroKey, EnviroValue);
}

CloseHandle(hToken);
}

关于c# - Redmon 的用户运行身份不加载用户的环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2878770/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com