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

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

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

Когда я звоню 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 Ответ

1 голос
/ 22 мая 2012

Странно, но когда он запускается на сервере (т.е. не на моей машине для разработки), он работает нормально.У меня такое ощущение, что это как-то связано с Windows 7 или с моей конкретной установкой.

Спасибо за ваши предложения.

...