#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 напрямую, поскольку он немного чище. Имеет ли это смысл?