C#指定用户执行程序的示例代码(转载)

原创 2006年06月19日 16:57:00

#region using directives
 using System;
 using System.Security.Principal;
 using System.Runtime.InteropServices;
 using System.Text.RegularExpressions;
#endregion


namespace testEnumWindows
{
 /// <summary>
 /// ChangeUser 的摘要说明。
 /// </summary>
 public class ChangeUser
 {
  [DllImport("advapi32.dll", SetLastError = true)]
  public extern static bool LogonUser(String lpszUsername, String lpszDomain,
   String lpszPassword, int dwLogonType,
   int dwLogonProvider, ref IntPtr phToken);

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

  [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  public extern static bool DuplicateToken(IntPtr ExistingTokenHandle,
   int SECURITY_IMPERSONATION_LEVEL, ref IntPtr DuplicateTokenHandle);

  public static void Main(string[] args)
  {
   Console.WriteLine("当前用户是: "+ WindowsIdentity.GetCurrent().Name);
   ImpersonatedWork testDel = new ImpersonatedWork(Test);
   ImpersonateAndDo("test", "bca~123", testDel);
   Console.WriteLine("当前用户是: "+ WindowsIdentity.GetCurrent().Name);
  }

  static void Test()
  {
   Console.WriteLine("当前用户是: " + WindowsIdentity.GetCurrent().Name);
  }

  public delegate void ImpersonatedWork();

  //// <summary>
  /// 以指定用户的身份去做一件事情
  /// </summary>
  /// <param name="UserName"></param>
  /// <param name="PWD"></param>
  /// <param name="WhatToDo"></param>
  public static void ImpersonateAndDo(string UserName, string PWD, ImpersonatedWork WhatToDo)
  {
   
   string domainName = string.Empty;
   string userName = string.Empty;
   IntPtr tokenHandle = new IntPtr(0);
   IntPtr dupeTokenHandle = new IntPtr(0);
   const int LOGON32_PROVIDER_DEFAULT = 0;
   const int LOGON32_LOGON_INTERACTIVE = 2;
   const int SecurityImpersonation = 2;
   if (! Regex.IsMatch(UserName, @"^/w+[//]?/w+$"))
   {
    throw new ApplicationException("非法的用户名");
   }
   string[] tmp = UserName.Split(new char[] { '//' });
   if (tmp.Length > 1)
   {
    domainName = tmp[0];
    userName = tmp[1];
   }
   else
   {
    userName = tmp[0];
   }
   tokenHandle = IntPtr.Zero;
   dupeTokenHandle = IntPtr.Zero;
   bool returnValue = LogonUser(userName,domainName,  PWD,
    LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
    ref tokenHandle);
   if (!returnValue)
   {
    throw new ApplicationException("取Handle出错了!");
   }

   //Console.WriteLine("当前用户是: "
   //    + WindowsIdentity.GetCurrent().Name);

   bool retVal = DuplicateToken(tokenHandle, SecurityImpersonation, ref dupeTokenHandle);
   if (!retVal)
   {
    CloseHandle(tokenHandle);
    throw new ApplicationException("复制Handle出错了!");
   }
   WindowsIdentity newId = new WindowsIdentity(dupeTokenHandle);
   WindowsImpersonationContext impersonatedUser = newId.Impersonate();
   
   
    WhatToDo();
   
   
    impersonatedUser.Undo();
   if (tokenHandle != IntPtr.Zero)
    CloseHandle(tokenHandle);
   if (dupeTokenHandle != IntPtr.Zero)
    CloseHandle(dupeTokenHandle);
   
 }

 }
}

C#完整执行存储过程的代码加实例

using System; using System.Collections.Generic; using System.Text; using System.Data.SqlClient; ...
  • tt2153
  • tt2153
  • 2016年03月20日 07:58
  • 717

C#如何调用外部exe程序

http://blog.csdn.net/cyamazing/article/details/52849106 1.在主界面添加调用外部exe程序的Button,双击此Button进入代...
  • liang890319
  • liang890319
  • 2017年06月22日 09:08
  • 6011

C#如何运行外部程序(打开可执行程序):ShellExcute和Process

最近的任务用到C#来调用C++内核程序,也就是C++编译运行后生成的.exe文件。网搜了一下C#中运行外部程序大致有两种方法,在此稍作总结: (1)使用API函数ShellExcute        ...
  • wrm_nancy
  • wrm_nancy
  • 2014年03月02日 19:30
  • 22331

C#微信公众号与订阅号接口开发示例代码

C#微信公众号与订阅号接口开发示例代码
  • szsbell
  • szsbell
  • 2016年06月30日 15:51
  • 730

crontab 中的指定特定的用户身份来运行相关的命令或者脚本

点击打开链接 设置cron有两种方法 ( 当启动linux时,它运行为一个后台进程。它每分钟检查一次相应的配置文件来了解是否有事件需要得到运行。 有两组cron配置文件。一组由一个...
  • xuntianzong
  • xuntianzong
  • 2014年03月27日 12:20
  • 5929

C#.NET 微信小程序用户数据的签名验证和解密

微信小程序时下大热,抱着学习的心态了解了一下,目前没有搜到完整的.NET用户数据签名验证和解密代码,于是就写了一点。 简单使用方法: 1、客户端调用wx.getUserInfo方法,服务端创建WeC...
  • ivanyoung66
  • ivanyoung66
  • 2017年05月19日 12:03
  • 1985

c#实现按用户角色分配菜单的使用权限(WinForm)

c#实现按用户角色分配菜单的使用权限(WinForm)        要求:根据用户登录时的角色,来设置其可以使用的菜单项。        思路:首先建立三个表: 用户角色表 tb_role (...
  • luyuncsd123
  • luyuncsd123
  • 2013年06月02日 17:12
  • 7021

配置tomcat以指定的身份运行(Linux平台)

原帖地址 本文记录如何在linux平台上配置tomcat以指定的身份运行、配置为linux服务,并设置为开机启动运行。 前言: 通常情况下我们要配置Tomcat是很容易的...
  • bebabyron
  • bebabyron
  • 2013年09月20日 18:06
  • 15016

linux 开机以某一个用户执行脚本

1 . 编辑:/etc/rc.local有些很特殊的情况 /etc/rc.local 不会被执行,可以 编辑 /etc/init.d/rc.local see link: http://www....
  • GW569453350game
  • GW569453350game
  • 2016年11月03日 10:26
  • 2725

C#程序结构分析实例

首先,我们来输入一段C#程序 using System; namespace Acme.Collections { public class Stack { En...
  • thebestleo
  • thebestleo
  • 2016年09月11日 22:53
  • 1207
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#指定用户执行程序的示例代码(转载)
举报原因:
原因补充:

(最多只允许输入30个字)