2009-07-08 18 views
1

私はNetUserAddを呼び出しており、すべての呼び出しで24を返しています。誰が24の略語を知っていますか?私はエラーが何を意味するのかわからないとき、それをデバッグするのは難しいです。PInvoke of NetUserAdd返信24

私はこれを、ローカル管理者として実行されているWindows XPマシンから呼び出しています。私はまた、ターゲットコンピュータのローカル管理者です。私はUSER_INFO_1でこれを試してみましたが、うまくいきました。私は、USER_INFO_2によって与えられた制御のレベルが必要です。

このlinkには、この呼び出しの戻り値が表示されます。それらはさらに数値でhereと定義されています。悲しいことに、これらの値= 24はありません。

これは非常に具体的な質問です。私はPInvoke/NetAddUserエキスパートを見つけて私を助けてくれることを願っています。 ...

#define ERROR_BAD_LENGTH  24 

それはあなたのコードにどのように関連するかわからないが、そこにある:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] 
    public struct USER_INFO_2 
    { 
     public string name; 
     public string password; 
     public int password_age; 
     public int priv; 
     public string home_dir; 
     public string comment; 
     public int flags; 
     public string script_path; 
     public int auth_flags; 
     public string full_name; 
     public string usr_comment; 
     public string parms; 
     public string workstations; 
     public int last_logon; 
     public int last_logoff; 
     public ulong acct_expires; 
     public int max_storage; 
     public int units_per_week; 
     public IntPtr logon_hours; // This is a PBYTE 
     public int bad_pw_count; 
     public int num_logons; 
     public string logon_server; 
     public int country_code; 
     public int code_page; 
    } 

    [DllImport("netapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] 
    private static extern int NetUserAdd(
     [MarshalAs(UnmanagedType.LPWStr)] string servername, 
     UInt32 level, 
     ref USER_INFO_2 userinfo, 
     out UInt32 parm_err); 

    private static uint CreateUser(string computer, string userName, 
     string psswrd, string fullname) 
    { 
     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_2 userInfo2 = new USER_INFO_2() 
     { 
      acct_expires = long.MaxValue, 
      auth_flags = 0, // Must be 0 for NetUserAddCalls 
      bad_pw_count = -1, //ignored for NetUserAdd calls 
      //code_page = ?, 
      comment = "ScanTrack Account", 
      //country_code = ?, 
      flags = UF_DONT_EXPIRE_PASSWD,// & UF_ACCOUNTDISABLE, 
      full_name = fullname, 
      home_dir = "", 
      last_logoff = 0, 
      last_logon = 0, 
      logon_hours = IntPtr.Zero, // User is given no logon time. 
      logon_server = "", //ignored for NetUserAdd calls 
      max_storage = 0, 
      name = userName, 
      num_logons = -1, //ignored for NetUserAdd calls 
      parms = "", 
      password = psswrd, 
      password_age = -1, 
      priv = USER_PRIV_GUEST, 
      script_path = "", 
      units_per_week = -1, //ignored for NetUserAdd calls 
      usr_comment = "", 
      workstations = "" 
     }; 

     uint output; 
     NetUserAdd(computer, 2, ref userInfo2, out output); 
     return output; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 

     string computer = "ComputerName"; 
     string userName = "testName"; 
     string psswrd = "!t3st4Stuff"; 
     string fullname = "Test Name Full"; 

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

Heh - 質問後14分で、この質問はGoogleで「NetUserAddエラー+24」の最初のヒットです。 Googleはちょうど*大好きです*スタックオーバーフロー! – RichieHindle

+0

私はそれを数回見ました。私は私の質問をし、私の正確な質問を見つけるためだけに研究を続ける!私はそれが実際に私が尋ねた質問であることに気付くまで、私はとても興奮しています。彼らはGoogleで非常に速くなるためには良い魔法をやらなければなりません。 – Vaccano

+0

私は、Googleの開発者の半分がここにいると思っています。いくつかの影響力のある開発者(または開発マネージャ)がいくつかの文字列を引っ張っています。私は別の可能な手がかりで私の答えを更新しました。 – RichieHindle

答えて

1

をError.hから:ここで

は、それが重要な場合は私のコードです。

編集:私はそれがこののかどうか疑問に思う:

home_dir = "" 

または類似 - ドキュメントがusri2_nameメンバーで指定されたユーザのホームディレクトリのパスを指定するUnicode文字列へ」ポインタを言います。文字列はnullでもかまいません。 - あなたはそれを持っているので、文字列が与えられているが空ではないという言葉はありません。試してみてくださいnull - 長さがゼロの文字列は、ERROR_BAD_LENGTHを意味する可能性があります。

+0

私はUSER_INFO_1の使用に戻りました。私は答えを授けています。なぜなら、それを再びデバッグすることになったからです。 助けてくれてありがとう! – Vaccano

+1

コマンドラインで、 "net helpmsg <エラー番号>"と入力すると、人間の言葉でエラーが返されます。かなり便利です。 24の場合、「プログラムがコマンドを発行しましたが、コマンドの長さが正しくありません」というメッセージが返されました。 – Mike