返回列表 发帖

[问题求助] WIN7 64位系统VBS无法正常ADODB.Connection的问题以及其他一些疑问

MdbAddr = "\\win-pc\vbs\1.mdb"
Miaoshu = 1 '定义秒数等于1
Shijian = Miaoshu*1000 '间隔时间等1乘1000毫秒
Dim WMI'定义变量
Set WMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
'建立wmi服务连接。
'完整格式是:"winmgmts:[{SecuritySettings}!][\\ComputerName][\Namespace][:ClassName][.KeyProperty='Value']" winmgmts:"是前缀, 表示为WMI服务;第二部分用来验证权限和假冒级别的;
'获取计算机名
Set colComputers = WMI.ExecQuery("Select * from Win32_ComputerSystem")
For Each objComputer in colComputers
    PcName = objComputer.Name
Exit For
Next
'查找活动连接
Set colItems = WMI.ExecQuery("Select * from Win32_NetworkAdapterConfiguration Where IPEnabled='TRUE'")
For Each objItem In colItems
    NetName =  Replace(objItem.Description,"/","_") '获取网卡名
    MacAddr = objItem.MacAddress '获取mac地址
For Each objAddress in objItem.IPAddress
If objAddress <> "" then
IpAddr = objAddress '获取ip地址
Exit For
End If
Next
Next
Set colItems = Nothing '释放对象colItems
UserName= CreateObject("wscript.network").username
'将控制权传递给函数Network
Call Network(Name)
Function Network(Names)
  '判断数据库文件是否存在
If CreateObject("Scripting.FileSystemObject").FileExists(MdbAddr) Then
'MsgBox "数据库文件已经存在"
Else
'MsgBox "数据库文件不存在,创建数据库"
'创建数据库
CreateObject("ADOX.Catalog").Create "Provider=Microsoft.Jet.OLEDB.4.0;Data Source =" & MDBaddr
'创建表以及字段
Set connObj = CreateObject("ADODB.Connection")
connObj.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = " & MdbAddr
connObj.Execute "CREATE TABLE Speed(计算机名 varchar(255),用户名 varchar(255),IP地址 varchar(255),下载速度 varchar(255),上传速度 varchar(255),时间 varchar(255),MAC地址 varchar(255),网卡名称 varchar(255))"
connObj.Close
Set connObj = Nothing
End If
'循环开始
Do
Dim A
Set A = WMI.ExecQuery("Select * from Win32_PerfRawData_Tcpip_NetworkInterface Where Name = '"& NetName &"'")
For Each B In A
    R1 = B.BytesReceivedPersec '接收包
    S1 = B.BytesSentPersec '发送包
    T1 = B.BytesTotalPersec '总流量
    If T0 ="" Then :T0 = B.BytesTotalPersec :End If
Next
Set A = Nothing '释放A的对象
WScript.Sleep(Shijian) '延迟时间获取数据
Set A = WMI.ExecQuery("Select * from Win32_PerfRawData_Tcpip_NetworkInterface Where Name = '"& NetName &"'")
For Each B In A
    R2 = B.BytesReceivedPersec
    S2 = B.BytesSentPersec
    T2 = B.BytesTotalPersec
Next
Set A = Nothing
Down=CheckSize((R2-R1)/Miaoshu) &"/s" '计算下载速率
Up=CheckSize((S2-S1)/Miaoshu) &"/s" '计算上传速率
'数据库更新
Dim rsObj
Set connObj = CreateObject("ADODB.Connection") '前面虽然已经定义,但是后来释放了
connObj.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=" & MdbAddr
     connObj.Open
