c#搜索可能的原因:模拟失败,登录类型为LOGON32_LOGON_NEW_CREDENTIALS

时间:2016-03-31 08:38:46

标签: c# impersonation

我们在我们的域中有一个应用程序,人们可以将文件上传到dfs共享。由于信息是敏感的,因此只有服务帐户具有对该共享的读/写访问权限。这意味着,我们必须冒充文件流才能上传(和下载)文件。

我们使用的代码非常标准

public Impersonation(string Username, string Password, string Domain, logonType LogonType = LogonType.LOGON32_LOGON_INTERACTIVE, ProviderType ProviderType = ProviderType.LOGON32_PROVIDER_DEFAULT) 
{
    int lastError;

    try {
        UndoImpersonation();

        wic = WindowsIdentity.Impersonate(IntPtr.Zero);

        if (!WindowsIdentity.GetCurrent().Name.ToLower().Contains(Username.ToLower())) {
            if (LogonUser(Username, Domain, Password, (int)LogonType, (int)ProviderType, out token)) {
                LogWriter.Debug("Token after LogonUser: " + token.ToString());
                if (DuplicateToken(token, (int)ImpersonationLevel.SecurityImpersonation, out tokenDuplicate)) {
                    LogWriter.Debug("Duplicate Token: " + tokenDuplicate.ToString());
                    copyIdentity = new WindowsIdentity(tokenDuplicate);
                    wic = copyIdentity.Impersonate();
                } else {
                    lastError = Marshal.GetLastWin32Error();
                    LogWriter.Error("DuplicateToken failed with error: " + lastError);
                    throw new Win32Exception(lastError);
                }
            } else {
                lastError = Marshal.GetLastWin32Error();
                LogWriter.Error("LogonUser failed with error: " + lastError);
                throw new Win32Exception(lastError);
            }
        } else {
            LogWriter.Error("Double impersonation detected: WindowsIdentity: " + WindowsIdentity.GetCurrent().Name.ToLower() + " //// Username: " + Username.ToLower());
        }
    } catch (Exception ex) {
        LogWriter.Error(ex);
        throw;
    }
}

我们正在使用LOGON32_LOGON_NEW_CREDENTIALSLOGON32_PROVIDER_WINNT50来调用该程序。 这适用于大多数人(> 90%),并且他们中的大多数人在他们的机器上没有管理员权限。 但在某些情况下,我们在创建相应的流时会在应用程序日志中看到“未找到路径的一部分”异常。在这种情况下,我们会尝试使用其他logon_types创建流(例如LOGON32_LOGON_INTERACTIVELOGON32_PROVIDER_WINNT40和/或-50)。我们没有收到任何其他错误,但“路径的一部分找不到”。

但在我们的错误日志中,我们在这种情况下看到: 使用原始用户的记录记录模拟“新凭据”。这意味着,冒充没有发生! (我再说一遍:几乎适用于整个公司) 其他尝试(使用交互式)被记录为服务帐户,这意味着模拟成功,但这种登录类型没有权限来访问共享(因为我们仍然得到“未找到路径的一部分“)。

我的问题是:可能是什么原因或我们在哪里可以看到,为什么有些人不能假冒使用“新凭证”?

是否可以有组策略,活动目录设置,注册表设置?

0 个答案:

没有答案