Определение в СLARION mac_aдреса cетевого компа.

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Aнтон87
Посетитель
Сообщения: 33
Зарегистрирован: 07 Август 2008, 18:43

Определение в СLARION mac_aдреса cетевого компа.

Сообщение Aнтон87 »

Всем привет!
Есть ли возможность определить MAC_aдрес(а) на сетевом(ых) компе(ах) из Clarion (посредством WinApi или к-л. доп. библиотекой)?
Аватара пользователя
WadimZapara
Активист
Сообщения: 181
Зарегистрирован: 11 Июнь 2008, 12:11
Откуда: Тамбов

Re: Определение в СLARION mac_aдреса cетевого компа.

Сообщение WadimZapara »

Если есть возможность в Винде, то есть возможность и в Кларе.
Надо лезть в MSDN. Мне не было надобности. Не подскажу
Компьютер имеет то преимущество перед мозгом, что им пользуются...
Аватара пользователя
Admin
Администратор
Сообщения: 3960
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Re: Определение в СLARION mac_aдреса cетевого компа.

Сообщение Admin »

Aнтон87 писал(а):Всем привет!
Есть ли возможность определить MAC_aдрес(а) на сетевом(ых) компе(ах) из Clarion (посредством WinApi или к-л. доп. библиотекой)?
Гуглим господа хорошие.
http://www.google.com/search?hl=ru&clie ... indows+API
Находим код и портируем его в Кларион...
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Alisher
Новичок
Сообщения: 13
Зарегистрирован: 29 Сентябрь 2006, 6:33
Откуда: Ташкент
Контактная информация:

Re: Определение в СLARION mac_aдреса cетевого компа.

Сообщение Alisher »

Нашел рабочий код на С, работает даже с Vista. Теперь надо будет его на Кларион перевести или смастерить DLLку чтобы вызывать из клариона:
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <stdlib.h>

#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x)) /* Note: could also use malloc() and free() */

