PInvoke из NetUserAdd возвращает 24 - PullRequest
1 голос
/ 09 июля 2009

Я звоню NetUserAdd, и он возвращает 24 для каждого звонка. Кто-нибудь знает, что означает 24? Это довольно сложно отладить, когда я не знаю, что означает ошибка.

Я звоню с компьютера с Windows XP, работающего как локальный администратор. Я также являюсь локальным администратором на целевом компьютере. Я попробовал это с USER_INFO_1, и он работал нормально. Мне просто нужен уровень контроля, заданный USER_INFO_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());
    }

1 Ответ

1 голос
/ 09 июля 2009

из Error.h:

#define ERROR_BAD_LENGTH        24

... не знаю, как это относится к вашему коду, но это так.

Редактировать : Интересно, так ли это:

home_dir = ""

или аналогичный - в документации написано "Указатель на строку Unicode, указывающую путь к домашнему каталогу для пользователя, указанного членом usri2_name. Строка может быть нулевой." - упоминания нет из строки дано, но пусто, как у вас есть. Попробуйте null - возможно, строки нулевой длины могут означать ERROR_BAD_LENGTH ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...