如何通过JS ActiveX ADO在MS Access 2013中通过视图查询执行VBA宏?
VBA功能是使用以下命令获取当前登录的用户
Public Declare Function GetUser Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
视图查询是返回VBA函数值的选择语句。
我想通过LAN(相同的域策略)从JS ActiveX ADO执行该视图查询。查询引发错误,提示我至少需要一个表或查询。我还注意到,如果我从不执行VBA函数的视图查询中读取信息,则该查询毫无问题地通过。这是设计上的安全控制吗?可以通过此设置获取用户ID吗?
谢谢!
答案 0 :(得分:2)
在Access应用程序会话中,称为“表达式服务”的功能允许db引擎使用您的VBA用户定义的函数。因此,您的查询可以在Access会话中正常运行。
但是,当您尝试通过JavaScript运行相同的查询时,不会在Access应用程序会话中执行该查询...因此,表达式服务不可用,不允许数据库引擎使用您的UDF。因此,查询尝试失败。
并且该查询方法无法起作用。建议您探索@dbmitch提供的WScript.Network
方法。
答案 1 :(得分:1)
您可能无法直接从查询中调用API函数,但是如果将其放在Access模块中,并且创建了一个返回字符串的函数,那么它应该对您有用。
您还没有发布任何其他代码或SQL,所以我不确定您是否尝试过。
这就是我在使用与您使用的相同API子查询中使用的
Public Function NetworkUserName() As String
Dim strBuffer As String * 255
Dim lngBufferLength As Long
Dim lngRet As Long
Dim strTemp As String
lngBufferLength = 255
lngRet = GetUSer(strBuffer, lngBufferLength)
NetworkUserName = Left$(strBuffer, InStr(strBuffer, Chr$(0)) - 1)
End Function
然后您的查询看起来就像
SELECT NetworkUsername AS CurrentUser
编辑-添加可能的选项以在JScript中使用ActiveX对象
您可以尝试使用%USERNAME%
ActiveX对象和Wscript.Shell
方法来提取环境变量ExpandEnvironmentStrings
,而不是使用ADODB调用。
但是您可能正在寻找网络用户名-也许这在JScript中就足够了
var winNet = new ActiveXObject("WScript.Network");
alert(winNet.UserName);