int main()
{
DWORD dwSize = 0;
DWORD dwRetVal = 0;

int i, j;

/* variables used for GetIfTable and GetIfEntry */
MIB_IFTABLE *pIfTable;
MIB_IFROW *pIfRow;

// Allocate memory for our pointers.
pIfTable = (MIB_IFTABLE *) MALLOC(sizeof (MIB_IFTABLE));
if (pIfTable == NULL) {
printf("Error allocating memory needed to call GetIfTable\n");
exit (1);
}
// Before calling GetIfEntry, we call GetIfTable to make
// sure there are entries to get and retrieve the interface index.

// Make an initial call to GetIfTable to get the
// necessary size into dwSize
dwSize = sizeof (MIB_IFTABLE);
if (GetIfTable(pIfTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) {
FREE(pIfTable);
pIfTable = (MIB_IFTABLE *) MALLOC(dwSize);
if (pIfTable == NULL) {
printf("Error allocating memory\n");
exit (1);
}
}
// Make a second call to GetIfTable to get the actual
// data we want.
if ((dwRetVal = GetIfTable(pIfTable, &dwSize, 0)) == NO_ERROR) {
if (pIfTable->dwNumEntries > 0) {
pIfRow = (MIB_IFROW *) MALLOC(sizeof (MIB_IFROW));
if (pIfRow == NULL) {
printf("Error allocating memory\n");
if (pIfTable != NULL) {
FREE(pIfTable);
pIfTable = NULL;
}
exit (1);
}

printf("\tNum Entries: %ld\n\n", pIfTable->dwNumEntries);
for (i = 0; i < (int) pIfTable->dwNumEntries; i++) {
pIfRow->dwIndex = pIfTable->table.dwIndex;
if ((dwRetVal = GetIfEntry(pIfRow)) == NO_ERROR) {
printf("\tIndex:\t %ld\n", pIfRow->dwIndex);
printf("\tInterfaceName[%d]:\t ", i);
if (pIfRow->wszName != NULL)
printf("%ws", pIfRow->wszName);
printf("\n");

printf("\tDescription[%d]:\t ", i);
for (j = 0; j < (int) pIfRow->dwDescrLen; j++)
printf("%c", pIfRow->bDescr[j]);
printf("\n");

printf("\tType[%d]:\t ", i);
switch (pIfRow->dwType) {
case IF_TYPE_OTHER:
printf("Other\n");
break;
case IF_TYPE_ETHERNET_CSMACD:
printf("Ethernet\n");
break;
case IF_TYPE_ISO88025_TOKENRING:
printf("Token Ring\n");
break;
case IF_TYPE_PPP:
printf("PPP\n");
break;
case IF_TYPE_SOFTWARE_LOOPBACK:
printf("Software Lookback\n");
break;
case IF_TYPE_ATM:
printf("ATM\n");
break;
case IF_TYPE_IEEE80211:
printf("IEEE 802.11 Wireless\n");
break;
case IF_TYPE_TUNNEL:
printf("Tunnel type encapsulation\n");
break;
case IF_TYPE_IEEE1394:
printf("IEEE 1394 Firewire\n");
break;
default:
printf("Unknown type %ld\n", pIfRow->dwType);
break;
}
printf("\tMtu[%d]:\t\t %ld\n", i, pIfRow->dwMtu);
printf("\tSpeed[%d]:\t %ld\n", i, pIfRow->dwSpeed);

printf("\tPhysical Addr:\t ");
if (pIfRow->dwPhysAddrLen == 0)
printf("\n");
for (j = 0; j < (int) pIfRow->dwPhysAddrLen; j++) {
if (j == (pIfRow->dwPhysAddrLen - 1))
printf("%.2X\n", (int) pIfRow->bPhysAddr[j]);
else
printf("%.2X-", (int) pIfRow->bPhysAddr[j]);
}
printf("\tAdmin Status[%d]:\t %ld\n", i,
pIfRow->dwAdminStatus);

printf("\tOper Status[%d]:\t ", i);
switch (pIfRow->dwOperStatus) {
case IF_OPER_STATUS_NON_OPERATIONAL:
printf("Non Operational\n");
break;
case IF_OPER_STATUS_UNREACHABLE:
printf("Unreasonable\n");
break;
case IF_OPER_STATUS_DISCONNECTED:
printf("Disconnected\n");
break;
case IF_OPER_STATUS_CONNECTING:
printf("Connecting\n");
break;
case IF_OPER_STATUS_CONNECTED:
printf("Connected\n");
break;
case IF_OPER_STATUS_OPERATIONAL:
printf("Operational\n");
break;
default:
printf("Unknown status %ld\n",
pIfRow->dwAdminStatus);
break;
}
printf("\n");
}
else {printf("GetIfEntry failed for index %d with error: %ld\n",i, dwRetVal); }
}
} else { printf("\tGetIfTable failed with error: %ld\n", dwRetVal); }
}
exit (0);
}
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7384
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 49 раз

Re: Определение в СLARION mac_aдреса cетевого компа.

Сообщение Игорь Столяров »

Ну, если не хочется переводить код с C, читать MSDN или лазить в Google,
то см. http://www.klarisoft.com/KSNews_idx12.htm ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Aнтон87
Посетитель
Сообщения: 33
Зарегистрирован: 07 Август 2008, 18:43

Re: Определение в СLARION mac_aдреса cетевого компа.

Сообщение Aнтон87 »

Привет Всем!
Наверно наиболее подходящий:
http://www.klarisoft.com/download/sampl ... ddress.zip
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7384
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 49 раз

Re: Определение в СLARION mac_aдреса cетевого компа.

Сообщение Игорь Столяров »

Типичный ответ программиста на Clarion ... ;)
Не искать, не думать, не разбираться (Google, MSDN, код на C), а взять готовое решение (еще лучше шаблон),
вставить в свой код и забыть об этом раз и навсегда ... :))
За теми кто отстал - не возвращаться. (С) Кодекс
Aнтон87
Посетитель
Сообщения: 33
Зарегистрирован: 07 Август 2008, 18:43

