20

.NET 2.0 と c# を使用してローカル ユーザー アカウントを作成し、「パスワードを無期限にする」を無期限に設定するにはどうすればよいですか。

Process.Start を使用して「Net.exe」を使用し、そのパラメーターを渡そうとしましたが、「ネット ユーザー」は「パスワードを無期限にする」を無期限に設定できないようです。

4

3 に答える 3

23

このコードは、パスワードを無期限にするオプション セットを使用してローカル アカウントを作成します。

        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();
        }

0x10000 フラグは、PasswordNeverExpires を意味します。

パスワードが期限切れにならないように設定されたローカル ユーザー アカウントを作成する方法を考えるのに長い時間を費やしました。使用しようとすると次のようになります。

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

Active Directory からのアクセス許可が有効になります。Active Directory のアクセス許可があれば、すべて正常に動作します。そうしないと、userAccountControl プロパティを取得すると常に null 値になります。userAccountControl を設定しようとすると、「ディレクトリ プロパティがキャッシュに見つかりません」という例外が発生します。

しかし、いろいろ探し回った結果、Invoke を使用して設定する必要がある別のプロパティ「UserFlags」を見つけました。これを使用して、ローカル アカウントにフラグを設定できます。このコードを試してみたところ、Windows Server 2008 で動作しました。

お役に立てれば

于 2009-03-24T11:52:39.420 に答える
22

この優れた CodeProject の記事を読む

ハウツー: (ほぼ) C# 経由の Active Directory のすべて

「ユーザー アカウントの作成」セクションと「ユーザー パスワードの取り扱い」セクションがあります。

アップデート:

コードをローカル アカウントに適合させるには、それぞれの行を次のように置き換えます。

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

ドメイン アカウントの元のコード スニペットを次に示します。

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;
}

ユーザーのパスワードとパスワードに関する境界を扱う際には、理解しておくべき詳細がいくつかあります。たとえば、次回のログオン時にユーザーにパスワードの変更を強制する、ユーザーが自分のパスワードを変更する権利を拒否する、パスワードを無期限に設定する、いつ期限切れにするかなどです。 、およびこれらのタスクは、以降のセクションで説明されている UserAccountControl フラグを使用して実行できます。

これらの機能に関する例とドキュメントについては、 MSDN の素晴らしい 記事: Managing User Passwordsを参照してください。

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
于 2008-12-21T10:02:05.113 に答える
0

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();
于 2013-02-28T03:25:55.140 に答える