Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/19: Рейтинг темы: голосов - 19, средняя оценка - 4.95
 Аватар для Aeliot
177 / 62 / 3
Регистрация: 17.11.2011
Сообщений: 318

Работа с таблицами разделённой базы через экземпляры классов. Как?

18.11.2011, 13:31. Показов 3927. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уважаемые форумчане, помогите разобраться в вопросе.
Стоит задача ограничить доступ к данным из базы.
Что сделано:
1) База разделена на файл таблиц и файл юзверя (формы, отчёты)
2) Файл с таблицами лежит в отдельной папке, защищённой средствами NTFS. Теперь без ста грамм и прав админа её не унесёшь.
3) Чтоб каждый имел доступ только к тем данным с которыми положено ему работать, в файле юзверя прилинкованы не все таблицы, а только те, что ему разрешены (пару общих таблиц и пару "персональных"). А чтоб сами не подключили остальные таблицы, файл с таблицами запаролен.
4) В файле юзверя нет запросов (как отдельных объектов) -- все запросы в свойствах форм/отчётов, их контролов и в коде VBA.
5) Файл юзверя окомпилирован -- сохранен в формате ".accde". Теперь не посмотришь код.
6) Срыть область переходов и сделать защиту от загрузки с "Shift". Хоть в этом смысла не вижу, всё же сделал (больше для галочки -- от чайников). Обходится на "раз, два, три". Достаточно положить файл в "ненадёжное место" (главное чтоб Access считал его таковым ) и всё -- защиты нет -- Access блокирует код VBA и защита не работает.

Из того, что предлагается на форуме осталось всего ничего -- сделать шифрование данных. Покурив форум с большего разобрался. Так что можно считать этот вопрос решённым . Спасибо HOUSE MD с его примерами.

Однако, осталось ещё одно узкое место в защите -- таблицы (особенно с учётом п.6).
Тут меня посетила мысль: самая лучшая защита -- отсутствие объекта, который нужно защищать Нет связанных таблиц -- нет проблем.
Значит, нужно что-то сделать, чтоб не болтались линки на таблицы в области переходов. Например, работать с таблицами через экземпляры классов и конектиться к файлу таблиц непосредственно при открытии форм. Поскольку не силён в работе с классами, требуется чья-нибудь квалифицированная помощь.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.11.2011, 13:31
Ответы с готовыми решениями:

Как через VBA скрыть столбец в разделённой форме?
Здравствуйте! Подскажите, какая команда скрывает столбец в разделённой форме?

Работа с указателями на экземпляры классов
чтото не пойму. Я могу както создать указатель, который указывал бы ка экземпляр класса (а не структуры) ? т.е. так: class Program...

Map, List, работа со ссылками на экземпляры классов
Здравствуйте! Есть такой вопрос: если ли разница в том, каким образом делать .push_back(buf) в список listOfFreinds ? Я представил там оба...

17
 Аватар для Сергей1980
547 / 377 / 16
Регистрация: 17.12.2009
Сообщений: 991
18.11.2011, 14:03
Работайте через АDO. Просто в модуле напишите общую процедуру линковки :

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Private Function RefreshLinks() 
Dim dbs As Database 
Dim tdf As TableDef 
 
strFileName = CurrentProject.Path & "\Tables_Stock.mdb" 
Set dbs = CurrentDb 
For Each tdf In dbs.TableDefs 
 
If Len(tdf.Connect) > 0 Then 
  tdf.Connect = ";DATABASE=" & strFileName 
  Err = 0 
  On Error Resume Next 
 
  tdf.RefreshLink 
    If Err <> 0 Then 
       RefreshLinks = False 
       Exit Function 
    End If 
End If 
 
Next tdf 
 
RefreshLinks = True 
End Function

В зависимости от назначения можете постоянно обращаться к данной функции, без всякой привязки таблиц в области переходов. То есть таблицы вообще будут отсутствовать в оболочке.
0
 Аватар для Aeliot
177 / 62 / 3
Регистрация: 17.11.2011
Сообщений: 318
18.11.2011, 15:57  [ТС]
Цитата Сообщение от Сергей1980 Посмотреть сообщение
Visual Basic
1
2
3
4
5
6
7
8
9
   '...
strFileName = CurrentProject.Path & "\Tables_Stock.mdb" 
Set dbs = CurrentDb
For Each tdf In dbs.TableDefs 
   tdf.Connect = ";DATABASE=" & strFileName
   '...
   tdf.RefreshLink
   '...