Re: Определение в СLARION mac_aдреса cетевого компа.

Сообщение Aнтон87 »

Согласен.
Кстати, тот пример на который дал ссылку не всегда и на всех рабочих станциях работает, и его еще надо дорабатывать. В нем (примере) помимо "чужого" кода нада вставить и "свой" код? чтобы заработало. Не все коту масленница.
Alisher
Новичок
Сообщения: 13
Зарегистрирован: 29 Сентябрь 2006, 6:33
Откуда: Ташкент
Контактная информация:

Re: Определение в СLARION mac_aдреса cетевого компа.

Сообщение Alisher »

Привет Всем!
Наверно наиболее подходящий:
http://www.klarisoft.com/download/sampl ... ddress.zip
Я рассматривал несколько вариантов,включая этот пример. Этот пример использует NetBEUI протокол, который был исключен из Виста, поэтому этот пример не годен для виста и последующих версий. Код на С работает 100% для всех виндовс версий, хотя информация выводится только об используемых LAN. Если кабель не подключен может и не вывестись. Зато главное работает. Было бы класно переделать его под кларион, у меня есть еще похожий С код для вытаскивания серийника HDD жесткого диска.

Самый правильный вариант вытаскивать информацию о железе через WMI. Вытаскивается вся инфорамация об используемых и неактивных устройвст. В Ingasoft имеется кстати библиотека за $30 для работы с WMI из клариона:
http://www.ingasoftplus.com/id119.htm
Аватара пользователя
morkovin
Ветеран
Сообщения: 909
Зарегистрирован: 20 Июль 2005, 14:53
Откуда: Volgograd, Russia
Благодарил (а): 2 раза
Поблагодарили: 3 раза
Контактная информация:

Re: Определение в СLARION mac_aдреса cетевого компа.

Сообщение morkovin »

Есть ли возможность определить MAC_aдрес(а) на сетевом(ых) компе(ах) из Clarion (посредством WinApi или к-л. доп. библиотекой)?
Легко! :D
Всего-то и надо - MS SQL и внедрить малюсенькую прогу на юзеровские компы, чтобы эта прога коннектилась к какой-либо БД. А дальше ну совсем просто:
1. Создаем хранимку(например, WriteLogUsers) в нужной БД

SELECT convert(char(20),master.dbo.sysprocesses.nt_username) AS NetworkUserName,
convert(char(20),master.dbo.sysprocesses.loginame) AS LoginName,
convert(char(20),master.dbo.sysprocesses.login_time,113) AS LoginTime,
convert(char(20),master.dbo.sysdatabases.name) AS DatabaseName,
convert(char(20),master.dbo.sysprocesses.hostname) AS ComputerName,
convert(char(20),master.dbo.sysprocesses.net_address) AS MACAddress,
convert(char(20),master.dbo.sysprocesses.program_name) AS ProgramName
INTO Dbo.Users
FROM master.dbo.sysprocesses, master.dbo.sysdatabases
WHERE master.dbo.sysdatabases.dbid = master.dbo.sysprocesses.dbid
AND master.dbo.sysdatabases.name = '<yourdatabase>'

2. В DCT описываем таблицу Users:
NetworkUserName STRING 20 @s20
LoginName STRING 20 @s20
LoginTime STRING 20 @s20
DataBaseName STRING 20 @s20
ComputerName STRING 20 @s20
MACAddress STRING 20 @s20
ProgramName STRING 20 @s20

3. И делаем вызов где-нибудь в меню:
OPEN(DummyCnt)
OPEN(DummyStr)
CLEAR(DummyCnt)
DummyCnt{PROP:SQL}='DROP TABLE DBO.USERS'
NEXT(DUMMYCNT)
case errorcode()
of 0 ! данные получены
of 33 ! данных нет
BEEP(BEEP:SystemExclamation) ; YIELD()
of 90 ! ошибка SQL
stop(fileerror() & '<10>SQL: ' & DummyCnt{PROP:SQL})
else ! ошибка
stop(error() & '<10>Table: ' & name(DummyCnt))
end

