---
# System prepended metadata

title: Hangfire 讀取不同server資料夾遇到檔權限問題

---

# Hangfire 讀取不同server資料夾遇到檔權限問題

## 時空背景

實作了一個可以讀取某server資料夾檔案的功能，寫了一個service，此service有兩種trigger方式
:::info
T1. Hangfire定時trigger。
T2. User於網頁上按下按鈕trigger。
:::

程式有一個專屬帳號並使用該帳號登入server讀取資料夾檔案，這邊以A帳號代稱

## 問題描述與處理流程

在Local端測試兩種trigger方式時，都能正常執行，並成功讀取到資料夾。
但只要發佈到server之後，T1方式(Hangfire定時trigger)會讀取失敗，T2方式(User於網頁上按下按鈕trigger)讀取成功。
:::danger
* 錯誤訊息為Authorization has been denied for this request.
:::

首先
先找出hangfire登入的帳號與User trigger的有何不同，之後發現由T2方式trigger時，網頁使用==A帳號==登入資料夾，但由hangfire tigger時網頁使用==IIS APPPOOL\DefaultAppPool==登入，因此帳號沒有該資料夾存取權限所以被拒絕。

## 解決方式

:::success
在service中加入模擬使用者登入的程式碼，導入SimpleImpersonation套件
:::
程式碼如下：
```csharp=
using System.Security.Principal;
using Microsoft.Win32.SafeHandles;
using SimpleImpersonation;
```
```csharp=
UserCredentials credentials = new UserCredentials(domain, username, password);
using (SafeAccessTokenHandle userHandle = credentials.LogonUser(LogonType.NewCredentials))
{
    WindowsIdentity.RunImpersonated(userHandle, () =>
        {
            var AllDirector = Directory.EnumerateDirectories($@"XXXXX\XXXX\XXX", "*", SearchOption.AllDirectories).ToList();
            //做你想做的事情
        });
}
```

此方式可以在讀取資料夾之前使用想使用的帳號密碼登入讀取。

## 參考資料

* https://github.com/mattjohnsonpint/SimpleImpersonation