Next tdf
Поскольку вы предлагаете по циклу обойти все таблицы в текущем проекте и перелинковать их, то надо полагать они всё таки должны присутствовать в текущем проекте как объекты, т.е. уже быть прилинкованными, чего хотелось избежать.

Но всё равно, спасибо.
Вечером ещё поковыряюсь с вашим кодом, может что полезное выйдет.
0
 Аватар для HOUSE MD
453 / 215 / 5
Регистрация: 16.05.2010
Сообщений: 420
18.11.2011, 16:13
Поковыряйте этот пример (конструкция не моя). В нем можно подключать выбраные таблицы. При завершении работы прилинкованые таблицы отключаются.
PS. Прочитали без пароля зашифрованные даные с моего примера
Вложения
Тип файла: rar al0612.rar (50.7 Кб, 72 просмотров)
0
 Аватар для Aeliot
177 / 62 / 3
Регистрация: 17.11.2011
Сообщений: 318
21.11.2011, 12:07  [ТС]
Цитата Сообщение от Сергей1980 Посмотреть сообщение
Работайте через АDO. Просто в модуле напишите общую процедуру линковки
Цитата Сообщение от HOUSE MD Посмотреть сообщение
Поковыряйте этот пример (конструкция не моя). В нем можно подключать выбраные таблицы. При завершении работы прилинкованые таблицы отключаются.
Спасибо за примеры. Но хотелось избежать линковки как такавой.
Не вдаваясь в подробности скажу, что если таблица прилинкована, то очень легко получить от туда данные.

Поковырявшись с ADO. Построил приблизительную модель работы с удалённой базой (см. прикреплённый архив).
Любителям покритиковать говорю сразу: это только модель, чтоп разобраться с технологией.

Что реализовано:
1) Получение данны и загрузка их в форму.
2) Добавление/изменение данных в базе.
3) Управление данными. В принципе, через объект ADODB.Command можно выполнять любые SQL инструкции, применительно к удалённой базе.

К сожалению не получилось добиться такой же динамичности работы как с прилинкованными/локальными таблицами.
Нельзя просто изменять данный в ленточной форме или перейти на последнюю строку и начать писать, чтоб добавить данные в базу. Приходится это делать через отдельное окошко. С другой стороны, так лучше "защита от дурака".

Вот только столкнулся с проблемой обновления данных на форме. Если это отдельная форма, то всё работает. Если форма подчинённая, то вылетает ошибка. Основная функция, ответственная за загрузку данных на форму: "LoadDataOnForm" -- в модуле. Основная проблема -- правильно передать ссылку на форму. Сейчас реализовано через строковую переменную -- передавает модальной форме имя формы, вызвавшей окно изменения данны. Передаётся как "OpenArgs" при выполнении инструкции "DoCmd.OpenForm". Можно было бы сделать это через объектную переменную, но "OpenArgs" может работать только с числами и строками, а глобальных переменных не хотелось бы использовать.

Может кто подскажет как решить проблему.
Вложения
Тип файла: rar accdb_NoLincs.rar (80.9 Кб, 39 просмотров)
0
 Аватар для Aeliot
177 / 62 / 3
Регистрация: 17.11.2011
Сообщений: 318
11.12.2011, 16:12  [ТС]
Может кому-то пригодится.
Здесь написано как правильно реализовывать то, что я пытался реализовать
http://msdn.microsoft.com/en-u... L.90).aspx
1
 Аватар для Сергей1980
547 / 377 / 16
Регистрация: 17.12.2009
Сообщений: 991
12.12.2011, 00:05
Спасибо за ссылку! Посмотрел. Тут какая идея в голову пришла, на форуме как то проходил в примерах запрос к экселевскому файлу, где без всякой линковки можно было выбрать данные и показать в аксессе, вот примерный вид:
SQL
1
SELECT * FROM [Excel 8.0;DATABASE=C:\Microsoft Office Excel.xls].[Лист1$B1:I30]
Вариант предложен Евгением Тесленко.