CLEAR(DummyStr)
DummyStr{PROP:SQL}='NORESULTCALL WriteLogUsers'
NEXT(DUMMYSTR)
case errorcode()
of 0 ! данные получены
of 33 ! данных нет
BEEP(BEEP:SystemExclamation) ; YIELD()
of 90 ! ошибка SQL
stop(fileerror() & '<10>SQL: ' & DummyStr{PROP:SQL})
else ! ошибка
stop(error() & '<10>Table: ' & name(DummyStr))
end
BrowseUsers()

З.Ы. Использую эту технику для контроля подключения юзеров к БД
WBR, morkovin
Aнтон87
Посетитель
Сообщения: 33
Зарегистрирован: 07 Август 2008, 18:43

Re: Определение в СLARION mac_aдреса cетевого компа.

Сообщение Aнтон87 »

Всем добрый день! Спасибо за информацию.

Это хорошо, что есть другой способ определения maс-адресов сетевых компов при наличие М SQL cервера. А это можно реализовать используя MS SQL или еще и в других SQL-серверах или без разницы ("по-барабану")? Заранее спасибо за ответ.
Aнтон87
Посетитель
Сообщения: 33
Зарегистрирован: 07 Август 2008, 18:43

Re: Определение в СLARION mac_aдреса cетевого компа.

Сообщение Aнтон87 »

Я про, а существует ли в том же скажем MySQL или FireBird, в синтаксисе sql-команд "convert(char(20),master.dbo.sysprocesses.net_address) AS MACAddress" в системной базе master.mdf?
Alisher
Новичок
Сообщения: 13
Зарегистрирован: 29 Сентябрь 2006, 6:33
Откуда: Ташкент
Контактная информация:

Re: Определение в СLARION mac_aдреса cетевого компа.

Сообщение Alisher »

Я про, а существует ли в том же скажем MySQL или FireBird, в синтаксисе sql-команд "convert(char(20),master.dbo.sysprocesses.net_address) AS MACAddress" в системной базе master.mdf?
Нет не существует, так как соединение идет через протокол TCP/IP, есть возможность оперделить IP адрес:

SELECT inet_client_addr() ;
lsgsoftware
Ветеран
Сообщения: 311
Зарегистрирован: 08 Июль 2005, 22:04

Re: Определение в СLARION mac_aдреса cетевого компа.

Сообщение lsgsoftware »

Да бог с ней с сетью.А можно ли в клаше просто без всяких наворотов
определить MAC-адрес своей карты или номер своего диска на локальном
компе.По поводу MAC,IP адресов удаленного устройства.Сам я прилично сталкивался
с этим при подключении сетевого принтера.Ну все это зависит от конкретной
модели принтера и подключение через IP -не надежно для сети с автоматичекой раздачей
IP-адресов через DHCP(в зависимости от последовательности включения компов вы можете
такой принтер и не увидеть,а статические сети,за которыми следят,это только у серьезных
юзеров).А так поставили вы у заказчика свою систему,а она и запомнит MAC, номер диска.
Захочет заказчик без вашего ведома перепродать вашу систему - не получится.Затеял сам перенос
на другой комп - тоже не получится,нужно будет вызвывать вас,а это работа,которая стоит денег и
спорить с этим трудно.Вот у 1С - вызвал специалиста - плати ему ~1500руб. в час.А сколько ему нужно
будет этих часов,знает один бог.Вот так они и вытесняют нас с рынка.Впарят систему задешо,а если что чуток
заглючит, то доберут своё в полной мере.Вот почему и есть устойчивый кадровый спрос на "программистов" 1С.
Igor
Бывалый
Сообщения: 75
Зарегистрирован: 08 Июль 2005, 11:03
Откуда: Королев

