通过JS ActiveX ADO在MS Access 2013中通过视图查询执行VBA功能

时间:2018-07-26 12:51:57

标签: sql vba ms-access access-vba activex

如何通过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吗?

谢谢!

2 个答案:

答案 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);