Создать пользователя Windows программно c # .net (используя PricinpalUser / CreateProfile)

Короче говоря, я пытаюсь создать нового пользователя, который может войти в систему.

Я вытащил код из разных источников и попытался упростить его. Тем не менее, я бью несколько камней преткновения.

Когда я звонюUserPrincipal.Save() - это дает мне ошибку

«Свойство каталога не может быть найдено в кэше» с типом исключения .. «COMException пересекла собственную / управляемую границу».

По какой-то причине, когда я запускаю свою программу напрямую (не через vs2010), она работает нормально. Так что я могу обойти это!

Моя главная проблема заключается в том, что, хотя все кажется нормальным, когда я пытаюсь войти в систему, появляется сообщение «загрузка рабочего стола» или что-то в этом роде, а затем просто выдается «выход из системы». Так что, как будто профиль не был настроен правильно.

Возвращаемое значение из API «CreateProfile» не равно 0, так что, возможно, это вызывает проблему.

Есть ли что-нибудь еще, что мне нужно сделать?

Мой кодекс ...

private void Run(string un, string pw)
{
    UserPrincipal NewUP = CreateUser(un, pw);
    AddGroup(NewUP, "Users");
    AddGroup(NewUP, "HomeUsers");
    CreateProfile(NewUP);
}
private UserPrincipal CreateUser(string Username, string Password)
{
    PrincipalContext pc = new PrincipalContext(ContextType.Machine, Environment.MachineName);
    UserPrincipal up = UserPrincipal.FindByIdentity(pc, IdentityType.SamAccountName, Username);
    if (up == null)
    {
        up = new UserPrincipal(pc, Username, Password, true);
        up.UserCannotChangePassword = false;
        up.PasswordNeverExpires = false;
        up.Save(); // this is where it crashes when I run through the debugger
    }
    return up;
}
private void AddGroup(UserPrincipal Up, string GroupName)
{
    PrincipalContext pc = new PrincipalContext(ContextType.Machine, Environment.MachineName);
    GroupPrincipal gp = GroupPrincipal.FindByIdentity(pc, GroupName);
    if (!gp.Members.Contains(Up))
    {
        gp.Members.Add(Up);
        gp.Save();
    }
    gp.Dispose();
}
private void CreateProfile(UserPrincipal Up)
{
    int MaxPath = 240;
    StringBuilder pathBuf = new StringBuilder(MaxPath);
    uint pathLen = (uint)pathBuf.Capacity;
    int Res = CreateProfile(Up.Sid.ToString(), Up.SamAccountName, pathBuf, pathLen);
}

Ответы на вопрос(1)

Ваш ответ на вопрос