Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > NetUserAdd - параметр задан неверно


Автор: nerezus 18.7.2009, 10:56
Пишет, что параметр задан неверно (

Код

using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using System.Runtime.InteropServices;
using ComTypes = System.Runtime.InteropServices.ComTypes;
using Microsoft.Win32;





[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
        private 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, SetLastError = true)]
        private static extern int NetUserAdd(
             [MarshalAs(UnmanagedType.LPWStr)] string servername,
             UInt32 level,
             USER_INFO_1 userInfo,
             out UInt32 parm_err);

        public static string UserAdd(string name, string password) {
            USER_INFO_1 user = new USER_INFO_1();
            user.sUsername = name.Trim();
            user.sPassword = password;
            user.uiPriv = 1;
            user.sScript_Path = "";
            user.sHome_Dir = "";
            user.sComment = "Autogenerated user account";
            uint outVal = 0;
            int result = NetUserAdd("", 1, user, out outVal);
            if (result != 0) {
                return new System.ComponentModel.Win32Exception(result).Message;
            } else {
                return "Success";
            }
        }







MessageBox.Show(UserAdd("bebe", "bebe"));


NetUserAdd Function: http://msdn.microsoft.com/en-us/library/aa370649(VS.85).aspx
USER_INFO_1 Structure: http://msdn.microsoft.com/en-us/library/aa371109(VS.85).aspx
Пример на VB.NET: http://www.pinvoke.net/default.aspx/netapi32.NetUserAdd

Автор: diadiavova 18.7.2009, 12:30
Код

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



Код

Private Declare Function NetUserAdd Lib "Netapi32.dll" ( _
    <MarshalAs(UnmanagedType.LPWStr)> ByVal servername As String, _
    ByVal level As Integer, _
    ByRef buf As USER_INFO_1, _
    ByRef param_error As Integer) As Integer


Обрати внимание на тип предпоследнего параметра в шарпе и васике. Просто надо воспользоваться классом Marshal для получения указателя, что-то типа
Код

            USER_INFO_1 user = new USER_INFO_1();
            user.sUsername = name.Trim();
            user.sPassword = password;
            user.uiPriv = 1;
            user.sScript_Path = "";
            user.sHome_Dir = "";
            user.sComment = "Autogenerated user account";
            IntPtr userPtr =  Marshal.AllocHGlobal(Marshal.SizeOf(user));
            Marshal.StructureToPtr(user, userPtr, true); 

//....................................................


            int result = NetUserAdd("", 1, userPtr, out outVal);


 ну и декларацию переписать как надо ессно.

Автор: nerezus 18.7.2009, 14:34
Теперь стала ошибка "неверный дескриптор"
Посмотрел - вроде все как в бейсике, странно.

Автор: diadiavova 18.7.2009, 16:04
Само определение метода надо переписать под шарп. В бейсике некоторые операции выполняет компилятор, а в шарпе надо всё явно делать
Приаттачиваю проект. Выдаёт саксес, ну а с остальным сам разберёшься, там и от оси завсит и от прав доступа и всё такое.

Автор: nerezus 18.7.2009, 16:24
Тааак, твоя версия тоже ругается о неверном дескрипторе. Куда смотреть?

Сейчас в виртуалку win2008 ставлю, в ней буду пробовать.

Автор: diadiavova 18.7.2009, 16:30
У меня не ругается, правда и новый акк не появляется smile

Добавлено через 59 секунд
А у тебя какая ось? Если виста, то запускать надо с правами админа.

Автор: nerezus 18.7.2009, 18:07
XP, пользователь с правами админа.

Цитата

правда и новый акк не появляется
 А должен (

Проверил на вин2008, сначала сказало, что пароль мелкий, а потом когда ввел нормальный, то просто упало.

Автор: diadiavova 18.7.2009, 18:39
Цитата(nerezus @  18.7.2009,  19:07 Найти цитируемый пост)
А должен (

Вообще-то там хрень какая-то. Когда я пытаюсь создать запись с именем, с которым уже создавал, то пишет, что такая запись уже существует. Я наверно не правильно понял, что создаёт эта функция и где искать записи. Судя по всему у меня всё пашет. Но вот где те аки, которые я создал? smile

Автор: nerezus 18.7.2009, 18:45
панель управление -> администрирование -> управление компьютером -> локальные пользователи -> пользователи

Добавлено через 7 минут и 51 секунду
Код

C:\!Docs\!!projects\NetUserAdd\Release>NetUserAdd.exe bebe bebe
A system error has occurred: 53
 WTF?
Это код со странички MSDN: http://msdn.microsoft.com/en-us/library/aa370649(VS.85).aspx

Автор: diadiavova 18.7.2009, 18:57
Да, вот они все, голупчеги smile . Ща удалять буду.

Автор: diadiavova 18.7.2009, 19:27
Цитата(nerezus @  18.7.2009,  19:45 Найти цитируемый пост)
A system error has occurred: 53

Ошибка 53 говорит: "Не найден сетевой путь"
Цитата(nerezus @  18.7.2009,  19:07 Найти цитируемый пост)
XP, пользователь с правами админа.

Проморгал. Нужен не пользователь с правами админа, а запустить от имени админа, но хр возможно такого и нет(не помню уже smile ). В висте это делается путём запуска проги через контекстное меню, там есть такой путь. Если надо из студии так запустить(в дебаггере), то от имени админа надо запускать саму студию.

Добавлено через 42 секунды
А если из командной строки, то строку, а если bat/cmd файл - то его.

Автор: nerezus 18.7.2009, 19:40
У меня сам пользователь с правами админа.
И он умеет создавать пользователей)

В win2008 запускал от админа - то же самое. Мистика (

Автор: diadiavova 18.7.2009, 19:46
Цитата(nerezus @  18.7.2009,  20:40 Найти цитируемый пост)
У меня сам пользователь с правами админа.
И он умеет создавать пользователей)

Ну в хр это вроде так и есть. В висте - по другому. Там мало, чтобы пользователь имел права, надо ещё и запустить прогу с правами.


Возможно у тебя какие-то компоненты винды не установлены? Там iis или ещё чо? Я не в курсе, что для этого надо, но такое может быть.

Автор: nerezus 26.7.2009, 17:48
Код


[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    internal 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, SetLastError = true)]
        private static extern int NetUserAdd(
             [MarshalAs(UnmanagedType.LPWStr)] string servername,
             UInt32 level,
             IntPtr userInfo,
             out UInt32 parm_err);

        public static string UserAdd(string name, string password) {
            USER_INFO_1 user = new USER_INFO_1();
            user.sUsername = name.Trim();
            user.sPassword = password;
            user.uiPriv = 1;
            user.sScript_Path = "";
            user.sHome_Dir = "";
            user.sComment = "Autogenerated user account";
            IntPtr userPtr = Marshal.AllocHGlobal(Marshal.SizeOf(user));
            Marshal.StructureToPtr(user, userPtr, true);
            uint outVal = 0;
            int result = NetUserAdd("\\\\.", 1, userPtr, out outVal);
            if (result != 0) {
                return new System.ComponentModel.Win32Exception(result).Message;
            } else {
                return "Success";
            }
        }





MessageBox.Show(UserAdd("bebe", "bebe"));


Почему же не работает, а вот пример из MSDN работает
Код

C:\!Docs\!!projects\NetUserAdd\Release>NetUserAdd.exe \\. ttt
User ttt has been successfully added on \\.


P.S. Заработало после прописывания домена(\\.)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)