2009-07-15 2 views
1

NetUserChangePasswordに電話して、リモートコンピュータのパスワードを変更しようとしています。私はマシンにログインするときにパスワードを変更することができますが、コードで行うことはできません。戻り値は2245で、Password Beingが短すぎます。リモートユーザーのパスワードを変更する方法が必要です - NetUserChangePasswordが2245で失敗する

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

このエラーを修正する方法や、リモートのWindows 2003マシンでユーザーのパスワードをプログラムで変更する方法がある場合は、それを聞いて感謝しています。

私はWindows XPマシンでコードを実行しています。

ここに私の現在のコードが入っています。それは参考になりました。

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 = "[email protected]!"; 
     string newPassword = "!B3tt3r-Luck2"; 

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

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


    public Form1() 
    { 
     InitializeComponent(); 
    } 


} 

答えて

1

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

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

+0

私はそれもそうだと思いました。私はそれを完全にユニークなものに変更しましたが、それでも失敗しました。 (考えてくれてありがとう)。 – Vaccano

3

私はこのAPIの文書化されていない制限が見つかるまで、最初の開発とテストで同じ問題を抱えていました。変更しようとしているパスワードは変更が成功するためには必ず期限切れになります。

0

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

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

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