如何为cmd进程设置环境变量? - 非系统环境变量

时间:2013-12-11 02:26:33

标签: c#

我正在开发一个C#程序来掩盖用户密码。我很成功。我希望设置与触发C#EXE的批处理脚本(父进程)相同的用户密码。非常感谢任何帮助!!!

我还想了解是否有更好的方法将值从C#传递给父进程(* .bat文件)。

这里的想法是......

  1. 批处理脚本

  2. C#程序(屏蔽密码/将密码设置为批处理脚本的变量)

  3. 批量使用该变量将其作为PLM工具的参数传递。

  4. ----------------------------------------------- -------------------------------------

    using System;
    using System.Diagnostics;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Collections.Specialized;
    using System.Text.RegularExpressions;
    using System.Collections.Specialized;
    using System.Diagnostics;
    
    namespace ConsoleApplicationUtil
    {
        class Program
        {
            static int Main(string[] args)
            {
                int PLM_RETURN = 0;
                string password = "";
    
                for (int iNx = 0; iNx < args.Length; iNx++)
                {
                    Console.WriteLine("args[ {0} ]::< {1} >", iNx,args[iNx]);
                }
                Console.Write("Enter your password: ");
                ConsoleKeyInfo key;
    
                do
                {
                    key = Console.ReadKey(true);
    
                    // Backspace Should Not Work
                    if (key.Key != ConsoleKey.Backspace && key.Key != ConsoleKey.Enter)
                    {
                        password += key.KeyChar;
                        Console.Write("*");
                    }
                    else
                    {
                        if (key.Key == ConsoleKey.Backspace && password.Length > 0)
                        {
                            password = password.Substring(0, (password.Length - 1));
                            Console.Write("\b \b");
                        }
                    }
                }
                // Stops Receving Keys Once Enter is Pressed
                while (key.Key != ConsoleKey.Enter);
    
                Console.WriteLine();
                Console.WriteLine("The Password You entered is : " + password);
               // Environment.SetEnvironmentVariable(args[3], password, EnvironmentVariableTarget.User);
    
                int ParentPID = Process.GetProcessById(Process.GetCurrentProcess().Id).Parent().Id;
    
                foreach (Process proc in Process.GetProcesses())
                {
                    Console.WriteLine("Checking Process: " + proc.ProcessName + ":" + proc.Id);
                    //StringDictionary sd = proc.StartInfo.EnvironmentVariables;
                    //if (proc.ProcessName.Equals("cmd"))
                    if (proc.Id.Equals(ParentPID) && proc.ProcessName.Equals("cmd"))
                    {
                        string s1 = proc.StartInfo.Arguments;
                        StringDictionary env_val = proc.StartInfo.EnvironmentVariables;                    
                        Console.WriteLine("================================================");
                        if (env_val.ContainsKey("PASS_APP"))
                        {
                            Console.WriteLine("FOUND IT!!!");
                            env_val.Add(args[3], password);                       
                            //proc.StartInfo.Arguments.IndexOf(password);                       
                        }
                        else
                        {
                            Console.WriteLine("NOOOOOOOOOOOOOO!!!");
                        }
                        Console.WriteLine("================================================");
                    }
    
                } 
    
               return PLM_RETURN;
            }
        }
    }
    

2 个答案:

答案 0 :(得分:2)

您不能修改另一个进程的环境变量(至少没有某种调试权限或类似的东西)。修改另一个进程的环境变量需要修改该进程的environment block,即基本上修改该进程的内存。

将信息从子进程传递回其父进程的正常方法是使用标准输出(即Console.WriteLine),尽管批处理文件使assign that output to a variable有点麻烦所以它可以使用。

如果您想编写一个接受屏蔽文本输入的批处理文件,那么您可以使用一些sneaky VBScript magic

对您的问题采用完全不同的方法是不要试图将密码传递回批处理文件,而只是让C#应用程序使用密码本身(即执行批处理文件要做的任何事情,可能只需调用另一个批处理文件作为参数传递密码)。

答案 1 :(得分:0)

我建议如果你想操纵控制台应用程序产生的变量,为什么不在控制台应用程序本身中操作它们,而不是经历所有麻烦将变量返回给调用者?

AFAIK“返回”变量的唯一简单方法是简单地在入口点的末尾返回一个整数,例如,

static int Main(string[] args)
{
    return 912;
}

ERRORLEVEL变量将设置为您返回的值。它可以按如下方式访问

test.exe
echo %errorlevel%

不幸的是,你不能以这种方式返回一个字符串,要做到这一点,你将不得不做Justin建议的。