1

NetUserChangePasswordリモートコンピューターのパスワードを変更するために電話をかけようとしています。マシンにログインするときにパスワードを変更することはできますが、コードを介して変更することはできません。戻り値は2245で、これはパスワードが短すぎることを意味します。

私はこのリンクを読みました:http ://support.microsoft.com/default.aspx?scid = kb; en-us; 131226しかし、リンクの何も私に役立ちませんでした。(私のコードは、示された問題のいずれにも適合しないようでした。)

このエラーを修正する方法や、リモート(Windows 2003)マシンでユーザーのパスワードをプログラムで変更する別の方法がある場合は、それを聞いていただければ幸いです。

WindowsXPマシンでコードを実行しています。

これが私の現在のコードです-それが役立つ場合に備えて(また、うまく機能する私の作成ユーザーコードを示しています)。

public partial class Form1 : Form
{
    [DllImport("netapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    private static extern int NetUserAdd(
         [MarshalAs(UnmanagedType.LPWStr)] string servername,
         UInt32 level,
         ref USER_INFO_1 userinfo,
         out UInt32 parm_err);

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public struct USER_INFO_1
    {
        [MarshalAs(UnmanagedType.LPWStr)]
        public string sUsername;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string sPassword;
        public uint uiPasswordAge;
        public uint uiPriv;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string sHome_Dir;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string sComment;
        public uint uiFlags;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string sScript_Path;
    }

    [DllImport("netapi32.dll", CharSet = CharSet.Unicode, 
        CallingConvention = CallingConvention.StdCall, SetLastError = true)]
    static extern uint NetUserChangePassword(
        [MarshalAs(UnmanagedType.LPWStr)] string domainname,
        [MarshalAs(UnmanagedType.LPWStr)] string username,
        [MarshalAs(UnmanagedType.LPWStr)] string oldpassword,
        [MarshalAs(UnmanagedType.LPWStr)] string newpassword);

    // Method to change a Password of a user on a remote machine.
    private static uint ChangeUserPassword(string computer, string userName,
        string oldPassword, string newPassword)
    {
        return NetUserChangePassword(computer, userName, 
            oldPassword, newPassword);
    }


    // Method used to create a new user on a Remote Machine
    private static uint CreateUser(string computer, string userName, 
        string password)
    {
        const int UF_DONT_EXPIRE_PASSWD = 0x10000;
        const int UF_ACCOUNTDISABLE = 0x000002;

        const int USER_PRIV_GUEST = 0; // lmaccess.h:656
        const int USER_PRIV_USER = 1;   // lmaccess.h:657
        const int USER_PRIV_ADMIN = 2;  // lmaccess.h:658

        USER_INFO_1 userinfo = new USER_INFO_1()
        {
            sComment = "Scan Track User",
            sUsername = userName,
            sPassword = password,
            sHome_Dir = "",
            sScript_Path = "",
            uiPriv = USER_PRIV_USER,
            uiFlags = UF_DONT_EXPIRE_PASSWD
        };


        uint output;
        NetUserAdd(computer, 1, ref userinfo, out output);
        return output;
    }

    private void button1_Click(object sender, EventArgs e)
    {

        string computer = "10.1.9.115";
        string userName = "test2";
        string psswrd = "ssssss";
        string fullname = "";

        uint output = CreateUser(computer, userName, psswrd);
        MessageBox.Show(output.ToString());
    }


    private void button2_Click(object sender, EventArgs e)
    {
        string computer = "10.1.9.115";
        string userName = "test";
        string oldPassword = "!B3tt3rLuck!@!";
        string newPassword = "!B3tt3r-Luck2";

        uint result = ChangeUserPassword(computer, userName, 
            oldPassword, newPassword);

        MessageBox.Show(result.ToString());
    }


    public Form1()
    {
        InitializeComponent();
    }


}
4

3 に答える 3

3

このAPIの文書化されていない制限を発見するまで、最初の開発とテスト中に同じ問題に悩まされました。変更を成功させるには、変更しようとしているパスワードを実際に期限切れにする必要があります。

于 2012-09-06T14:09:49.087 に答える
1

エラー2245は、パスワード履歴の問題である可能性もあります。新しいパスワードは、最近使用されたものですか?

編集:この関数はServer 2003 SP 2の後で壊れたようです。ドキュメントの例を使用して、C++から関数を呼び出したときに同じエラーが発生しました。おそらくNetUserSetInfoを使用する必要があります。

于 2009-07-15T22:42:48.800 に答える
0

Windows 2008 R2のインストールでは、機能させるために2つのGPOを変更する必要がありNetUserChangePasswordました。

テストアカウントを作成したばかりで、この変更前のすべての試行で「パスワードが短すぎます」というエラーコードが発生したため、(GPOを介して)「最小パスワード経過時間」を0に設定する必要がありました。

私のVMはDCであるため、メソッドを機能させるには、テストユーザーがDCにログオンできるようにする必要がありました。

于 2013-08-15T09:01:57.630 に答える