При данном запросе происходит выборка, прилинкованных таблиц явных и скрытых не видал. Возникла мысль, что наверняка есть подобные запросы и к таблицам родного собственно приложения аксесс. То есть выполняется чисто утилитарная выборка без подвязывания. Предполагаю, что это делается через тип запроса "к серверу" проверить пока не могу, так как пишу с мобильного устройства. Вероятно что и в обычном запросе на выборку можно забабахать нечто подобное, вписав в запрос SQL путь к таблицам. А в последствии этот запрос сделать источником данных формы, отчета , использовать в коде И так далее и.т.п.
P.S. Немного про accde Недостатком файла типа accde является невозможность настраивать и сохранять пользовательские настройки по размеру шрифта, столбцов, цвету. При закрытии файла и последующем его открытии все параметры вывода на экран, такие же как до компиляции. Это неудобно и меня это огорчает. В форме около 80 полей, каждому пользователю нужны свои данные. Он сгребает нужные ему поля в кучку, а после пере загрузки хоп, и все поля на прежнем месте. Копий сломал об эту проблему много. Но ответа не нашел(

Добавлено через 9 минут
Сейчас до дома доберусь, посмотрю, может и без VBA , просто тупо в SQL такой запросец создать можно. Заинтриговался.

Добавлено через 2 часа 58 минут
Добрался, поэкспериментировал с запросами.
Вот оказывается как просто обратиться запросом к таблицам , без линковки:

SQL
1
SELECT * FROM ВашаТаблица IN 'C:ВашПутьазаИсточник.mdb'
И плов готов. Причем в такой конструкции в открывшемся запросе без проблем можно изменять данные в удаленной базе с разделенными таблицами.

В VBA также отлично все работает. Сейчас посмотрю на наличие скрытой линковки. Визуально ничего не висит.

Добавлено через 22 минуты
не, ничего не видно. Юзер не поймет откуда данные беруццо.
2
Эксперт MS Access
 Аватар для alvk
7459 / 4592 / 302
Регистрация: 12.08.2011
Сообщений: 14,375
13.12.2011, 02:50
Это прокатывает даже с прилинкованными к той mdb таблицами, а юзеру зачем таблицы видеть?

p.s. это анекдот с бородой, не ожидал, что это может быть открытием.
p.p.s. используется правда крайне редко.
1
 Аватар для Сергей1980
547 / 377 / 16
Регистрация: 17.12.2009
Сообщений: 991
13.12.2011, 10:45
Так юзеру вроде и не надо, автор ветки данной хочет сделать его совсем бесправным существом запаролить, зашифровать, линковки спрятать / убрать совсем))) лишить возможности использовать шифт итд и.т.п.)))
0
 Аватар для Aeliot
177 / 62 / 3
Регистрация: 17.11.2011
Сообщений: 318
16.12.2011, 08:29  [ТС]
Цитата Сообщение от Сергей1980 Посмотреть сообщение
Так юзеру вроде и не надо, автор ветки данной хочет сделать его совсем бесправным существом запаролить, зашифровать, линковки спрятать / убрать совсем))) лишить возможности использовать шифт итд и.т.п.)))
Эдак прямо в точку.
Нечего сотруднику, отвечающему за изготовление заказа, лазить по базе, где прописано откуда и по каким ценам приходят расходники и куда уходит готовый продукт. А то глядишь так через него скоро левачёк потечет не малым ручейком, а большой реченькой. Как тогда предложите затыкать этот фонтан.
По моему "профилактика" в этих вопросах имеет большое значение.

Добавлено через 14 секунд
Это всё не злобы ради, а профилактики для.

Добавлено через 6 часов 38 минут
Цитата Сообщение от Сергей1980 Посмотреть сообщение
В форме около 80 полей, каждому пользователю нужны свои данные. Он сгребает нужные ему поля в кучку, а после пере загрузки хоп, и все поля на прежнем месте.
А зачем давать сотруднику больше, чем ему надо.
Выдай каждому, так сказать, "по заслугам" -- только то, что ему необходимо для работы.
0
 Аватар для V_Monomax
1406 / 1260 / 20
Регистрация: 09.08.2011
Сообщений: 2,319
Записей в блоге: 1
17.12.2011, 18:13
Цитата Сообщение от Сергей1980 Посмотреть сообщение
Вот оказывается как просто обратиться запросом к таблицам , без линковки:
Код SQL1 SELECT * FROM ВашаТаблица IN 'C:ВашПуть\БазаИсточник.mdb'
И плов готов. Причем в такой конструкции в открывшемся запросе без проблем можно изменять данные в удаленной базе с разделенными таблицами.
А как сюда вставить еще и пароль?
0
 Аватар для Сергей1980
