我正在尝试使用Redmon http://www.winimage.com/misc/redmon/向一个定制的C#应用程序发送打印作业。Redmon以系统身份“运行”(实际上是打印假脱机程序),但可以选择以用户身份运行,以允许您的应用程序在打印作业的用户下运行。问题是它似乎没有加载用户的环境。因此,调用像Path.GetTempPath()这样的函数会指向\windows\temp,而不是用户的\windows\ temp。此外,当试图通过MAPI调用运行Outlook时(添加附件),它会报告由于临时文件夹位置而导致的表单错误。
有没有办法“重新加载”配置文件,或者至少在被模拟的应用程序中获得您的环境变量?到目前为止,我唯一的想法是直接从注册表重新构建var,但我想避免这种情况,因为这是一种变通的做法(避免实现细节等)。或者创建一个Redmon调用的存根程序,然后以具有完整配置文件的用户身份正确运行自定义应用程序。
还有其他的项目或技巧吗?
发布于 2010-06-13 23:07:01
我最终找到了一种方法来加载用户的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);
}发布于 2018-06-20 22:27:28
我在Windows 10上也遇到了同样的问题。
我注意到,如果应用程序的.exe文件设置了“以管理员身份运行”标志,它将以用户系统身份运行。删除此标志使我的应用程序使用用户的权限和环境变量运行,这正是我所需要的。
https://stackoverflow.com/questions/2878770
复制相似问题