【.Net】Windows身份模拟(WindowsIdentity.Impersonate)时读取Access数据库

参考资料:

WindowsIdentity.Impersonate https://msdn.microsoft.com/zh-cn/library/w070t6ka(v=vs.110).aspx

Acess数据库读取 https://msdn.microsoft.com/zh-cn/library/system.data.oledb.oledbdatareader(v=vs.80).aspx

代码实现:

using System;
using System.Runtime.InteropServices;
using System.Security.Principal;
using System.Security.Permissions;
using Microsoft.Win32.SafeHandles;
using System.Runtime.ConstrainedExecution;
using System.Security;
using System.Data.OleDb;

public class ImpersonationDemo
{
    [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword,
        int dwLogonType, int dwLogonProvider, out SafeTokenHandle phToken);

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

    // Test harness.
    // If you incorporate this code into a DLL, be sure to demand FullTrust.
    [PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]
    public static void Main(string[] args)
    {
        SafeTokenHandle safeTokenHandle;
        try
        {
            const int LOGON32_PROVIDER_DEFAULT = 0;
            //This parameter causes LogonUser to create a primary token.
            const int LOGON32_LOGON_INTERACTIVE = 2;

            // Call LogonUser to obtain a handle to an access token.
            bool returnValue = LogonUser("username", ".", "password", LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, out safeTokenHandle);

            if (false == returnValue)
            {
                int ret = Marshal.GetLastWin32Error();
                Console.WriteLine("LogonUser failed with error code : {0}", ret);
                throw new System.ComponentModel.Win32Exception(ret);
            }
            using (safeTokenHandle)
            {
                Console.WriteLine("Did LogonUser Succeed? " + (returnValue ? "Yes" : "No"));
                Console.WriteLine("Value of Windows NT token: " + safeTokenHandle);

                // Check the identity.
                Console.WriteLine("Before impersonation: " + WindowsIdentity.GetCurrent().Name);
                // Use the token handle returned by LogonUser.
                using (WindowsIdentity newId = new WindowsIdentity(safeTokenHandle.DangerousGetHandle()))
                {
                    using (WindowsImpersonationContext impersonatedUser = newId.Impersonate())
                    {

                        // Check the identity.
                        Console.WriteLine("After impersonation: " + WindowsIdentity.GetCurrent().Name);

                        using (OleDbConnection conn = new OleDbConnection(@"Provider = Microsoft.ACE.OLEDB.12.0; Data Source = D:\DamonFile\agms60\AgmsGZ.mdb"))
                        //using (OleDbConnection conn = new OleDbConnection(@"Provider =Microsoft.Jet.OLEDB.4.0;Data Source=D:\DamonFile\agms60\AgmsGZ.mdb"))
                        {
                            conn.Open();
                            OleDbCommand cmd = conn.CreateCommand();
                            cmd.CommandText = "SELECT top 10 User_name FROM Operate_log";
                            cmd.CommandType = System.Data.CommandType.Text;
                            OleDbDataReader reader = cmd.ExecuteReader();
                            while (reader.Read())
                            {
                                Console.WriteLine(reader["User_name"].ToString());
                            }
                        }

                    }
                }
                // Releasing the context object stops the impersonation
                // Check the identity.
                Console.WriteLine("After closing the context: " + WindowsIdentity.GetCurrent().Name);

            }

        }
        catch (Exception ex)
        {
            Console.WriteLine("Exception occurred. " + ex.Message);
        }
        Console.ReadLine();

    }
}
public sealed class SafeTokenHandle : SafeHandleZeroOrMinusOneIsInvalid
{
    private SafeTokenHandle()
        : base(true)
    {
    }