Set rsObj = CreateObject("ADODB.RecordSet") '数据的操作,主要靠的是ADODB.RecordSet对象
rsObj.Open "select * FROM Speed where MAC地址 = '"& MacAddr & "'", connObj, 1, 3
If Not rsObj.Eof Then
'MsgBox rsObj("MAC地址")&"已有数据,更新信息"
rsObj("计算机名") = pcname
rsObj("用户名") = username
rsObj("IP地址") = ipaddr
rsObj("下载速度") = down
rsObj("上传速度") = up
rsObj("时间") = Now()
rsObj.Update
rsObj.Close
connObj.Close
Else
'MsgBox "没有数据,添加新数据"
rsObj.Close
connObj.Close
connObj.open
rsObj.Open "select * FROM Speed", connObj, 1, 3
rsObj.AddNew
If Not rsObj.Eof Then
rsObj("计算机名") = PcName
rsObj("用户名") = UserName
rsObj("IP地址") = IpAddr
rsObj("下载速度") = Down
rsObj("上传速度") = Up
rsObj("时间") = Now()
rsObj("MAC地址") = MacAddr
rsObj("网卡名称") = NetName
rsObj.Update
rsObj.Close
connObj.Close
End If
End If
Set rsObj = Nothing
Set connObj = Nothing
Loop
End Function
'函数checksize
Function CheckSize(SZ)
On Error Resume Next
If SZ => 1073741824 Then
   SZ = FormatNumber(SZ/1073741824) & " GB"
   ElseIf SZ => 1048576 Then
   SZ = FormatNumber(SZ/1048576) & " MB"
   ElseIf SZ => 1024 Then
   SZ = FormatNumber(SZ/1024) & " KB"
Else
   SZ = SZ & " B"
End If
CheckSize=Right("      " & SZ,10)
End FunctionCOPY
最新刚学习vbs脚本。在论坛找了几个实例,修理了一下,让脚本更符合自己的需求使用。
基本大体是完成了(有幸得到论坛高手指导),不知道有什么不合理的地方。希望各位大侠帮忙指正一下。

不过该脚本在windows 7 64位的系统下面运行会出错,出错提示是:
脚本:        E:\1.vbs
行:                79
字符:        6
错误:        未找到提供程序。该程序可能未正确安装。
代码:        800A0E7A
源:           ADODB.Connection

在论坛提过一次问题,但是@yu2n 大佬说他的测试环境没有问题。也看了不少类似问题的帖子。不过大部分都是针对于ASP IIS上面的,少有vbs提及。

在此想问各位高手、英雄好汉们几个疑问:
1、win7 64无法ADODB.Connection的这个问题;
2、vbs如何用批处理的结果(例如批处理中的%username%等比较方便的获取系统信息的命令);
3、上面的脚本是不规范或者不合理的地方?
小弟在此谢过各位了!

1、win7 64无法ADODB.Connection的这个问题;
Win7 x64 操作系统不支持Microsoft OLE DB Provider for Jet驱动程序,也不支持更早的Microsoft Access Driver (*.mdb)方式连接。
解决:1. 在MSHTA中使用VBS编程;2. 使用VBA编程COPY
2、vbs如何用批处理的结果(例如批处理中的%username%等比较方便的获取系统信息的命令);
'WhoAmI
Msgbox CreateObject("WScript.Shell").ExpandenVironmentStrings("%COMPUTERNAME%\%USERNAME%")COPY
3、上面的脚本是不规范或者不合理的地方?
1. 程序语法结构不整洁
2. 变量 NetName 与 Name
3. SQL插入、更新操作尽量使用Insert Into、Update语句。这里可以不用ADODB.RecordSet,使用ADODB.Connection的objConn.Execute(strSql)即可。
4. 猜测楼主是想要这个程序实现,将多台电脑的网卡流量状态实时写入这个Windows共享的Access数据库,这实在不是什么好主意……COPY
参考:
win7 64位环境运行程序出现提示microsoft.jet.oledb4.0未注册
http://answers.microsoft.com/zh- ... d-9bbc-d91759839fe1
『千江有水千江月』千江有水,月映千江;万里无云,万里青天。    http://yu2n.qiniudn.com/

TOP

回复 2# yu2n


    4. 猜测楼主是想要这个程序实现,将多台电脑的网卡流量状态实时写入这个Windows共享的Access数据库,这实在不是什么好主意……

确实不是好注意,今天测试了一下发现仅有26台pc可以正常使用,其他的再想想入就会提示数据库被xxx占用了。。。
小弟才疏学,没接触过编程,所以没什么好办法啊。

TOP

回复 3# 437153
方法1:可以考虑在服务器主机安装SQL Server。客户机使用ADO直接写数据到SQL Server。
方法2:可以考虑在服务器主机安装HTTP Server + SQL Server。客户机直接POST数据到HTTP Server。(适用于对安全性、大流量、内外网访问有要求的场景)
『千江有水千江月』千江有水,月映千江;万里无云,万里青天。    http://yu2n.qiniudn.com/

TOP

回复 4# yu2n


    多谢指导。感激不尽

TOP

返回列表