Pergunta

Como posso criar uma conta de usuário local usando .NET 2.0 e C # e também ser capaz de definir a "senha nunca expira" a nunca.

Eu tentei usar "Net.exe" usando Process.Start e passando seus parâmetros, mas parece que a "net user" é incapaz de definir a "senha nunca expira" para nunca mais.

Foi útil?

Solução

Leia este excelente artigo CodeProject

Howto: (Quase) tudo Em Active Directory via C #

Há uma seção "Criar Conta do Usuário" e "Lidando com senhas de usuário".

UPDATE:

Para adaptar o código para contas locais substituir as respectivas linhas com estes:

DirectoryEntry localMachine = new DirectoryEntry("WinNT://" + 
    Environment.MachineName);
DirectoryEntry newUser = localMachine.Children.Add("localuser", "user");

Aqui começa o trecho de código original para contas de domínio:

public string CreateUserAccount(string ldapPath, string userName, 
    string userPassword)
{
    string oGUID = string.Empty;
    try
    {          
        string connectionPrefix = "LDAP://" + ldapPath;
        DirectoryEntry dirEntry = new DirectoryEntry(connectionPrefix);
        DirectoryEntry newUser = dirEntry.Children.Add
            ("CN=" + userName, "user");
        newUser.Properties["samAccountName"].Value = userName;

        int val = (int)newUser.Properties["userAccountControl"].Value; 
        newUser.Properties["userAccountControl"].Value = val | 0x10000; 

        newUser.CommitChanges();
        oGUID = newUser.Guid.ToString();

        newUser.Invoke("SetPassword", new object[] { userPassword });
        newUser.CommitChanges();

        dirEntry.Close();
        newUser.Close();
    }
    catch (System.DirectoryServices.DirectoryServicesCOMException E)
    {
        //DoSomethingwith --> E.Message.ToString();    
    }
    return oGUID;
}

Existem alguns detalhes para entender quando se lida com senhas do usuário e limites em torno senhas como forçando o usuário a mudar a sua senha no próximo logon, negando o usuário o direito de alterar a sua própria senhas, senhas de configuração de nunca expirar, quando a expirar, e estes tarefas podem ser realizadas usando sinalizadores UserAccountControl que são demonstrada no procedimento seções.

Por favor, consulte esta grande MSDN artigo: Gerenciando senhas de usuário para exemplos e documentação em relação a estes recursos.

CONST                          HEX
------------------------------------------
SCRIPT                         0x0001
ACCOUNTDISABLE                 0x0002
HOMEDIR_REQUIRED               0x0008
LOCKOUT                        0x0010
PASSWD_NOTREQD                 0x0020
PASSWD_CANT_CHANGE             0x0040
ENCRYPTED_TEXT_PWD_ALLOWED     0x0080
TEMP_DUPLICATE_ACCOUNT         0x0100
NORMAL_ACCOUNT                 0x0200
INTERDOMAIN_TRUST_ACCOUNT      0x0800
WORKSTATION_TRUST_ACCOUNT      0x1000
SERVER_TRUST_ACCOUNT           0x2000
DONT_EXPIRE_PASSWORD           0x10000
MNS_LOGON_ACCOUNT              0x20000
SMARTCARD_REQUIRED             0x40000
TRUSTED_FOR_DELEGATION         0x80000
NOT_DELEGATED                  0x100000
USE_DES_KEY_ONLY               0x200000
DONT_REQ_PREAUTH               0x400000
PASSWORD_EXPIRED               0x800000
TRUSTED_TO_AUTH_FOR_DELEGATION 0x1000000

Outras dicas

Este código irá criar uma conta local com a senha nunca expira conjunto de opções:

        using System.DirectoryServices;

        DirectoryEntry hostMachineDirectory = new DirectoryEntry("WinNT://localhost");
        DirectoryEntries entries = hostMachineDirectory.Children;
        bool userExists = false;
        foreach (DirectoryEntry each in entries)
        {
            userExists = each.Name.Equals("NewUser",  
            StringComparison.CurrentCultureIgnoreCase);
            if (systemtestUserExists)
                break;
        }

        if (false == userExists)
        {
            DirectoryEntry obUser = entries.Add("NewUser", "User");
            obUser.Properties["FullName"].Add("Local user");
            obUser.Invoke("SetPassword", "abcdefg12345@");
            obUser.Invoke("Put", new object[] {"UserFlags", 0x10000});
            obUser.CommitChanges();
        }

Os meios 0x10000 bandeira PasswordNeverExpires.

Passei muito tempo tentando descobrir como criar uma conta de usuário local com a senha definida para não expirar. Parece que quando você tentar usar:

int val = (int)newUser.Properties["userAccountControl"].Value; 
newUser.Properties["userAccountControl"].Value = val | 0x10000

permissões de diretório ativo entram em jogo. Se você tiver permissões do Active Directory tudo funciona bem. Se não, em seguida, obter a propriedade userAccountControl sempre resultará em um valor nulo. Tentando set userAccountControl irá resultar em uma exceção "A propriedade de diretório não pode ser encontrada no cache".

No entanto, depois de muita caça ao redor eu encontrei uma outra propriedade "UserFlags" que precisa ser definida usando Invoke. Você pode usar isso para definir o sinalizador em uma conta local. Eu tentei este código e funcionou no Windows Server 2008.

Espero que isso ajude

usando System.DirectoryServices;

    DirectoryEntry hostMachineDirectory = new DirectoryEntry("WinNT://localhost");
    DirectoryEntries entries = hostMachineDirectory.Children;
    bool userExists = false;
    foreach (DirectoryEntry each in entries)
    {
        userExists = each.Name.Equals("NewUser",  
        StringComparison.CurrentCultureIgnoreCase);
        if (systemtestUserExists)
            break;
    }

    if (false == userExists)
    {
        DirectoryEntry obUser = entries.Add("NewUser", "User");
        obUser.Properties["FullName"].Add("Local user");
        obUser.Invoke("SetPassword", "abcdefg12345@");
        obUser.Invoke("Put", new object[] {"UserFlags", 0x10000});
        obUser.CommitChanges();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top