Re: Определение в СLARION mac_aдреса cетевого компа.

Сообщение Igor »

Лет пять назад была у меня такая задачка.Написал функцию и забыл. Если не считать использование WIN API в Кларе наворотами то попробуй прикрутить этот код. Вроде все прицепил.

MODULE('C Library')
memcpy(LONG,LONG,LONG),NAME('_memcpy'),RAW
END
MODULE('iphlpapi')
GetAdaptersInfo(ulong,ulong),LONG,PASCAL,RAW,NAME('GetAdaptersInfo')
END
MODULE('')
GetMacAddress FUNCTION(),string
END
GetMacAddress PROCEDURE ! Declare Procedure
ERROR_SUCCESS EQUATE(0)
ERROR_NOT_SUPPORTED EQUATE(50)
ERROR_INVALID_PARAMETER EQUATE(87)
ERROR_BUFFER_OVERFLOW EQUATE(111)
ERROR_NO_DATA EQUATE(232)

TMP STRING(16)
PIPADDRESS &STRING
TMP1 &STRING
SizeBuff LONG(0)

CODE
pIPAddress &= NEW(STRING(600))
LOOP
M#= GetAdaptersInfo(Address(PIPAddress),Address(SizeBuff))
CASE M#
OF ERROR_SUCCESS
TMP1 &= NEW(STRING(SizeBuff))
MEMCPY(ADDRESS(TMP1),ADDRESS(PIPADDRESS),SizeBuff)
K#=404
TMP = MyByteToHex(VAL(SUB(TMP1,k#+1,1))) &|
MyByteToHex(VAL(SUB(TMP1,k#+2,1))) &|
MyByteToHex(VAL(SUB(TMP1,k#+3,1))) &|
MyByteToHex(VAL(SUB(TMP1,K#+4,1))) &|
MyByteToHex(VAL(SUB(TMP1,k#+5,1))) &|
MyByteToHex(VAL(SUB(TMP1,K#+6,1)))
BREAK
OF ERROR_BUFFER_OVERFLOW
DISPOSE(PIPADDRESS)
PIPADDRESS &= NEW(STRING(SizeBuff))
CYCLE
OF ERROR_NO_DATA
BREAK
! RETURN('')
OF ERROR_NOT_SUPPORTED
BREAK
! RETURN('')
OF ERROR_INVALID_PARAMETER
BREAK
! RETURN('')
END
END
IF ~PIPADDRESS &= NULL
DISPOSE(PIPADDRESS)
END
IF ~TMP1 &= NULL
DISPOSE(TMP1)
END
RETURN(TMP)

MyByteToHex PROCEDURE (ByteToConvert) ! Declare Procedure
ReturnString STRING(2)
CODE
ReturnString = '00'
EXECUTE ByteToConvert/16
ReturnString[1] = '1'
ReturnString[1] = '2'
ReturnString[1] = '3'
ReturnString[1] = '4'
ReturnString[1] = '5'
ReturnString[1] = '6'
ReturnString[1] = '7'
ReturnString[1] = '8'
ReturnString[1] = '9'
ReturnString[1] = 'A'
ReturnString[1] = 'B'
ReturnString[1] = 'C'
ReturnString[1] = 'D'
ReturnString[1] = 'E'
ReturnString[1] = 'F'
END
EXECUTE ByteToConvert % 16
ReturnString[2] = '1'
ReturnString[2] = '2'
ReturnString[2] = '3'
ReturnString[2] = '4'
ReturnString[2] = '5'
ReturnString[2] = '6'
ReturnString[2] = '7'
ReturnString[2] = '8'
ReturnString[2] = '9'
ReturnString[2] = 'A'
ReturnString[2] = 'B'
ReturnString[2] = 'C'
ReturnString[2] = 'D'
ReturnString[2] = 'E'
ReturnString[2] = 'F'
END
RETURN(ReturnString)
Ответить