寻找Environ("Username")的安全替代方案(Access字段自动填充场景)
替代Environ("Username")的安全方案(适配Access沙箱限制)
Hey Rob, 我太懂你这个烦恼了——本来想用Environ("Username")自动给新记录填用户ID和日期,结果被沙箱拦了,确实挺闹心的。这里有几个亲测好用的替代方案,完全避开不安全函数的限制:
方案1:用WScript.Network组件获取Windows用户名
这个是最简便的替代方法,Windows自带的组件,沙箱基本不会拦截,效果和Environ("Username")完全一致,都是获取当前登录Windows的用户名。
你可以在表单的BeforeInsert事件里写这段代码:
Private Sub Form_BeforeInsert(Cancel As Integer) ' 填充用户ID字段 Me.UserIDField = CreateObject("WScript.Network").UserName ' 填充日期字段(用Date()获取日期,Now()获取日期+时间) Me.DateField = Date End Sub
设置好之后,每次新建记录时,这两个字段就会自动填充啦。
方案2:用Access内置的CurrentUser()(需场景匹配)
如果你的数据库用的是Windows集成认证(也就是不用输入Access账号,直接用Windows身份登录),CurrentUser()会直接返回当前Windows用户名,这个是Access的安全内置函数,绝对不会被沙箱拦截。
但要注意:如果你的数据库是用Access本地账号(比如默认的Admin账号)登录的,那CurrentUser()返回的是Access的登录名,不是你要的Windows用户ID,这种场景就不适用啦。
方案3:用Windows API获取用户名(最稳定兼容)
如果上面两种方法都有问题,试试这个底层API调用的方法,兼容性拉满,几乎所有Windows版本都支持,沙箱也很少会拦截系统API:
首先在模块里声明API函数:
Private Declare Function GetUserNameA Lib "advapi32.dll" _ (ByVal lpBuffer As String, nSize As Long) As Long Function GetWindowsUserName() As String Dim buffer As String Dim bufferSize As Long bufferSize = 255 buffer = String(bufferSize, vbNullChar) If GetUserNameA(buffer, bufferSize) <> 0 Then GetWindowsUserName = Left(buffer, bufferSize - 1) Else GetWindowsUserName = "Unknown User" End If End Function
然后在表单的BeforeInsert事件里调用:
Private Sub Form_BeforeInsert(Cancel As Integer) Me.UserIDField = GetWindowsUserName() Me.DateField = Now() ' 这里用Now()获取带时间的日期 End Sub
另外提一句,日期字段的填充直接用Date()或Now()就好,这俩都是Access的安全内置函数,完全不会被沙箱限制,不用找替代哦。
内容的提问来源于stack exchange,提问作者Rob Jackson
相关产品推荐
相关产品推荐

