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#窗体程序初学示例代码

  • 2015-12-15 16:56
  • 283KB
  • 下载

Java Web 用户登陆示例代码

实现功能: 1、用户登陆、注销 2、利用session记录用户登陆信息 3、在JSP中展示已登陆用户信息 实现原理: 登陆后通过判断用户名和密码是否和存储的一致,如果一致...

【Android】使用AIDL传递用户自定义类型数据--附完整示例代码

AIDL对Java类型的支持 AIDL支持Java原始数据类型 AIDL支持String和CharSequence AIDL支持传递其他AIDL接口,但你引用的每个AIDL接口都需要...

C# MySql 读写数据的示例代码

通过MySql connector net组件操作MYSQL数据库: using System; using System.Collections.Generic; using System.C...

C#调用EasyPusher推送到EasyDarwin流媒体服务器直播方案及示例代码整理

博客一:转自:http://blog.csdn.net/u011039529/article/details/70832857大家好,本人刚毕业程序猿一枚。受人所托,第一次写博客,如有错误之处敬请谅解...

c#的delegate示例代码

代理就是让代理类去执行别的类的代码,C++设计模式中也有相似的方法,不过那个是用指针实现,而C#的明显要简洁。关键的点:接口参数和返回值类型要一样 下面是别处的一个例子using System; us...

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

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

C#使用SnmpSharpNet接收snmp的trap消息示例代码

C#使用SnmpSharpNet接收snmp的trap消息示例代码
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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