    [DllImport("kernel32.dll")]
    [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
    [SuppressUnmanagedCodeSecurity]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool CloseHandle(IntPtr handle);

    protected override bool ReleaseHandle()
    {
        return CloseHandle(handle);
    }
}

注意:

如果在访问Access数据库出现“未指定的错误”时,请在“C:\Users”中当前登录的用户文件夹上设置要模拟用户的的访问权限

时间: 2024-11-06 01:17:12

【.Net】Windows身份模拟(WindowsIdentity.Impersonate)时读取Access数据库的相关文章

Python小程序,读取ACCESS数据库,然后list数据

曾经做过的一个Python小程序,读取ACCESS数据库,然后list数据 # -*- coding: cp936 -*-import wximport wx.libimport sys,glob,randomimport win32com.clientreload(sys)sys.setdefaultencoding('utf-8')class DemoFrame(wx.Frame): def __init__(self): wx.Frame.__init__(self,None,-1,u"安

php读取access数据库

<?php //读取mdb数据库 $conn = new com("ADODB.Connection"); $connstr = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=". realpath("../mydata.mdb"); $conn->Open($connstr); $rs = new com("ADODB.RecordSet"); $rs->Op

Windows 服务多语言化时读取配置文件失败的问题。

在Installer中,按一般读取配置文件的方法(ConfigurationManager.AppSettings["CultureName"])读取不到内容. 可以这样读取: var config = ConfigurationManager.OpenExeConfiguration(Assembly.GetAssembly(typeof(ProjectInstaller)).Location);string cultureName = config.AppSettings.Sett

使用unity连接并读取Access数据库

转自:http://unity.jb51.net/chengxukaifa/shujukubiancheng/1104.html 直接为大家分享了使用unity连接Sql Server .还有很多朋友使用unity连接Access   在这里为大家分享下unity连接Access   首先需要用到两个外部引用.System.Data.dll 和 System.EnterpriseServices.dll   接下来直接贴出代码: using UnityEngine; using System.C

细说ASP.NET Windows身份认证

上篇博客我谈到了一些关于ASP.NET Forms身份认证方面的话题,这次的博客将主要介绍ASP.NET Windows身份认证. Forms身份认证虽然使用广泛,不过,如果是在 Windows Active Directory 的环境中使用ASP.NET, 那么使用Windows身份认证也会比较方便. 方便性表现为:我们不用再设计登录页面,不用编写登录验证逻辑.而且使用Windows身份认证会有更好的安全保障. 回到顶部 认识ASP.NET Windows身份认证 要使用Windows身份认证

读取本地数据库文件

有时候我们可以将类似省份城市的数据库文件存放在assets/文件夹名/××.sql下,当程序在创建数据库时读取该数据库文件,并执行其内的sql语句 在SqLiteOpenHelper类的onCreate方法中调用 executeAssetsSQL(db, "××.sql"); /** * 读取数据库文件(.sql),并执行sql语句 * */ private void executeAssetsSQL(SQLiteDatabase db, String schemaName) { Bu

PHP使用UTF8编码读取ACCESS的乱码问题解决方案(转)

PHP使用UTF8编码读取ACCESS的乱码问题解决方案 http://it.xwstudy.com/readnews.php?id=627 来源:本站编辑 发布日期:2013-05-27 已有 1790 人浏览过此信息 PHP搭配ACCESS是一个非常冷的话题,但是却有很多实用性,特别是从ASP转过来的程序员,对ACCESS有特殊的理解.学文培训在实际PHP培训中也会讲到ACCESS配合PHP的系统开发.那我们今天就来分享一下PHP+ACCESS的在实战开发中通常会遇到的UTF-8编码问题的解

CodeIgniter框架连接读取MS Access数据库文件

cI用的是3.0版本,php要读取Access数据库有两种驱动,一种的odbc,一种是pdo_odbc,两种都可以链接,但是一般会更推荐pdo_odbc, 要想php中能使用odbc,则必须安装相关驱动,可以在phpinfo中查看: 1.odbc 2.pdo_odbc 如果没有,请自行搜索安装,win下比较简单,linux下就比较麻烦了,lanmp3.1集成环境下可以看写的这篇文章. CI框架中加载另一中数据库的方法有两种,参考手册中的介绍,所以下面也说下两种方式: 1.配置文件中静态加载: /

Windows 2008 server + IIS 7 设置身份模拟(ASP.NET impersonation)

IIS7 与 IIS 6 相比有了很大的改动,原来在 IIS 6 下可以的设置到了 IIS 7 下有的会发生变化.身份模拟的配置上,IIS7 和 IIS6有很大不同,网上IIS6的身份模拟的文章比较多,但介绍IIS7的比较少,我把的一些折腾的经验在这篇博客中写下来,以供参考. IIS 7 有两种 ASP.NET Application Mode. 一种是 集成模式(Integrated Mode) 这个是默认的模式,也是微软推荐的模式,另一种是 经典模式(Classic Mode) ,这种模式是