547 / 377 / 16
Регистрация: 17.12.2009
Сообщений: 991
17.12.2011, 19:06
Вопрос то стоял про то, чтобы в бд ничего не висело, не было таблиц линкованных.
0
 Аватар для Aeliot
177 / 62 / 3
Регистрация: 17.11.2011
Сообщений: 318
15.01.2012, 07:58  [ТС]
Вот появилось больше времени и решил отписаться.
Спасибо всем, кто помогал.
Хочу кое-что уточнить, может кому тоже пригодится.

В теме вылезла ветка:
Цитата Сообщение от Сергей1980 Посмотреть сообщение
Вот оказывается как просто обратиться запросом к таблицам , без линковки:
SQL
1
SELECT * FROM ВашаТаблица IN 'C:ВашПутьазаИсточник.mdb'
...
ничего не видно. Юзер не поймет откуда данные беруццо.
Цитата Сообщение от V_Monomax Посмотреть сообщение
А как сюда вставить еще и пароль?
Цитата Сообщение от Сергей1980 Посмотреть сообщение
Вопрос то стоял про то, чтобы в бд ничего не висело, не было таблиц линкованных.
К сожалению, пароль здесь действительно не пропишеш. Как и не пропишешь ConnectingString (а очень хотелось бы). Согласно справке, в предложении IN возможно указать только "адрес" и "тип" используемой базы.

Зато можно сделать такой финт ушами.
1) Делаем, как обычно проект с разделением базы на два файла "таблицы" и "формы".
2) В отличие от стандартных рекомендаций поместить запросы вместе с файлами, помещаем все запросы вместе с таблицами.
3) В качестве источника данных формам, выпадающим спискам и везде где надо пишем почти так, как предложил Сергей. Только в предложении FROM пишем имя вашего сохранённого запроса (к запросам в другой базе можно обратиться так же как и к таблицам). Получаем буквально следующее:
SQL
1
SELECT * FROM ВашЗапрос IN 'C:ВашПутьазаИсточник.mdb'
4) Компилируем файл форм.
5) Файл таблиц прячем и/или защищаем средствами NTFS (о последнем мелкасофты постоянно говорят в справке) в указанном месте.

Что у нас получилось?
Во-первых, источника данных действительно не видно и каждый человек будет работать нолько с тем набором данных, который ему выделен.
Во-вторых, если вы решите изменить условия выборки -- расширить или уменьшить объём данных, доступных пользователю. Или захотите внести какие-то изменения в исходные таблицы. Вам не придётся переделывать "пользовательские" файлы и заново раздавать их. Достаточно будет подправить запрос, сохранённый вместе с таблицами.
2
 Аватар для Сергей1980
547 / 377 / 16
Регистрация: 17.12.2009
Сообщений: 991
15.01.2012, 16:45
Ну да, все верно и хорошо)
0
 Аватар для Aeliot
177 / 62 / 3
Регистрация: 17.11.2011
Сообщений: 318
17.01.2012, 00:39  [ТС]
:cofee:
Уважаемые форумчане, наконец-то я нашёл то, что искал.
Чуть выше я описал часть процесса. Теперь продолжим.
Когда источник данных привели к виду, указанному в пункте 3, открываем окно
Query window
(Query window: A window in which you work with queries in Design view, Datasheet view, SQL view, or Print Preview.) О том как открыть это окно смотрите прикреплённую картинку "1.png"
(см. "2.png"). У него есть два замечательных свойства: SourceConnectStr, SourceDatabase. Уже по названию понятно для чего они (подробнее можно почитать в стандартной справке). В SourceConnectStr собственно и прописываем пароль и прочие вкусности.
Миниатюры
Работа с таблицами разделённой базы через экземпляры классов. Как?   Работа с таблицами разделённой базы через экземпляры классов. Как?  
0
 Аватар для Сергей1980
547 / 377 / 16
Регистрация: 17.12.2009
Сообщений: 991
17.01.2012, 14:36
Тоже ковырял подобные вещи, но в 2007м аксессе. До указанных свойств на картинках добирался в "Запрос к серверу". Самое вкусное в данной ситуации что все эти вещи которые написаны в свойствах запроса можно задать как переменные. В VBA access есть объект, так и называется QUERY. Его можно объявить даже как Dim as QUERY. После присвоения объекту необходимых методов в DAO и ADO можно вылезти программно на указанные на рисунках свойствах. Особую ценность вызывает способность заходить под паролем и использовать ограничения, которые прописаны именно на сервере а не в самой оболочке аксесс! Гуд!
1
 Аватар для Aeliot
