Вы можете использовать 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