Страница: 1 | 2 |
Вопрос: aka Net Send
Добавлено: 08.07.04 15:00
Автор вопроса: Иной
Народ, приветствую!
Кто-нибудь в курсе, как из кода на VB .Net отправить сообщение по сети (так как это делает " net send")? Поделитесь мыслями, будте щедрыми ;)
Ответы
Всего ответов: 20
Номер ответа: 1
Автор ответа:
freeloader
ICQ: 50804884
Вопросов: 72
Ответов: 642
Web-сайт:
Профиль | | #1
Добавлено: 08.07.04 15:41
shell "net send ''''"
???
Номер ответа: 2
Автор ответа:
Иной
Вопросов: 19
Ответов: 50
Профиль | | #2
Добавлено: 08.07.04 17:16
Нууу, это не серьезно. Нужно без shell обойтисю. Наверняка есть какие-то функции.
Номер ответа: 3
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #3
Добавлено: 08.07.04 18:03
Есть и с пом. АПИ...
NetMessageBufferSend
Номер ответа: 4
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #4
Добавлено: 08.07.04 18:45
в .Net Fw средств для этого нет. Используйте указанную функцию API.
Номер ответа: 5
Автор ответа:
Иной
Вопросов: 19
Ответов: 50
Профиль | | #5
Добавлено: 09.07.04 10:11
Ок, понятно. Но тогда есть вопрос по использованию API в .Net FW.
я вот что делаю
Declare Auto Function NetMessageBufferSend Lib "Netapi32.dll" ( _
ByVal srv As String, ByVal MsgName As String, ByVal FromName As String, ByRef buf As String, ByVal BufLen As Integer) As Integer
Dim s As String = "Сообщение"
 im i As Integer = NetMessageBufferSend("localhost", "test1", "test2", s, Len(s))
И нифига, функция отрабатывает и возвращает значение 52. А что за 52 не знаю, потому как даже константы объявить не смог.
в SDK сказано:
Header: Declared in Lmmsg.h; include Lm.h.
Library: Use Netapi32.lib.
Но у меня на диске нет ни "Netapi32.lib", ни "Lmmsg.h", ни "Lm.h".
Поэтому вместо "Netapi32.lib" я использовал "Netapi32.dll", а вместо *.h не знаю что юзать.
Подскажите, плиз, как использовать АПИ функции.
Номер ответа: 6
Автор ответа:
Воронков Василий
Вопросов: 1
Ответов: 90
Профиль | | #6
Добавлено: 09.07.04 13:34
> в .Net Fw средств для этого нет. Используйте указанную функцию API.
Ни фига себе! А сокеты на что?
Номер ответа: 7
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #7
Добавлено: 09.07.04 13:37
А теперь вопрос, что проще ?
Номер ответа: 8
Автор ответа:
Иной
Вопросов: 19
Ответов: 50
Профиль | | #8
Добавлено: 09.07.04 14:16
а как на счет моего вопроса? Где брать все эти либы и *.h?
Номер ответа: 9
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #9
Добавлено: 09.07.04 14:39
Ну дык и используй ДЛЛ... Все что там написано это для Си... Т.е. написано где эта хрень декларируется... Ты же, как я понял, объявляешь все вручную...
ЗЫ
НЕТ не назнимаюс, пакость это (имхо), так что жди Павла... он тут один этой пакостью увлекается и верит в неее... хотя может и не один...
Номер ответа: 10
Автор ответа:
freeloader
ICQ: 50804884
Вопросов: 72
Ответов: 642
Web-сайт:
Профиль | | #10
Добавлено: 09.07.04 15:21
2sne:
не один не отвергаю .NET, но и не злоупотребляю.
Кстати Эпплман прям под sne и ему подобных писал, может дать им почитать?
Или их уже ничето не переубедит?
Номер ответа: 11
Автор ответа:
Андрей Никитин
ICQ: 325172082
Вопросов: 3
Ответов: 81
Профиль | | #11
Добавлено: 09.07.04 15:36
Итак пока вот что получилось:
using System.Runtime.InteropServices;
using System.Text;
[DllImport("netapi32.dll", CharSet=CharSet.Unicode)]
public static extern int NetMessageBufferSend(string servername, string msgname, string fromname, [MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.U1, SizeParamIndex=4)] byte[] buf, [MarshalAs(UnmanagedType.U4)] int buflen);
private void button1_Click(object sender, System.EventArgs e)
{
int retCode;
byte[] buf = Encoding.ASCII.GetBytes("It`s I am"
retCode = NetMessageBufferSend("Irina", "Hello", "Andrey", buf, buf.Length);
}
...Возвращает ошибку № 5 - "Отказано в доступе" - (сеть управляется серваком). В MSDN сказано, что использовать NetMessageBufferSend могут администраторы или операторы сервера. Вывод если у тебя есть права администратора - надо настроить разрешения в проге.
...Ошибка № 52 - "Не удалось подключиться к сети из-за существования совпадающих имен. Измените имя компьютера и повторите попытку". - Возможно неправильный регистр в именах отправителя и получателя.
>sne. Не стоит так пинать FW - набор классов действительно очень удобный (IMHO). А учитывая, что он (FW) еще и бесплатный...
Номер ответа: 12
Автор ответа:
Андрей Никитин
ICQ: 325172082
Вопросов: 3
Ответов: 81
Профиль | | #12
Добавлено: 09.07.04 15:38
Вдогонку. Примерчик на C#, но думаю перевести на VB.NET не составит труда
Номер ответа: 13
Автор ответа:
Иной
Вопросов: 19
Ответов: 50
Профиль | | #13
Добавлено: 09.07.04 15:39
Короче капец полный! С API функциями разобрался уже, все нормуль. Но у меня такое подозрение, что "net send" делает все иначе, он не пользуется "NetMessageBufferSend".
Дело в следующем, один из параметров "NetMessageBufferSend" - msgname.
Описание:
[in] Pointer to a constant string that specifies the message alias to which the message buffer should be sent.
Короче, в качестве этого параметра нужно передавать имя учетной записи, зарегистрированной в системе, на которую отправляется сообщение.
[b]Вопрос[/b]: каким таким каком мне узнать, кто там в системе работает?
[b]Ответ[/b]: "NetMessageNameGetInfo".
[b]НО[/b]! Для того чтобы выполнить эту функцию и получить данные с удаленной тачки необходимо там иметь права админа
А как же тогда работает "Net Send"? Неужели через сокеты. Это не интересно
Номер ответа: 14
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #14
Добавлено: 09.07.04 16:14
freeloader, меня уже навряд-ли что-то переубедит... да конечно, жизнь заставит, буду программить, а так - нивафто
Можешь почитать VB6 vs. NET... там куча флэйма, но никто из сторон так никого и не переубедил
Иной, могу закинуть код на VB6
Номер ответа: 15
Автор ответа:
Андрей Никитин
ICQ: 325172082
Вопросов: 3
Ответов: 81
Профиль | | #15
Добавлено: 09.07.04 16:15
using System;
using System.DirectoryServices;
Нарыл вот это (получает Domain user names):
namespace ConsoleApplication1
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
DirectoryEntry root = new System.DirectoryServices.DirectoryEntry("LDAP://RootDSE"
string dnc = (string)root.Properties["defaultNamingContext"][0];
string path = "LDAP://CN=Users," + dnc;
DirectoryEntry users = new DirectoryEntry(path);
foreach (DirectoryEntry user in users.Children)
Console.WriteLine(user.Name);
}
}
}
Только вот при попытке воспроизвести это в Студии получил сообшение что пространство имен DirectoryServices не найдено в System !!!