Невозможно записать на подключенный диск с помощью олицетворения - PullRequest
1 голос
/ 30 июня 2010

В основном у меня та же проблема, что и в этом посте Доступ к подключенным дискам при олицетворении в ASP.NET

Я работаю на устаревшем веб-сайте и мне нужно разрешить администраторамизменить логотип сайта, баннеры и т. д. с файла изображения на своих рабочих столах на подключенный диск на сервере.

Итак, их веб-сайт использует олицетворение всякий раз, когда ему нужно сэкономить на диске, и он работаетпросто хорошо;однако мне не удается заставить его работать ни в их тестовой среде, ни в моей тестовой среде.

¿Есть идеи?Я дважды проверил имя пользователя и пароль (код не указывает домен), и это не проблема.

Вот выдержка из кода, который обрабатывает олицетворение:

public bool ImpersonateUser(String user, String password, String domain)
{
    WindowsIdentity tempWindowsIdentity;
    IntPtr token = IntPtr.Zero;
    IntPtr tokenDuplicate = IntPtr.Zero;

    if (RevertToSelf())
    {
        if (LogonUserA(user, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref token) != 0)
        {
            if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
            {
                tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
                impersonationContext = tempWindowsIdentity.Impersonate();
                if (impersonationContext != null)
                {
                    CloseHandle(token);
                    CloseHandle(tokenDuplicate);
                    return true;
                }
            }
        }
    }
    //... rest of the code

И-санитизированный тест:

if (impUtility.ImpersonateUser("user", "password", string.Empty))
{
    fu.SaveAs(@"C:\Images\" + imgName);
}

1 Ответ

0 голосов
/ 30 июня 2010

Я тоже не мог заставить это работать.

Тогда я понял, что даже если бы я мог реализовать это, есть более простой способ.Я сделал общий доступ к папке на целевом компьютере и дал разрешения только на чтение / запись пользователям, которые будут использовать мое приложение.

//Impersonate user to save file on server
WindowsIdentity wi = (WindowsIdentity)User.Identity;
WindowsImpersonationContext wic = null;

try
{
    wic = wi.Impersonate();
    if (wi.IsAuthenticated)
        asyncFileUpload.SaveAs(location);
}
catch (Exception ex)
{
    //Log Error or notify here
    success = false;
}
finally
{
    if (wic != null)
        wic.Undo();
}

Я создал группу AD для пользователей и дал чтениеРазрешения на запись / запись для этих пользователей на скрытом общем диске.Это облегчает обслуживание, поскольку мне не нужно создавать подключенные диски для каждого пользователя.

...