C# NetUserAdd的PInvoke返回24

C# NetUserAdd的PInvoke返回24,c#,winapi,pinvoke,C#,Winapi,Pinvoke,我正在呼叫NetUserAdd,每次呼叫都返回24。有人知道24代表什么吗?当我不知道错误的含义时,调试它有点困难 我是从一台以本地管理员身份运行的Windows XP计算机上调用此功能的。我也是目标计算机上的本地管理员。我尝试了这个与用户_信息_1,它工作得很好。我只需要用户\u INFO\u 2给出的控制级别 这将显示此调用的返回值。它们用数值进一步定义。遗憾的是,这些值都不等于24 我知道这是一个非常具体的问题。我想我希望能找到一位PInvoke/NetAddUser专家来帮助我 以下是我

我正在呼叫NetUserAdd,每次呼叫都返回24。有人知道24代表什么吗?当我不知道错误的含义时,调试它有点困难

我是从一台以本地管理员身份运行的Windows XP计算机上调用此功能的。我也是目标计算机上的本地管理员。我尝试了这个与用户_信息_1,它工作得很好。我只需要用户\u INFO\u 2给出的控制级别

这将显示此调用的返回值。它们用数值进一步定义。遗憾的是,这些值都不等于24

我知道这是一个非常具体的问题。我想我希望能找到一位PInvoke/NetAddUser专家来帮助我

以下是我的代码,以备不时之需:

    [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());
    }
从错误。h:

#define ERROR_BAD_LENGTH        24
…不确定这与您的代码有什么关系,但确实如此

编辑:我想知道是不是这个:

home_dir = ""
或者类似的-文档中说“指向一个Unicode字符串的指针,该字符串为
usri2\u name
成员指定的用户指定主目录的路径。该字符串可以为空。”-这里没有提到给定的字符串,而是空的,正如您所看到的那样。尝试
null
-可能零长度字符串可能意味着
错误\u错误\u长度

来自错误。h:

#define ERROR_BAD_LENGTH        24
…不确定这与您的代码有什么关系,但确实如此

编辑:我想知道是不是这个:

home_dir = ""

或者类似的-文档中说“指向一个Unicode字符串的指针,该字符串为
usri2\u name
成员指定的用户指定主目录的路径。该字符串可以为空。”-这里没有提到给定的字符串,而是空的,正如您所看到的那样。试试
null
-也许零长度字符串可能意味着
错误\u错误\u长度

Heh-在被问到14分钟后,这个问题是谷歌上第一个关于“NetUserAddError+24”的问题。谷歌只是喜欢堆栈溢出!我已经看过好几次了。我问我的问题,然后继续研究,只为了找到我的确切问题!我非常激动,直到我意识到这其实是我问的问题。他们必须施展一些魔法才能如此迅速地在谷歌上占据一席之地。我估计谷歌有一半的开发者都在谷歌上,而一些有影响力的开发者(或开发经理)也牵线搭桥。8-)顺便说一句,我已经用另一个可能的线索更新了我的答案。嘿-在被问到14分钟后,这个问题是“NetUserAddError+24”在谷歌上的第一个点击。谷歌只是喜欢堆栈溢出!我已经看过好几次了。我问我的问题,然后继续研究,只为了找到我的确切问题!我非常激动,直到我意识到这其实是我问的问题。他们必须施展一些魔法才能如此迅速地在谷歌上占据一席之地。我估计谷歌有一半的开发者都在谷歌上,而一些有影响力的开发者(或开发经理)也牵线搭桥。8-)顺便说一句,我用另一个可能的线索更新了我的答案。我回到了使用用户信息1。我奖励这个答案,因为它让我重新调试它。谢谢你的帮助!如果您在命令行中键入“net helpmsg”,将以人工方式返回错误。非常有用。对于24,它返回:“程序发出了一个命令,但命令长度不正确。”我返回到使用用户信息1。我奖励这个答案,因为它让我重新调试它。谢谢你的帮助!如果您在命令行中键入“net helpmsg”,将以人工方式返回错误。非常有用。对于24,它返回:“程序发出了一个命令,但命令长度不正确。”