繁体   English   中英

如何强制Windows创建正在运行的用户的配置文件目录

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM