授予 MSysObjects 的读取权限

Grant read permission for MSysObjects

我需要获取数百个 MS Access 数据库的元数据,因此我需要自动执行元数据收集过程。 我想查询 here 描述的内容,但在查询数据库之前,我需要对 MSysObjects 表进行读取访问。

我不断收到以下错误:

Record(s) cannot be read; no read permission on 'MsysObjects'.

所以我挖得更深:

我已阅读 C# 部分中有关类似问题的文章 (see here and also 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 

执行脚本抛出以下错误原因:

Cannot open the Microsoft Office Access database engine workgroup information file.

如何允许 MSysObjects 的读取权限?

您必须解决两个问题:

  1. 您的代码在与 Access ACCDB 数据库交互时将使用 Access 安全帐户 "Admin"。其他 Access 安全帐户仅在您实施了 Access 用户级安全性 (ULS) 后才可用,但该功能仅适用于 MDB 格式数据库。因此,对于 ACCDB,除了 "Admin".

  2. 之外,您不能 GRANT 任何其他帐户
  3. 您必须在连接字符串中包含 "System database" 的位置。

如果您不知道在哪里可以找到系统数据库,请打开 Access 并在即时 window 中检查此语句的输出。 (Ctrl+g 会立即打开window)

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