177 / 62 / 3
Регистрация: 17.11.2011
Сообщений: 318
17.01.2012, 21:37  [ТС]
--> Сергей1980
Спасибо за то, как добраться до указанных свойств из VBA.
Этого как раз не хватало.
0
 Аватар для Aeliot
177 / 62 / 3
Регистрация: 17.11.2011
Сообщений: 318
22.01.2012, 15:35  [ТС]
Может кому пригодится код, чтоб быстро изменить адрес расположения базы, указанный в предложении IN
Кнопка
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
Private Sub cmdGo_Click()
    Dim ctl As Control
    Dim objFrm As AccessObject
    Dim prp As Property
    Dim strFormName As String
    Dim strMeName As String
    Dim strSource As String
    
    Const coSourceFrom As String = "IN 'd:\.Programms\Office Access\accdb_ Предприятие\tables\Предприятие_таблицы.accdb';"
    Const coSourceTo As String = "IN 'd:\.Programms\Office Access\accdb_ Предприятие\tables\tables_in\Предприятие_таблицы.accdb';"
    
    On Error GoTo ErrorHandler
    
    strMeName = Me.Name
    ' отключаем обновление экрана
    Application.Echo False, "Идёт получение свойств. Это может занять значительное время. Подождите..."
    ' перечитываем все формы, сохранённые в базе
    For Each objFrm In CurrentProject.AllForms
        strFormName = objFrm.Name
        Select Case strFormName
            ' список форм, исключённых из обработки
            Case Is = strMeName, "Заставка", "frmAndmDeveloper", "frmAndmReLincTables" _
                                , "frmAndmSincCenter", "frmAndmSincro"
            Case Else
                ' открываем форму
                DoCmd.OpenForm strFormName, acDesign
                
                ' выбираем свойство "источник записей"
                Set prp = Forms(strFormName).Properties("RecordSource")
                ' изсеняем источник данных
                If Not IsNull(prp.Value) Then
                    strSource = prp.Value
                    prp.Value = Replace(strSource, coSourceFrom, coSourceTo)
                End If
                
                ' перечитываем элементы формы
                For Each ctl In Forms(strFormName).Controls
                    ' выбираем свойство "тип элемента"
                    Set prp = ctl.Properties("ControlType")
                    ' если это ComboBox
                    If prp.Value = 111 Then
                        ' выбираем свойство "источник строк"
                        Set prp = ctl.Properties("RowSource")
                        ' изсеняем источник данных
                        If Not IsNull(prp.Value) Then
                            strSource = prp.Value
                            prp.Value = Replace(strSource, coSourceFrom, coSourceTo)
                        End If
                    End If
                Next ctl
                
                ' закрываем форму с сохранением изменений
                DoCmd.Close acForm, strFormName, acSaveYes
        End Select
    Next objFrm
    
    ' включаем обновление экрана
    Application.Echo True, "Получение свойств завершено."
    MsgBox "Обработка окончена"
    Exit Sub
    
ErrorHandler:
    MsgBox "Error " & err.Number & " in " & err.Source & vbCr _
            & err.Description
    err.Clear
    Resume Next
End Sub
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.01.2012, 15:35
Помогаю со студенческими работами здесь

Как использовать экземпляры классов МFC?
Такая проблема: С помощью MFC AppWizard создал проект, в котором редактируется некая древо-структура. Есть класс СMyDoc, который...

Как положить в массив экземпляры классов?
Здравствуйте! Есть задача. У меня есть 2 класса FixedMonthlyCostPaidService и FixedHourlyCostPaidService, которые считают среднемесячные...

Как сохранить экземпляры классов в один массив ?
Ребята, привет. Подскажите, пожалуйста, как решить задачу. Есть абстрактный класс. Есть два класса, которые наследуются от него....

Как сериализовать/десериализовать экземпляры классов в файл
Проблема следующая: Имеется три класcа: class Class1 { // Список полей и методов } class Class2 { // Список полей и...

Как случайным образом вывести экземпляры двух классов?
Выходит ошибка о том что класс не может конвертироваться в инт public void StartRun(Driver driver) { Random...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru