簡體   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