Linqpad, выдающий «Отказано в доступе» со специальной учетной записью администратора, вошел в систему, расплывчато - PullRequest
0 голосов
/ 05 февраля 2019

Я получаю неопределенную ошибку «Отказано в доступе» при использовании команды .Dump при олицетворении специальной учетной записи администратора.

У меня также есть специальная учетная запись администратора на моем ПК.Я попытался создать и удалить файл, в котором находится linqpad, и это прекрасно работает.

void Main()
{
string[] criticalFileExtensions = { ".dat", ".pn", ".json", ".sts3", ".lst", ".xml", ".fin", ".brd" };
Util.ProgressBar _overallProgressBar = new Util.ProgressBar("Init").Dump();
StsInfo.OnOverallProgressChanged += (string name, int percentage) =>
{
    _overallProgressBar.Caption = name;
    _overallProgressBar.Percent = percentage != 0? percentage: 1;
};
}

public class ImpersonateUser
{
    const int LOGON32_PROVIDER_DEFAULT = 0;
    const int LOGON32_LOGON_INTERACTIVE = 2;
    const string ACTIVE_DIRECTORY_ADDRESS = "ad.selinc.com";

    [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    static extern bool LogonUser(string userName, string domain,
        string password, int logonType, int logonProvider,
        ref IntPtr accessToken);

    string _username;
    string _password;
    IntPtr accessToken = IntPtr.Zero;
    WindowsImpersonationContext impContext;

    public ImpersonateUser(string username, string password)
    {
        _username = username;
        _password = password;
    }

    public void Enable()
    {
        bool success = LogonUser
        (
            _username,                              // username to log on.
            ACTIVE_DIRECTORY_ADDRESS,               // connection
            _password,                              // user's password.
            LOGON32_LOGON_INTERACTIVE,              // create an interactive login.
            LOGON32_PROVIDER_DEFAULT,               // use the default logon provider.
            ref accessToken                         // receives access token handle.
        );
        if (!success)
        {
            throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error());
        }
        WindowsIdentity identity = new WindowsIdentity(accessToken);
        impContext = identity.Impersonate();
    }

    public void Disable()
    {
        impContext.Undo();
    }

    public string GetCurrentUser()
    {
        return WindowsIdentity.GetCurrent().Name;
    }
}

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

enter image description here

...