1

我有一个多用户 Access 数据库,每天使用 powershell 脚本进行压缩。如果仍有用户登录,此脚本无法压缩数据库。如果有用户登录,我希望能够识别忘记注销数据库的用户并提醒他们注销一天结束。

如果我要在 VB 中编写它,它将像这样工作:

Dim cn as ADODB.Connection
Dim rs as ADODB.Recordset
cn.open("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=...mdb")
Set rs = cn.OpenSchema(adSchemaProviderSpecific, ,"{947bb102-5d43-11d1-bdbf-00c04fb92675}")

然后循环遍历记录集并获取我想要的信息。

我想做的是将它翻译成 PowerShell,以便它可以使用紧凑的脚本运行。我尝试了以下方法:

$objCon = New-Object -ComObject ADODB.Connection
$objRs = New-Object -ComObject ADODB.Recordset
$objCon.Open("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=...mdb")
$objRs= $objCon.OpenSchema([ADODB.SchemaEnum]::adSchemaProviderSpecific,$null,'{947bb102-5d43-11d1-bdbf-00c04fb92675}')
$objRs.MoveFirst()

然后遍历记录集并找到我需要的信息。

OpenSchema 行上的 ps 代码错误:

使用“3”参数调用“OpenSchema”的异常:“对象或提供者无法执行请求的操作。” 在 FindUsers.ps1:8 char:27 + $objRs= $objCon.OpenSchema <<<< ([ADODB.SchemaEnum]::adSchemaProviderSpecific,$null,'{947bb102-5d43-11d1-bdbf-00c04fb92675}') + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : DotNetMethodException

如果我删除中间的 $null 变量或将其替换为 '',脚本将不会执行,并且我不知道该命令是否正确地从 VB 转换为 powershell。我在 Google 和 SO 上进行了搜索,但没有找到任何解决方案。我需要做什么才能使用 OpenSchema 命令?

4

1 回答 1

1

这适用于我使用 Office 2007 及更高版本中包含的较新的 ACE 驱动程序:

$filepath = "C:\Users\u00\Documents\Northwind.mdb"
[guid]$guid = '947bb102-5d43-11d1-bdbf-00c04fb92675'

$ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=`"$filepath`";Persist Security Info=False;"
$conn = new-object System.Data.OleDb.OleDbConnection($ConnectionString)
$conn.open()
$conn.GetOleDbSchemaTable($guid,$null) 
$conn.close()

COMPUTER_NAME                    LOGIN_NAME 
-------------                    ---------- 
Z002                             Admin   
于 2012-11-21T00:20:04.270 回答