授予 MSysObjects 读取权限

ram*_*mmy 5 powershell ms-access metadata adodb office-automation

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

我不断收到以下错误:

无法读取记录;没有“MsysObjects”的读取权限。

所以我更深入地挖掘:

我已经阅读了 C# 部分中有关类似问题的文章(请参阅此处以及此一篇)。

我编写了一个简单的脚本,该脚本非常适合创建表等,但我在设置读取访问权限时遇到问题。

$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 
Run Code Online (Sandbox Code Playgroud)

执行脚本引发以下错误原因:

无法打开 Microsoft Office Access 数据库引擎工作组信息文件。

我怎样才能允许读取权限MSysObjects

Han*_*sUp 5

您必须解决两个问题:

  1. 与 Access ACCDB 数据库交互时,您的代码将使用 Access 安全帐户“Admin” 。仅当您实施了 Access 用户级安全性 (ULS) 时,其他 Access 安全帐户才可用,但该功能仅适用于 MDB 格式数据库。因此,使用 ACCDB,您无法对“Admin”GRANT以外的任何帐户执行任何操作。

  2. 您必须在连接字符串中包含“系统数据库”的位置。

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

Debug.Print Application.DBEngine.SystemDb
Run Code Online (Sandbox Code Playgroud)

我的系统数据库是 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
Run Code Online (Sandbox Code Playgroud)