我需要获取数百个MS Access DB的元数据,因此我需要自动化元数据收集过程。
我想查询描述here的内容,但在我查询数据库之前,我需要对MSysObjects
表的读访问权。
我一直收到以下错误:
无法读取记录;对MsysObjects'。
没有读取权限
所以我深入挖掘:
我已经在C#部分(see here和this one)阅读了有关类似问题的文章。
我整理了一个简单的脚本,该脚本适用于创建表等,但是我在设置读取权限方面遇到了问题。
$ScrUsr = $(whoami)
Write-Host $ScrUsr
$cmd = "GRANT SELECT ON MSysObjects TO [$ScrUsr]"
Write-Host $cmd
Function Invoke-ADOCommand($Db)
{
$connection = New-Object -ComObject ADODB.Connection
$connection.Open("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=$db;" )
$command = New-Object -ComObject ADODB.Command
$command.ActiveConnection = $connection
$command.CommandText = $cmd
$rs = $command.Execute()
$connection.Close()
}
$Db = "C:\Temp\test1.accdb"
Invoke-ADOCommand -db $Db
执行脚本会引发错误原因:
无法打开Microsoft Office Access数据库引擎工作组信息文件。
如何在MSysObjects
上允许读取权限?
答案 0 :(得分:1)
您必须解决两个问题:
在与Access ACCDB数据库交互时,您的代码将使用Access安全帐户" Admin" 。其他Access安全帐户仅在您实施了Access用户级安全性(ULS)时才可用,但该功能仅适用于MDB格式数据库。因此,使用ACCDB,除了"管理员" 之外,您无法GRANT
任何帐户。
您必须在连接字符串中包含"系统数据库" 的位置。
如果您不知道在哪里可以找到系统数据库,请打开Access并在立即窗口中检查此语句的输出。 ( Ctrl + g 将打开立即窗口)
Debug.Print Application.DBEngine.SystemDb
我的系统数据库是 C:\ Users \ hans \ AppData \ Roaming \ Microsoft \ Access \ System1.mdw 在下面的代码示例中替换你的。
我对Powershell并不十分精通,但这个例子对我来说没有错误。 (请务必同时更改$Db
和$SystemDb
。)
$ScrUsr = $(whoami)
Write-Host $ScrUsr
$cmd = "GRANT SELECT ON MSysObjects TO Admin;"
Write-Host $cmd
Function Invoke-ADOCommand($Db, $SystemDb)
{
$connection = New-Object -ComObject ADODB.Connection
$ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=$db;Jet OLEDB:System database=$SystemDb;"
Write-Host $ConnectionString
$connection.Open($ConnectionString)
$discard = $connection.Execute($cmd)
$connection.Close()
}
$Db = "C:\Users\hans\AccessApps\Sample.accdb"
$SystemDb = "C:\Users\hans\AppData\Roaming\Microsoft\Access\System1.mdw"
Invoke-ADOCommand -db $Db -SystemDb $SystemDb