V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Tamamopoi
V2EX  ›  问与答

windows 中如何实现类似 runas /env,提权但是使用当前用户环境?

  •  
  •   Tamamopoi · 2023-03-09 10:14:26 +08:00 · 901 次点击
    这是一个创建于 416 天前的主题,其中的信息可能已经有所发展或是发生改变。
    runas 需要手动输入密码,/savecred 的话第一次需要输入密码,而且凭据保存在凭据管理器中,并不安全。
    目前使用的是 lsrunase ,密码可以加密写入脚本,但是无法使用当前环境变量。

    比如使用 runas 与 lsrunase 命令使用 admin 启动 cmd ,输入 SET 查看环境变量,都是 admin 账户的环境变量。
    但是使用 runas 加上 /env 参数的话,输入 SET 查看环境变量,就是当前用户的环境变量。

    环境变量不同,会导致安装程序默认安装路径读取错误,或者默认安装到 admin 的 Appdata 下了。点名批评飞书。

    还有一些解决方案均失败:
    -使用 sanur 将密码传递给 runas ,貌似仅限于 32 位系统使用。64 位系统会报错。
    -使用管道命令等传递密码均失败,runas 拒绝接受"|" "<" 等传递参数。

    求解。
    7 条回复    2023-03-09 20:49:21 +08:00
    systemcall
        1
    systemcall  
       2023-03-09 10:21:36 +08:00 via Android
    右键 以管理员身份运行
    ysc3839
        2
    ysc3839  
       2023-03-09 10:47:15 +08:00 via Android
    Tamamopoi
        3
    Tamamopoi  
    OP
       2023-03-09 11:20:45 +08:00
    @ysc3839 感谢回复。试用了 psexec 的-e 参数,还是不行。

    psexec 启动 cmd:
    USERPROFILE=C:\Users\Administrator

    psexec 添加-e 参数,不加载配置文件启动 cmd:
    USERPROFILE=C:\Users\Default

    runas 的 /env 参数启动 cmd:
    USERPROFILE=C:\Users\poi

    psexec 也无法替代 runas...
    Tamamopoi
        4
    Tamamopoi  
    OP
       2023-03-09 11:24:21 +08:00
    @systemcall 域环境下给特殊 app 使用,没有管理员权限。
    ysc3839
        5
    ysc3839  
       2023-03-09 12:55:01 +08:00 via Android
    @Tamamopoi 那大概只能自己写代码了,runas 的原理很简单,目前就只是缺个自动输入密码的方法。
    Tamamopoi
        6
    Tamamopoi  
    OP
       2023-03-09 20:40:30 +08:00
    @ysc3839 使用 myrunas 这个工具解决了。https://bbs.kanxue.com/thread-185411.htm
    Tamamopoi
        7
    Tamamopoi  
    OP
       2023-03-09 20:49:21 +08:00
    @ysc3839 没编辑完,按 ctrl+回车发出去了...
    使用 myrunas 这个工具解决了。看雪:bbs.kanxue.com/thread-185411.htm
    我用的 vs2019 ,runasdll 源码中最后的 test 函数必须重新命名,用 test 编译器会报错。
    同时需要更改 output.def 中的 test 编译。

    缺点是,这个工具需要读取 MyRunas.ini 中的密码,而且是明文储存...并不安全。临时把密码硬编码写入 dll 编译,明天上班再加点加解密算法了。


    只要在源代码 dllmain.cpp 中的
    if (!strlen(szPassword))
    {
    printf("读取密码文件%s 失败,请检查设置是否正确!\n", szIniFile);
    MessageBox(NULL, "读取密码文件失败,请检查设置是否正确!", "", NULL);
    }
    else
    {
    MByteToWChar(szPassword, wcsPassword, sizeof(wcsPassword)/sizeof(wcsPassword[0]));
    }


    改为
    if (!strlen(szPassword))
    {
    strcpy(szPassword, "123456");
    MByteToWChar(szPassword, wcsPassword, sizeof(wcsPassword) / sizeof(wcsPassword[0]));
    }
    else
    {
    MByteToWChar(szPassword, wcsPassword, sizeof(wcsPassword)/sizeof(wcsPassword[0]));
    }


    直接把密码 123456 写入 szPassword 中重新编译出 dll 就可以。
    MyRunas.ini 直接删掉就好。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3403 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 856ms · UTC 10:59 · PVG 18:59 · LAX 03:59 · JFK 06:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.