[英]How to force Windows to create the running user's profile directory
我在运行一个进程时遇到问题,该进程的用户的配置文件目录尚未创建。
解释一下,这是如何发生的详细信息:
我们运行一个大型的分布式服务器网格,并使用DataSynapse(的一部分)在此网格上执行进程。 对于熟悉DataSynapse的用户,引擎配置为使用“ RunAs”运行特定服务,在该服务中,我们使用特定的AD域服务帐户进行服务进程。 我相信问题在于,DataSynapse在“ runas”下运行该进程时,不会设置LoadUserProfile
标志(也不应该)。 不管确切原因是什么,如果“ runas”服务帐户(和AD域帐户)从未登录到某些网格计算机,则这些计算机将没有该帐户的用户配置文件目录。
对于不熟悉DataSynapse的用户,这是一个更通用的解释。 在网格上的每台计算机上,都有一个正在运行的进程,我将其称为dsService
,它在本地计算机的系统帐户(或具有较高凭据的某些类似帐户)的凭据下运行。 dsService
进程将生成一个子进程,例如childProcess
,但它将在我们的AD域帐户的凭据下运行childProcess
,我将其称为serviceUser
。 网格上有数千台计算机,通常它们永远不会手动登录。 特别是,配置文件目录C:\\users\\serviceUser
最初可能不存在。 一旦创建一次,就没有其他问题了。 但是,如果将新节点添加到网格,通常它们最初将没有C:\\users\\serviceUser
。 问题在于,当dsService
生成childProcess
,不会创建C:\\users\\serviceUser
,而我们需要它。
我认为 ,这是因为dsService
不在设定LoadUserProfile
产卵时标志设置为true childProcess
,虽然我不能肯定。
无论如何, childProcess
是一个(.net)进程(以serviceUser
身份运行),在我们的控制之下, 我想知道是否有某种方式(在C#中) childProcess
可以强制OS创建运行用户的配置文件目录 C:\\users\\serviceUser
何时确定尚不存在?
编辑:实验已经确认,如果一个用户使用另一个用户ID启动进程,并且该用户的个人资料目录不存在(更具体地说,如果尚未创建该用户的本地个人资料 -仅删除现有的个人资料目录会创建一个不同的个人资料情况下,无论如何我们都不感兴趣),然后(1)如果在LoadUserProfile
设置为true的情况下启动进程,则会创建配置文件目录(并且一个是本地配置文件); (2)如果在LoadUserProfile
设置为false的情况下启动该进程,则不会创建配置文件目录(以及一个假定的本地配置文件)。 这是有道理的,正如人们所期望的那样。
相关文章:stackoverflow.com/q/9008742/1082063
如果正在运行的帐户具有管理员权限,则以下代码将导致创建正在运行的帐户的配置文件,包括其UserProfile目录。 没有管理员,我不知道是否有可能:
using System.Runtime.InteropServices;
...
[DllImport("userenv.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern int CreateProfile(
[In] string pszUserSid,
[In] string pszUserName,
System.Text.StringBuilder pszProfilePath,
int cchProfilePath);
....
public static string getUserProfilePath()
{
string userProfilePath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
if(string.IsNullOrWhiteSpace(userProfilePath) || !Directory.Exists(userProfilePath))
{ //This will only work if we have admin...
var pathBuf = new System.Text.StringBuilder(240);
var Up = System.DirectoryServices.AccountManagement.UserPrincipal.Current;
if( 0 == CreateProfile(Up.Sid.ToString(), Up.SamAccountName, pathBuf, pathBuf.Capacity) }
{
userProfilePath = pathBuf.ToString();
}
}
return userProfilePath;
}
如果有人可以在帐户不是管理员时告诉我该怎么做,他们将把他们的答案作为正确答案接受。 在此之前,这至少会给其他人一些想法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.