我一直在尝试在Windows 7机器上创建新的本地用户帐户。我使用了System.DirectoryServices.DirectoryEntry类(如这里所示),但似乎并不起作用。
以下是文章中的代码:
static void Main(string[] args)
{
try
{
DirectoryEntry AD = new DirectoryEntry("WinNT://" +
Environment.MachineName + ",computer");
DirectoryEntry NewUser = AD.Children.Add("TestUser1", "user");
NewUser.Invoke("SetPassword", new object[] {"#12345Abc"});
NewUser.Invoke("Put", new object[] {"Description", "Test User from .NET"});
NewUser.CommitChanges();
DirectoryEntry grp;
grp = AD.Children.Find("Guests", "group");
if (grp != null) {grp.Invoke("Add", new object[] {NewUser.Path.ToString()});}
Console.WriteLine("Account Created Successfully");
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.ReadLine();
}
}
执行以下代码时,
DirectoryEntry NewUser = AD.Children.Add("TestUser1", "user");
我遇到了一个
System.Runtime.InteropServices.COMException
异常,错误消息为“{"Unknown error (0x80005000)"}
”,错误代码为-2147463168
。
我猜这可能是因为该文章针对的是Windows XP及以下版本的计算机,而我正在针对Windows 7和Windows Server 2008。
任何帮助都将不胜感激!
更新:
出于某种神秘的原因,我不再看到那个System.Runtime.InteropServices.COMException
了,但是,在提交更改时,这里会出现newuser.CommitChanges()
“UnAuthorizedAccessException
”。我尝试以管理员身份运行应用程序,但仍未解决。
更新2:
好的,在更改为UserPrincipal类后,我让以下代码起作用:
public UserPrincipal CreateNewUser(string sUserName, string sPassword)
{
// first check that the user doesn't exist
if (GetUser(sUserName) == null)
{
PrincipalContext oPrincipalContext = GetPrincipalContext();
UserPrincipal oUserPrincipal = new UserPrincipal(oPrincipalContext);
oUserPrincipal.Name = sUserName;
oUserPrincipal.SetPassword(sPassword);
//User Log on Name
//oUserPrincipal.UserPrincipalName = sUserName;
oUserPrincipal.Save();
return oUserPrincipal;
}
// if it already exists, return the old user
return GetUser(sUserName);
}
}
当我将这段代码作为控制台应用程序运行时,它可以正常运行-当然需要以管理员身份运行-但是当我将其部署为Windows服务,并将安全帐户设置为“LocalSystem”时,我收到一个InvalidOperationException异常,显示“基础存储不支持此属性”。 有什么想法?