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