授予MSysObjects的读取权限

时间:2015-09-29 12:04:25

标签: powershell ms-access metadata adodb office-automation

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

我一直收到以下错误:

  

无法读取记录;对MsysObjects'。

没有读取权限

所以我深入挖掘:

我已经在C#部分(see herethis 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上允许读取权限?

1 个答案:

答案 0 :(得分:1)

您必须解决两个问题:

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

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

  3. 如果您不知道在哪里可以找到系统数据库,请打开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