C # ActiveDirectory — Как мне удаленно добавить учетную запись локального пользователя с компьютера, присоединенного к домену, на компьютер, не являющийся доменом

#c# #active-directory

#c# #active-directory

Вопрос:

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

Можно ли использовать DirectoryEntry для этого?

Вот код, который у меня есть в настоящее время (слегка измененный для удобства чтения):

     private string AddLocalAdmin_NonDomain(string ComputerName)
    {
        StartImpersonation(); //Uses advapi32.dll->LogonUser()
        string ErrMsg = "";
        const int ADS_UF_DONT_EXPIRE_PASSWD = 0x10000;
        DirectoryEntry AD = new DirectoryEntry("WinNT://"   ComputerName   ",computer", ComputerName   "\"   UserCredentials.Username, UserCredentials.Password);
        object n = AD.NativeObject;
        DirectoryEntry NewUser = AD.Children.Add(Username, "user");
        NewUser.Invoke("SetPassword", new object[] { Password });
        if (!PasswordExpires)
        {
            int val = ADS_UF_DONT_EXPIRE_PASSWD;
            NewUser.InvokeSet("userFlags", new object[] { val });
        }
        NewUser.CommitChanges();
        DirectoryEntry grp;
        grp = AD.Children.Find("Administrators", "group");
        if (grp != null) { grp.Invoke("Add", new object[] { NewUser.Path.ToString() }); }
        EndImpersonation(); //Ends the impersonation
        return ErrMsg; //returns "Access Denied"
    }
  

Ответ №1:

Вы можете использовать

 System.DirectoryServices.AccountManagement
  

и для достижения этого вот код

 PrincipalContext oPrincipalContext = new PrincipalContext(ContextType.Machine);

//Create New User
UserPrincipal oUserPrincipal = new UserPrincipal(oPrincipalContext, "Your UserName", "Your Password", true /*Enabled or not*/);

oUserPrincipal.UserPrincipalName = "Your UserName";
oUserPrincipal.GivenName = "Given Name";
oUserPrincipal.Surname = "Surname";
oUserPrincipal.Save();

//Add User to Group
GroupPrincipal oGroupPrincipal = GroupPrincipal.FindByIdentity(oPrincipalContext, "Your Group Name");
oGroupPrincipal.Members.Add(oUserPrincipal);
oGroupPrincipal.Save();
  

для полной реализации перейдите сюда http://anyrest.wordpress.com/2010/06/28/active-directory-c /

Комментарии:

1. Спасибо за ответ. Этот метод намного удобнее, чем мой запрос ASDI. К сожалению, этот метод работает на машинах в том же домене, но не на несоединенных машинах. Я попытался передать учетные данные в oPrincipalContext, а также использовать метод LogonUser. Есть идеи?

2. Извините, я не совсем понимаю ваш ответ, вы имеете в виду, что вы запрашиваете пользователей на локальном компьютере только без домена?

3. Извините. Позвольте мне пояснить, что я пытаюсь сделать: я хочу удаленно добавить администратора с моего рабочего стола DESK1 (в домене XDEV) на SERVER1 (вообще без домена) с помощью этого приложения. Я могу добавить на любой компьютер в том же домене, на котором у меня есть учетная запись администратора. Я также могу выдавать себя за другую учетную запись (т.Е. TECHADMIN), который является локальным администратором на этом компьютере. Проблема заключается в том, что мне нужно добавить пользователя на недоменный компьютер с компьютера, находящегося в домене. Я не совсем на 100% уверен, что это возможно. Я могу использовать psexec, но я надеялся использовать AD напрямую, поскольку он немного чище. Имеет ли это смысл?