Системный диск и БД - какая связь?
Из программы я подключаю сетевой диск. Программа подсоединена к БД, находяйщеяся на сервере i1. Сетевой диск тоже расположен на этом же сервере и имеет login: disk, password: zz.
Провожу семь экспериментов:
1) На форму кидаю Button и прописываю код запуска сетевого диска:
NETRESOURCE netResource;
LPSTR netPassword, netLogin;
ZeroMemory(&netResource, sizeof(NETRESOURCE));
netResource.dwType = RESOURCETYPE_DISK;
netResource.lpLocalName = "Y:";
netResource.lpRemoteName = "\\\\i1\\Archiv$";
netPassword = "zaqxsw";
netLogin = "disk";
if(WNetAddConnection2(&netResource, netPassword, netLogin, NULL) != NO_ERROR)
{
LPVOID lpMsgBuf;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpMsgBuf,
0,
NULL);
MessageBox(Application->Handle,
(const char *)lpMsgBuf,
"GetLastError",
MB_OK | MB_ICONINFORMATION);
LocalFree(lpMsgBuf);
}
В проводнике виден созданный диск Archiv$.
2) На эту же форму добавляю компоненты TTable и DataSource, подключаю таблицу БД (сервер i1) и пробую подсоединить диск. Выходит сообщение, что я пробую подключиться к уже подключенному диску. Хотя это не так.
3) Меняю в коде lpRemoteName = "\\\\i1\\Archiv$"; на lpRemoteName = "\\\\160dep-537\\Archiv$"; 160dep-537-моя машина. У себя создаю Archiv$. Все подсоединяется.
4) На форме только компоненты TTable и DataSource с подключенной таблицей. Пробую подключить диск через net use по тому же пути, что в коде. Вылетает эта же ошибка.
5)Билдер вообще не запускаю. Базу открываю из Access-а. Запускаю диск по net use. Все проходит.
6) БД запускаю из SQL. Далее диск по net use. Все проходит.
7) Сначала через net use подсоединяю диск, а потом открываю программу. Выдается сообщение:
Unknown user name or password
Login failed for user ‘ICEBERG\disk’
Login incorrect
Alias: Arh
Arh – это название базы данных в BDE.
Вывод такой: что вместе с открытием БД в приложении Билдера в какой-то момент запускается и подсоединению к диску, хотя в проводнике его нет. База подключается через BDE. Может там где-то есть ссылка? Но зрительно я ее не вижу.
В компоненте TTable есть только ссылка на базу DatebaseName и TableName.
В свойствах подключение к диску может быть многократное.
Что это может быть?
Может Вы подскажите еще раз. Я полагаю, что подключать диск нужно при событии формы OnCreate, а затем на OnShow активизировать таблицу БД. Но тогда подключенный диск будет "висеть" в сети и в проводнике его можно увидеть и войти в него. Вопрос такой: а можно подключить диск так, чтобы он был невиден в сети и какой код это может обеспечить? Заранее спасибо.;)
Спасибо большое, я даже не подумала, что дело может быть в активизации таблицы.
Может Вы подскажите еще раз. Я полагаю, что подключать диск нужно при событии формы OnCreate, а затем на OnShow активизировать таблицу БД. Но тогда подключенный диск будет "висеть" в сети и в проводнике его можно увидеть и войти в него. Вопрос такой: а можно подключить диск так, чтобы он был невиден в сети и какой код это может обеспечить? Заранее спасибо.;)
Не совсем понятна задача - но если нужно чт бы ресурс не отображался в системе уместней использовать не WNetAddConnection2, которая служит именно для добавления ресурса в систему, а
WNetSetConnection(
LPCTSTR lpName,
DWORD dwProperty,
LPVOID pvValue
);
dwProperty имеет следующее значение - NETPROPERTY_PERSISTENT - которое может быть
TRUE или FALSE и соответственно позволяет установить постоянное соединение или подключится без прерывания текущих (вольный перевод Win2kDDK). То есть если по русски - ресурс будет или не будет отображаться в системе для всех процессов... :)
pvValue - соответственно возвращает WN_SUCCES или WN_NOT_CONNECTED
Попробовала найти описание функции WNetSetConnection в Интернете, но по данному ключевому слову ничего не найдено. Здесь нет никакой ошибки?
Вот что у меня сейчас происходит:
я создала пользователя ArhUser и пароль zz, под которым подсоединяюсь к системному диску на удаленном сервере. Затем запускаю программу, БД которой находится на этом же сервере. Вход в программу теперь тоже по этому пользователю. И записи, которые добавляются, тоже под этим пользователем. Мне так не надо.
А нужно, чтобы и к диску можно было подключиться, и чтоб в сети он был не виден, и чтобы БД подсоединялась под этим же пользователем, а добавленные записи принадлежали владельцу машины, т.е. той учетной записи, под которой я вхожу в компьютер.
Можно ли это осуществить?;)
Снова возвращаюсь к этой теме.
Попробовала найти описание функции WNetSetConnection в Интернете, но по данному ключевому слову ничего не найдено. Здесь нет никакой ошибки?
Здесь нет никакой ошибки - искать необходимо в MSDN - справка МелкоМягких для VS или в MSDDK - там описание этой функции есть. Выглядит оно так:
This function is used to change the сhracteristics of a network connection.
DWORD WNetSetConnection(
LPCTSTR lpName,
DWORD dwProperty,
LPVOID pvValue
);
lpName
The name of either the redirected local device or a remote network resource.
dwProperty
A value representing the type of property to change. There is currently only one property type:
NETPROPERTY_PERSISTENT the persistent property.
The corresponding property value is a DWORD.
lpName must be the name of a redirected local
device. If the property value is TRUE, the
connection is made persistent with the current
user authentication. . If the property value is
FALSE, then the connection is made no longer
persistent without breaking any current
connection to the network (if not currently
connected to the network, this is the same effect
as cancelling the connection).
pvValue
Pointer to the property value for the property
type supplied. The data type of the property
value depends upon the property type.
WN_SUCCESS if the call is successful. Other error
codes include:
WN_NOT_CONNECTED lpName not a redirected device
Built on Monday, June 12, 2000
Вот что у меня сейчас происходит:
я создала пользователя ArhUser и пароль zz, под которым подсоединяюсь к системному диску на удаленном сервере. Затем запускаю программу, БД которой находится на этом же сервере. Вход в программу теперь тоже по этому пользователю. И записи, которые добавляются, тоже под этим пользователем. Мне так не надо.
А нужно, чтобы и к диску можно было подключиться, и чтоб в сети он был не виден, и чтобы БД подсоединялась под этим же пользователем, а добавленные записи принадлежали владельцу машины, т.е. той учетной записи, под которой я вхожу в компьютер.
Можно ли это осуществить?;)
Вопрос в том, как вы работаете с базой данных - если работа идет напрямую минуя сервер базы данных - это одно дело, если вы используете сервер баз данных - MySQL,MSSQL,Oracle и т.п. то не понятен смысл подключения сетевых ресурсов - вся работа обычно в таком случае происходит на уровне портов сервера.
Если программа запускается от имени пользователя - то естественно и файлы с которыми она работает сохраняются от имени этого же пользователя. Можно по окончании работы сменить права доступа, то есть приконнектится от имени пользователя из группы админов и сменить владельца. Или сменить владельца непосредственно от имени текущего пользователя...но тогда вся и без того дырявая схема просто становится одной огромной сплошной дырой... :D :D :D
Если так уж необходимо именно такая схема работы необходимо писать серверное приложение с которым взаимодействует клиенская программа. тогда пользователь коннектится под своим логином - а работа идет с правами процесса с которым взаимодействует пользователь. В таком случае вопрос кто владелец файлов определяете вы. Точнее программа написанная вами...:D
Здесь нет никакой ошибки - искать необходимо в MSDN - справка МелкоМягких для VS или в MSDDK - там описание этой функции есть. Выглядит оно так:
This function is used to change the chracteristics of a network connection.
DWORD WNetSetConnection(
LPCTSTR lpName,
DWORD dwProperty,
LPVOID pvValue
);
lpName
The name of either the redirected local device or a remote network resource.
dwProperty
A value representing the type of property to change. There is currently only one property type: NETPROPERTY_PERSISTENT the persistent property. The corresponding property value is a DWORD. lpName must be the name of a redirected local device. If the property value is TRUE, the connection is made persistent with the current user authentication. . If the property value is FALSE, then the connection is made no longer persistent without breaking any current connection to the network (if not currently connected to the network, this is the same effect as cancelling the connection).
pvValue
Pointer to the property value for the property type supplied. The data type of the property value depends upon the property type.
WN_SUCCESS if the call is successful. Other error codes include:
WN_NOT_CONNECTED lpName not a redirected device
Built on Monday, June 12, 2000
Вопрос в том, как вы работаете с базой данных - если работа идет напрямую минуя сервер базы данных - это одно дело, если вы используете сервер баз данных - MySQL,MSSQL,Oracle и т.п. то не понятен смысл подключения сетевых ресурсов - вся работа обычно в таком случае происходит на уровне портов сервера.
Если программа запускается от имени пользователя - то естественно и файлы с которыми она работает сохраняются от имени этого же пользователя. Можно по окончании работы сменить права доступа, то есть приконнектится от имени пользователя из группы админов и сменить владельца. Или сменить владельца непосредственно от имени текущего пользователя...но тогда вся и без того дырявая схема просто становится одной огромной сплошной дырой... :D :D :D
Если так уж необходимо именно такая схема работы необходимо писать серверное приложение с которым взаимодействует клиенская программа. тогда пользователь коннектится под своим логином - а работа идет с правами процесса с которым взаимодействует пользователь. В таком случае вопрос кто владелец файлов определяете вы. Точнее программа написанная вами...:D
Во-первых, я учла Ваши рекомендации и сделала так, что при добавлении записи владельцем ее становился владелец учетной записи машины.
Далее, если сначала запустить системный диск, а затем программу, то она работает, но вход в базу осуществляется под тем юзером, под которым я подсоединилась к диску. И это меня устраивает.
Теперь непонятно вот что. Я думала, если в событии формы OnCreate я пропишу подключение к диску, а в событии этой же формы OnShow пропишу Table->Active = true;
то у меня сначала запуститься диск, а затем заработает программа. Оказалось, нет.
Диск подключился, а форма не запустилась, конечно же, с сообщением об ошибке.
Мыслю я может быть правильно, а как осуществить, не знаю. Самое главное, что параметры подключения (user и password) у меня находятся в таблице этой БД. И если я запускаю сист. диск, то в этот момент моя таблица еще не активизирована. Т. е., по сути, данных нет. Что же делать?::angel:
Порядок загрузки, как я описала прошел. Но может есть более правильный?
И вопрос, как вытащить из даблицы загрузочные данные или как их спрятать для рядовых юзеров, остается открытым.;)
Помогите, пожалуйста, организовать процесс.
Во-первых, я учла Ваши рекомендации и сделала так, что при добавлении записи владельцем ее становился владелец учетной записи машины.
Далее, если сначала запустить системный диск, а затем программу, то она работает, но вход в базу осуществляется под тем юзером, под которым я подсоединилась к диску. И это меня устраивает.
Теперь непонятно вот что. Я думала, если в событии формы OnCreate я пропишу подключение к диску, а в событии этой же формы OnShow пропишу Table->Active = true;
то у меня сначала запуститься диск, а затем заработает программа. Оказалось, нет.
Диск подключился, а форма не запустилась, конечно же, с сообщением об ошибке.
Мыслю я может быть правильно, а как осуществить, не знаю. Самое главное, что параметры подключения (user и password) у меня находятся в таблице этой БД. И если я запускаю сист. диск, то в этот момент моя таблица еще не активизирована. Т. е., по сути, данных нет. Что же делать?::angel:
А сообщение о чем было?
:x
А сообщение показывалось вот почему: когда работает Билдер, видимо уже связь с базой есть. Поскольку я установила, что системный диск у меня запускается при создании формы, то программа и выдает мне сообщение, что многопользовательский режим. Но сообщение пришло как-то с опозданием, поэтому я его не заметила. В этот момент я закрыла Билдер и запустила .exe. Вот он мне и не отработал.
Сейчас меня волнует, как правильно запустить диск и открыть приложение.
Если можете, помогите. Впечатление такое, что на многих форумах кроме Вас этим вопросом никто не владеет. А уж в обучающей литературе и в помине нет. Допускаю, что многого не знаю, но уж не первый день разбираюсь с этим вопросом. Пока до конца не довела.:{
Что-то у меня сегодня форум "хандрит". То сообщение не могу отправить, то он не запускается и вообще, какой-то растянутый - на два монитора. Странно как-то.
:x
А сообщение показывалось вот почему: когда работает Билдер, видимо уже связь с базой есть. Поскольку я установила, что системный диск у меня запускается при создании формы, то программа и выдает мне сообщение, что многопользовательский режим. Но сообщение пришло как-то с опозданием, поэтому я его не заметила. В этот момент я закрыла Билдер и запустила .exe. Вот он мне и не отработал.
Сейчас меня волнует, как правильно запустить диск и открыть приложение.
Если можете, помогите. Впечатление такое, что на многих форумах кроме Вас этим вопросом никто не владеет. А уж в обучающей литературе и в помине нет. Допускаю, что многого не знаю, но уж не первый день разбираюсь с этим вопросом. Пока до конца не довела.:{
:) Растянутый он на два монитора видимо потому, что когда я копировал описание то не учел особенности при копировании файла справки - нужно отредактировать вам сообщение в котором цитируется мое с описанием функции...там только моя цитата и больше ничего - видимо это как раз и произошло в момент когда форум глюканул. Я думаю что его просто можно удалить.
Я вообщем то, в этом плане тоже не особо большой специалист - просто мне приходилось разрабатывать системы с распределенной структурой баз данных. Я думаю что будет проще обсудить эти вопросы в аське - будет оперативней. моя аська 136428914 но сообщения принимаются только от пользователей с контактного листа...задрали со спамом. Сбрось на почту номер аськи если нужно - чем смогу помогу.