2016-10-14 7 views
1

프로세스의 사용자 프로필 디렉터리가 아직 생성되지 않은 프로세스를 실행하는 데 문제가 있습니다. Windows에서 실행중인 사용자의 프로필 디렉터리를 만들도록하는 방법

우리는 큰 분산 서버 그리드를 실행하고이 그리드 프로세스를 실행하는 시냅스를 사용하여 (부분)되어, 여기에 설명 할

는 이런 일이 방법의 세부 사항입니다. DataSynapse에 익숙한 사람들을 위해 엔진은 "RunAs"라는 특정 서비스를 실행하도록 구성되어 있습니다. 여기서 "RunAs"는 서비스 프로세스에 특정 AD 도메인 서비스 계정을 사용합니다. 문제는 DataSynapse가 "runas"에서 프로세스를 실행할 때 LoadUserProfile 플래그를 설정하지 않는다는 것입니다. 정확한 이유가 무엇이든간에 "runas"서비스 계정 (및 AD 도메인 계정)이 일부 표 시스템에 로그온하지 않은 경우 해당 시스템에는 계정의 사용자 프로필 디렉토리가 없습니다.

DataSynapse에 익숙하지 않은 사용자를 위해 더 일반적인 설명이 나와 있습니다. 그리드의 각 시스템에는 실행중인 프로세스가 있으며 dsService이라고하며 로컬 시스템의 시스템 계정 (또는 높은 자격 증명을 가진 유사한 계정)의 자격 증명으로 실행됩니다. dsService 프로세스는 하위 프로세스 (예 : childProcess)를 생성하지만 serviceUser이라고하는 Google의 AD 도메인 계정의 자격 증명에서 childProcess을 실행합니다. 그리드에는 수천 대의 시스템이 있으며 일반적으로 수동으로 로그온하지 않습니다. 특히 프로파일 디렉토리 C:\users\serviceUser은 처음에는 존재하지 않을 수 있습니다. 한 번 생성되면 더 이상 문제가 없습니다. 그러나 새 노드가 그리드에 추가되면 일반적으로 처음에는 C:\users\serviceUser이 생성되지 않습니다. 문제는 dsServicechildProcess을 생성 할 때 C:\users\serviceUser이 생성되지 않아이를 필요로한다는 것입니다.

나는 childProcess 산란 할 때 내가 확실하지 오전하지만 dsService이 true로 LoadUserProfile 플래그를 설정하지 않기 때문에이 것을을 생각 . 어떤 경우

childProcess은 (.NET) 과정을 우리의 통제 (serviceUser로 실행), 그리고 내가 (C#으로) 방법이 있는지 childProcess이를 만들기 위해 OS를 강제 할 수 있음을 알고 싶습니다 실행중인 사용자의 프로필 디렉토리C:\users\serviceUser 아직 존재하지 않는다고 판단한 경우?

편집 : 하나 다른 사용자 ID로 프로세스를 시작하고, 사용자의 로컬 프로필가 아직 생성되지 않은 경우 사용자의 프로파일 디렉토리, 더 구체적으로이 (없는 경우 실험이 확인했다고 - 단순히 사전 삭제 - 존재하는 프로필 디렉토리는 다른 상황을 만듭니다. 우리가 아무렇지도 않게 관심을 가지면) (1) LoadUserProfile이 true로 설정된 프로세스가 시작되면 프로필 디렉토리 (하나는 가정, 로컬 프로필)가 생성됩니다. (2) LoadUserProfile을 false로 설정하여 프로세스가 시작되면 프로필 디렉토리 (하나는 로컬 프로필)가 생성되지 않습니다. 이는 의미가 있으며 예상대로입니다.

관련 게시물 : 실행중인 계정에 관리자 권한이있는 경우 stackoverflow.com/q/9008742/1082063

+0

"사용자 디렉토리"를 사용해야합니까? 이것은 자신의 프로그램 디렉토리에 데이터를 저장해야하는 응용 프로그램 유형 또는 하드 드라이브의 다른 위치에서 작성하는 디렉토리에있는 것 같습니다. –

+0

아니요, 사용자 컨텍스트에서 수행 할 수 없습니다. DataSynapse에서 사용자 프로필을 만드는 옵션을 제공하지 않고 사용자 프로필이 있어야한다는 요구 사항을 무시할 수없는 경우 로컬 시스템이나 적절한 권한을 가진 다른 계정으로 실행되도록 일부 코드를 준비해야합니다. –

+0

먼저 프로파일을 단순히 작성하는 것이 실제로 충분한 지 테스트해야합니다. 코드에서 프로필이 * loaded *가 아닌 * 초기화되어야한다고 요구하면 더 어려운 문제가 발생합니다. 프로필을 초기화하는 유일한 방법은 사용자가 대화 형으로 로그온하는 것입니다. –

답변

0

다음 코드는 사용자 프로필 디렉토리를 포함하여, 실행중인 계정의 프로필의 생성의 원인이됩니다.관리자없이, 나는 그것이 가능하면 모르는 : 계정이 관리자가 아닌 경우 사람이 어떻게 이렇게 말해 줄 수 있다면

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; 
} 

, 그들은 정답으로 받아 들여 자신의 답변을 얻을 것입니다. 그때까지는 적어도 다른 사람들에게 약간의 아이디어를줍니다.