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