设为首页 收藏本站
查看: 1245|回复: 0

[经验分享] Run As(运行方式) 的几种代码实现方式(Python和C#)

[复制链接]

尚未签到

发表于 2015-4-25 05:29:09 | 显示全部楼层 |阅读模式
  1,引入
  最近因为项目的原因,需要在自动化测试代码中实现用户角色的切换,自然第一印象就想到了Run As(中文版windows中也叫“运行方式”)。比如我们可以在打开IE浏览器的时候右键单击“运行方式”:

  然后输入一个新的用户帐户,如下图:

  上图中我本机使用的是域帐户本地帐户登陆的操作系统,但是我现在需要使用域帐户来运行IE浏览器,以方便我在打开相应的绑定域帐户权限的页面,如公司内部站点。这样就不用在打开相应的页面时候输入域帐户名了。
  有些时候我们也可以应用相同的方式来使用管理员帐户启动相应的应用程序:

  在较近操作系统中,右键菜单中没有了“Run as”,而是变成了“Run As Administrator”,目的是提高运行相应程序的用户权限:

  好了,言归正传,今天笔者提到的则是使用代码来实现相同的功能,即以更改运行程序的用户帐户。
  2,代码实现命令行Run As
  命令行
  用命令行实现上述的Run as功能大致可以这样写:
  runas /user:user@domain.com "C:\Program Files\Internet Explorer\iexplore.exe"
   Python实现
  RunAsWithinPython.py文件内容如下:

Runas Commandline in Python
import os
os.system("runas /user:user@domain.com \"C:\Program Files\Internet Explorer\iexplore.exe\"")
  额,就这两行,看起来比命令行内容多不了几个字符,不得不惊诧Python的强悍。另外,python使用缩进来表示代码层次而不是我们在C#等语言中用的大括号“{”,代码看起来很爽,当然,这是闲话了。
    C#实现
  Program.cs文件内容如下:

Runas Commandline in C#
using System.Diagnostics;
namespace MainTest
{
    class Program
    {        
        public static void Main(string[] args)
        {
            System.Diagnostics.Process cmd = System.Diagnostics.Process.Start("runas",
                "/user:user@domain.com  \"C:\\Program Files\\Internet Explorer\\iexplore.exe\"");
        }
    }
}  恩,C#表现也不错,看来确实是一个比较简单的命令而已,如果你没有运行一下这两个程序,你可能以为这样就搞定了,相当简单。但是如果你是一个细心的人,或者你是用过runas命令行的话,你应该知道,这里有问题:
  很可惜的是,这两种方式存在一个致命的缺陷:只能在第一个命令行中输入用户名,然后才会由系统提示输入密码,这样就不能在一条命令行中将用户名和密码完全包含。这样我们只能使用代码实现一半,另外一半则仍然需要手动输入(密码)——显然这就造成了一个半拉子工程。我们也可以查看一下runas帮助说明:

  这样设计的目的在于防止像我们这种弱弱的想要使用命令行来提高运行程序的权限的人——至少我们是不能使用批处理文件来干这件事了,这样更安全了,不是吗?好吧,接下来,我们将使用另外一种方法,这种方法则不会出现上述半拉子工程的尴尬情况。
  3, 使用Process的ProcessStartInfo实现
  

ProcessUserLogonHelper
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
namespace MainTest
{
    class ProcessUserLogonHelper
    {
        ///
        /// 在Main函数中调用该方法的的示例代码
        ///
        private void InvokeExample()
        {
            ProcessUserLogonHelper phelper = new ProcessUserLogonHelper();
            Process pro = phelper.CreateProcessWithUserToken(@"C:\Program Files\Internet Explorer\iexplore.exe", "bestreme.com", "chdwu", "************");
            pro.Start();
        }
  ///
        /// 使用指定帐户绑定进程
        ///
        /// 进程的宿主程序
        /// 指定帐户的域名
        /// 指定帐户的用户名
        /// 指定帐户的密码
        /// 绑定了特定帐户的进程
        public Process CreateProcessWithUserToken(string appPath,string domain, string userName, string password)
        {
Process pro = new Process();
            ProcessStartInfo processInfo = new ProcessStartInfo(appPath);
            processInfo.UseShellExecute = false;
            processInfo.UserName = userName;
            processInfo.Domain = domain;
            System.Security.SecureString psw = new System.Security.SecureString();
            foreach (char c in password.ToCharArray())
            {
                psw.AppendChar(c);
            }
            processInfo.Password = psw;
            processInfo.WorkingDirectory = System.IO.Path.GetDirectoryName(appPath);
            pro.StartInfo = processInfo;
            return pro;
        }
///
        /// 使用指定帐户绑定进程
        ///
        /// 进程的宿主程序
        /// 指定本地帐户的用户名
        /// 指定帐户的密码
        /// 绑定了特定帐户的进程
        public Process CreateProcessWithUserToken(string appPath, string userName, string password)
        {
            return CreateProcessWithUserToken(appPath, "", userName, password);
        }
    }
}
      上面的代码有几个地方需要指出的是:
      1, 应该待运行的程序指定相应的启动路径,否则的话在上述代码运行的过程中可能提示“目录不存在”;
      2,Domain可以不设置,而直接使用bestreme\chdwu的方式给UserName赋值即可;
       3,UseShellExecute 应该设置为False
       4,ProcessStartInfo中的password是System.Security.SecureString类型的,所以如果我们只是传入了一个string作为password,我们应该将其转换为正确的类型。
  结束语
  上面为大家介绍了几种Run as的实现方式,其中的前面两种分别用Python和C#实现了命令行Run as的功能,第三种方法则是在ProcessStartInfo中加入了用户信息以实现用指定用户启动运行应用程序。
  当然实现Run as的代码实现方法很多,在下一篇中将介绍一下有关使用Win32 API的实现。需要指出的是,使用Win32 API几种实现方式存在着一些潜在的问题,详细内容将尽快在下一篇文章中给大家展示。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-60293-1-1.html 上篇帖子: Python网络爬虫(1)--url访问及参数设置 下篇帖子: 动态执行python脚本
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表