Как сделать форму доступа автоматически открытой для данных пользователя? - PullRequest
0 голосов
/ 16 ноября 2010

Я пытаюсь написать код VB, который позволил бы Access узнать идентификатор компьютера человека, открывающего базу данных, открыть форму и выполнить фильтрацию записей, назначенных пользователю.Кто-нибудь знает, как этого добиться?

Ответы [ 2 ]

2 голосов
/ 16 ноября 2010

API для получения имени пользователя , вероятно, лучше, чем использование Environ .Если имя доступно в таблице, вы можете использовать DLookUp для получения идентификатора, который можно использовать с аргументом метода OpenForm объекта DoCmd для открытия отфильтрованногосписок.

0 голосов
/ 20 ноября 2010

Вы можете использовать Environ $ («ComputerName»), если это то, что вы подразумеваете под ComputerID.Вот быстрый и грязный способ, которым я это сделал.Обратите внимание, что пользователь обычно может отключить фильтр формы.Как уже говорили другие, переменные окружения на ПК могут быть изменены пользователем без прав администратора.

Если вы обеспокоены тем, что пользователь изменит переменную окружения для компьютера (например, SET COMPUTERNAME= MYBOSS через cmd) вы можете использовать вызов Win32 API для получения значения ComputerName, если вы знаете, что пользователь не является администратором и не может изменить имя компьютера через реестр или через окна (см. Ниже).

CAVEAT с API

Если у пользователя есть права администратора на ПК, и он может редактировать значения реестра HKLM, он может сделать следующую запись в реестре:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName]
"ComputerName"="MyBossComputerName"

Если они перезагрузят компьютер, вызов Windows API будет использовать неправильное имя.Затем они могли бы восстановить нормальную запись реестра и перезагрузить компьютер.

В моем сценарии несколько пользователей работают в разные дни с одного компьютера и базы данных Access.Они открывают базу данных из общей папки на ПК.Когда они щелкают по элементу коммутатора и форма открывается, запускается событие Load формы.Эта форма привязана к таблице со столбцом с именем USERNAME, который является просто значением переменной среды UserName (например, John.Smith).

Вот VBA, которую я вставил в событие загрузки:

Private Sub Form_Load()
    Dim currUser As String
    DoCmd.Maximize
    currUser = Environ$("USERNAME")
    Me.Filter = "USERNAME = '" & currUser & "'"
    Me.FilterOn = True
End Sub

Решение API Call

Если вы хотите вместо этого сделать вызов API, чтобы получить ComputerName, вы можете сделать следующее:

Вызов APIGetComputerName является производным от кода Кена Гетца (Справочник разработчика VBA) или Дэна Эпплмана (Руководство программиста Visual Basic по Win32 API).Вы также найдете это по всему интернету.Сначала добавьте модуль в ваш проект, переименуйте его в API или что-то значимое.Затем вставьте следующий код:

Private Declare Function GetComputerName Lib "kernel32" _ 
   Alias "GetComputerNameA"(ByVal strBuffer As String, lngSize As Long) As Long

Public Function ComputerNameValue() As String
   Dim strBuffer as String
   Dim retValApi as Long
   Dim bufferSize as Long

   bufferSize = 256

   strBuffer = Space(bufferSize)

   'bufferSize will be returned with ComputerName length less null character.'

   retValApi = GetComputerName(strBuffer, bufferSize) 

   If CBool(retValApi) Then
      ComputerNameValue = Left$(strBuffer, bufferSize)
   Else
     'Your Error Handler'
   End If

End Function

В событие загрузки формы (изменено для использования функции-оболочки API вместо Envrion $):

Private Sub Form_Load()
    Dim PCName As String
    DoCmd.Maximize
    PCName = ComputerNameValue()
    Me.Filter = "COMPUTERNAME = '" & PCName & "'"
    Me.FilterOn = True
End Sub
...