Разрешения сервера разработки ASP.NET и сетевые ресурсы - PullRequest
1 голос
/ 17 сентября 2010

Мое веб-приложение ASP.NET 4.0 не может получить доступ к сетевым принтерам во время отладки на VS 2010. Он может обращаться к локальным принтерам.Похоже, это может быть проблема с разрешениями.Поскольку отладка VS2010 выполняется на сервере ASP.NET Development Server, она должна выполняться под учетной записью, которую я использовал для входа в Windows, верно?Нужно ли добавлять этого пользователя в качестве администратора на этих принтерах?Есть ли аккаунт, который я могу выдать за себя, чтобы заставить это работать?

Ответы [ 3 ]

1 голос
/ 18 сентября 2010

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

Я рекомендую вам настроить выделенную учетную запись домена (например, domain \ yourapp)-impers-user) и либо установите для этого пул приложений, либо настройте олицетворение в своем файле web.config.Затем на сервере печати вы просто предоставляете этой учетной записи необходимые разрешения.

1 голос
/ 05 ноября 2012

Вот пример подражания

    using System;
    using System.Collections.Generic;
    using System.Web.Security;
    using System.Security.Principal;
    using System.Runtime.InteropServices;
    using System.Linq;
    using System.Web;
    using System.IO;

    public partial class Main : PageBase
    {

    public const int LOGON32_LOGON_INTERACTIVE = 2;
    public const int LOGON32_PROVIDER_DEFAULT = 0;

    WindowsImpersonationContext impersonationContext;

    [DllImport("advapi32.dll")]
    public static extern int LogonUserA(String lpszUserName,
        String lpszDomain,
        String lpszPassword,
        int dwLogonType,
        int dwLogonProvider,
        ref IntPtr phToken);
    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern int DuplicateToken(IntPtr hToken,
        int impersonationLevel,
        ref IntPtr hNewToken);

    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern bool RevertToSelf();

    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    public static extern bool CloseHandle(IntPtr handle);

    protected void Page_Load(object sender, EventArgs e)
    {
        if (Page.IsPostBack == false)
        {

            if (impersonateValidUser("Username", "Domain", "Password"))
            {
                //Your code under a specific user here.
            }

        }
    }

    private bool impersonateValidUser(String userName, String domain, String password)
    {
        WindowsIdentity tempWindowsIdentity;
        IntPtr token = IntPtr.Zero;
        IntPtr tokenDuplicate = IntPtr.Zero;

        if (RevertToSelf())
        {
            if (LogonUserA(userName, 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;
                    }
                }
            }
        }
        if (token != IntPtr.Zero)
            CloseHandle(token);
        if (tokenDuplicate != IntPtr.Zero)
            CloseHandle(tokenDuplicate);
        return false;
    }

    private void undoImpersonation()
    {
        impersonationContext.Undo();
    }

Удачи!

0 голосов
/ 17 сентября 2010

, не зная наверняка, вы можете попытаться выдать себя за Сетевую службу или, конечно, за свою собственную учетную запись домена, которая всегда должна работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...