2012-06-29 30 views
4

我正在創建一個WPF應用程序,其中應檢查是否存在多個映射的驅動器。代碼很簡單:當以管理員身份運行時,DriveInfo.GetDrives()未返回映射的驅動器

DriveInfo[] systemDrives = DriveInfo.GetDrives(); 
foreach (DriveInfo i in systemDrives) 
{ 
    if ((i.Name.Contains("V")) && (i.IsReady)) 
    { 
      result = true; 
      break; 
    } 

} 

映射的驅動器映射爲所有用戶。上面的代碼在以普通用戶身份運行時工作正常,但是Visual Studio 2010以管理員身份運行,GetDrives方法僅返回固定驅動器和DVD驅動器,但不返回映射驅動器。如果可執行文件以管理員身份運行,則會發生相同情況任何想法,爲什麼這可能會發生?

回答

5

http://www.vistaheads.com/forums/microsoft-public-windows-vista-general/125180-run-administrator-loses-access-mapped-drives.html,(通過http://social.technet.microsoft.com/Forums/en-US/w7itpronetworking/thread/31c9eff2-ece3-4430-886d-19b54796e411/

其實,這是正常的行爲。正如您在XP上看到的,驅動器映射 特定於用戶上下文。因此,如果User1具有驅動器H:映射到 \ server \ share1,則User2不會自動獲得對該驅動器映射的此訪問權限 ;它只存在於User1的會話中。如果用戶2想要訪問\ server \ share1,則需要創建他們自己的映射: H:驅動器或任何適合的其他驅動器。

那麼,它在Vista中是一樣的......只有更多。

不同於以往版本的Windows,當管理員登錄到 運行Windows Vista,用戶的完全管理員訪問 令牌分爲兩種訪問令牌的計算機:完全管理員訪問 令牌和標準用戶訪問令牌。在登錄過程中,將刪除標識 管理員的授權和訪問控制組件,從而生成標準用戶訪問令牌。 標準用戶訪問令牌隨後用於啓動桌面,即Explorer.exe進程。因爲所有應用程序都從最初啓動的桌面繼承其訪問控制數據,所以它們也都以 標準用戶身份運行。管理員登錄後,將不會調用完整的 管理員訪問令牌,直到用戶嘗試執行管理任務 。

因此,當管理員「提升」以執行需要管理訪問權限的某種動作 時,他們的「拆分令牌」將被暫時替換爲具有完整管理令牌的 。實際上,這意味着 他們現在有不同的用戶上下文。所以驅動器映射也是 。因此H:驅動器不再具有當前上下文中的有效映射 。

我使用的解決方法是打開一個管理命令提示符 - 您始終有一個提升的標記 - 並從那裏創建一個匹配的驅動器映射(net use h:\ server \ share1)。由於 標準用戶和高級管理員對「H:」驅動器的含義有一個共同的理解,因此一切運行正常。

我明白(好吧,有點!)爲什麼這個設計到位。我不會 企圖批評或捍衛它。但是你現在有了。

在理想的世界中,管理員可以配置 「全局」映射,該映射會自動應用於機器上的每個用戶上下文 (幾乎像真實設備一樣)。但是,那沒有發生。 大多數操作系統都有不合理的妥協混雜,在 不同程度。

+0

謝謝你,克里斯謝恩。這部分代碼是檢查映射驅動器的代碼,它嵌入在安裝程序中。我以管理員身份運行代碼,並以可視方式驗證映射的驅動器在那裏。通過上面的代碼時,我仍然沒有看到V映射驅動器。因爲這是在Windows 7上測試的,正如你所提到的,這可能是「按設計」。我嘗試了上面的代碼和Windows 2008操作系統下具有管理權限的帳戶下相同的安裝程序,並且映射的驅動器檢測得很好。 – LPena

相關問題