locked
在Windows 7 或Vista 裏,VB 2005 怎樣Check 檔案權限? RRS feed

  • 問題

  • 我係檔案係在Application.CommonAppDataPath裏的。
    User A Account 登入Vista or Windows 7, 
      用VB2005 Program 建立了一個ABC.mdb檔案在Application.CommonAppDataPath裏。
      之後登出。
    User B Account 登入Vista or Windows 7,
      只能讀ABC.mdb,
      但當用MessageBox.Show(My.Computer.FileSystem.GetFileInfo(strDBPath).Attributes.ToString)
      出來的Attributes同User A 是一樣的。
      只是在Update時,就會將Updated MDB自動Save在C:\User\UserB\AppData\Local\VirtualStore\ProgramData\ABC資料夾裏。

    另外VB2005點可以Set檔案的Access Right呢?可以使所有User都可以讀寫這個File。
    2010年1月19日 上午 03:56

解答

  • 你可以利用 System.Security.AccessControl 命名空間中的東西來做。
    Keyword: FileSecurity class

    另外,在 Windows Vista 和 7 中,你的這個呼叫會受到 UAC 的攔載,所以你自己要處理好授權這部份。


    初學不是問題,但用不正確的態度來問問題,那就是很大的問題。
    請不要藉新手之名行小白之實,否則只會讓更多無辜的新手得不到幫助而已。
    如果不知道什麼是小白,請參閱:何謂小白
    • 已標示為解答 Lolota Lee 2010年1月26日 上午 07:54
    • 已取消標示為解答 Ian Wong 2010年1月27日 上午 03:17
    • 已標示為解答 璉璉Moderator 2010年1月31日 上午 05:29
    2010年1月19日 上午 04:16
    版主
  • 1. 透過 FileInfo.GetAccessControl() 來取得 FileSecurity 物件。
    2. 用 FileSecurity.GetAccessRules() 來取得權限的設定。

    不過如果你要用 Windows 本身的檔案系統權限來管,本來就不會太簡單 ...

    並且,如果 UserB 權限不足的話,你想要的 Update DB 動作也會失敗 ...
    初學不是問題,但用不正確的態度來問問題,那就是很大的問題。
    請不要藉新手之名行小白之實,否則只會讓更多無辜的新手得不到幫助而已。
    如果不知道什麼是小白,請參閱:何謂小白
    • 已標示為解答 Lolota Lee 2010年1月26日 上午 07:54
    • 已取消標示為解答 Ian Wong 2010年1月27日 上午 03:17
    • 已標示為解答 璉璉Moderator 2010年1月31日 上午 05:29
    2010年1月20日 上午 06:53
    版主

所有回覆

  • 你可以利用 System.Security.AccessControl 命名空間中的東西來做。
    Keyword: FileSecurity class

    另外,在 Windows Vista 和 7 中,你的這個呼叫會受到 UAC 的攔載,所以你自己要處理好授權這部份。


    初學不是問題,但用不正確的態度來問問題,那就是很大的問題。
    請不要藉新手之名行小白之實,否則只會讓更多無辜的新手得不到幫助而已。
    如果不知道什麼是小白,請參閱:何謂小白
    • 已標示為解答 Lolota Lee 2010年1月26日 上午 07:54
    • 已取消標示為解答 Ian Wong 2010年1月27日 上午 03:17
    • 已標示為解答 璉璉Moderator 2010年1月31日 上午 05:29
    2010年1月19日 上午 04:16
    版主
  • 但如果開了UAC的話,我可以怎樣能知道檔案授權是什麼呢?
    我試著從AccessControl入手,找到
    fSecurity.GetSecurityDescriptorSddlForm(AccessControl.AccessControlSections.Access)
    但係唔係好明它所表示的是什麼?可否解釋一下呢?
    如在2000中,讀一個檔案的Result係 = D:P(A;;FA;;;WD)
    如在Vista中,讀一個檔案的Result係 = D:AI(A;ID;FA;;;SY)(A;ID;FA;;;BA)(A;ID;FA;;;S-1-5-21-2883845441-897647281-1492538406-1000)(A;ID;0x1200a9;;;BU)
    其實可唔可以用這個Descriptor就知道Login User對這個檔案的授權呢?
    • 已標示為解答 Ian Wong 2010年1月27日 上午 03:17
    • 已取消標示為解答 Ian Wong 2010年1月27日 上午 03:17
    2010年1月20日 上午 02:35
  • 1. 透過 FileInfo.GetAccessControl() 來取得 FileSecurity 物件。
    2. 用 FileSecurity.GetAccessRules() 來取得權限的設定。

    不過如果你要用 Windows 本身的檔案系統權限來管,本來就不會太簡單 ...

    並且,如果 UserB 權限不足的話,你想要的 Update DB 動作也會失敗 ...
    初學不是問題,但用不正確的態度來問問題,那就是很大的問題。
    請不要藉新手之名行小白之實,否則只會讓更多無辜的新手得不到幫助而已。
    如果不知道什麼是小白,請參閱:何謂小白
    • 已標示為解答 Lolota Lee 2010年1月26日 上午 07:54
    • 已取消標示為解答 Ian Wong 2010年1月27日 上午 03:17
    • 已標示為解答 璉璉Moderator 2010年1月31日 上午 05:29
    2010年1月20日 上午 06:53
    版主
  • 如果能夠係Update唔到,還好呢!
    最難係佢Update到,但其實係將原本那個mdb複製了一個入VirturalStore\ProgramData\....下。然後Update了入去。
    都唔知點解UAC要咁做呢!
    Dim fSecurity As System.Security.AccessControl.FileSecurity
    Dim obTypeToGet as Type
    Dim obAuthColl as System.Security.AccessControl.AuthorizationRuleCollection

    fSecurity = File.GetAccessControl("c:\programdata\ABC\abc.txt")
    obTypeToGet = Type.GetType("System.Security.Principal.SecurityIdentifier")
    obAuthColl = fSecurity.GetAccessRules(True, True, obTypeToGet)
    For i = 0 To obAuthColl.Count - 1
      obAuthRule1 = obAuthColl.Item(i)
      MessageBox.Show(obAuthRule1.ToString)
      MessageBox.Show(obAuthRule1.IdentityReference.ToString)             'result = S-1-1-0
      MessageBox.Show(obAuthRule1.InheritanceFlags.ToString)               'result = None
      MessageBox.Show(obAuthRule1.IsInherited.ToString)                      'result = True
      MessageBox.Show(obAuthRule1.PropagationFlags.ToString)              'result = None
    Next

    但點先可以解讀到這個User的權限呢?
    2010年1月20日 上午 08:16