C#修改WINDOWS系统设置
近期写了两个小程序给测试工程师使用,分享记录以便查阅。
主要利用 C# 调用系统的命令完成,相当于增加一个壳。
以前写的小工具都没记录,导致这次花费很多时间查找资料,真是许久不练手生。
SysInit
之前一心想裸辞,正好某天某同事怼我写一个工具方便制作测试母盘,再一想反正要离职,干脆做个人情写个工具方便他们日后的工作,于是就有了这个小工具和图中的话。
软件主要涉及三个对系统的操作,调用 CMD 完成指令,控制注册表,拉起系统应用。
调用 CMD 完成指令
主要方法(来源 njl_041x )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
private static string CmdPath = @"C:\Windows\System32\cmd.exe"; public static void RunCmd(string cmd, out string output) { cmd = cmd.Trim().TrimEnd('&') + "&exit";//说明:不管命令是否成功均执行exit命令,否则当调用ReadToEnd()方法时,会处于假死状态 using (Process p = new Process()) { p.StartInfo.FileName = CmdPath; p.StartInfo.UseShellExecute = false; //是否使用操作系统shell启动 p.StartInfo.RedirectStandardInput = true; //接受来自调用程序的输入信息 p.StartInfo.RedirectStandardOutput = true; //由调用程序获取输出信息 p.StartInfo.RedirectStandardError = true; //重定向标准错误输出 p.StartInfo.CreateNoWindow = true; //不显示程序窗口 p.Start();//启动程序 //向cmd窗口写入命令 p.StandardInput.WriteLine(cmd); p.StandardInput.AutoFlush = true; //获取cmd窗口的输出信息 output = p.StandardOutput.ReadToEnd(); p.WaitForExit();//等待程序执行完退出进程 p.Close(); } } |
调用代码
1 2 3 |
string output = ""; RunCmd("wmic recoveros set AutoReboot = False&wmic recoveros set DebugInfoType=2", out output); //如果要显示输出结果,用 MessageBox.Show(output); 即可。 |
控制注册表
大多数设置都是通过修改注册表来完成,比如下面关闭 UAC,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
//关闭UAC RegistryKey key = Registry.LocalMachine; //HCU就用CurrentUser, 能.出来 RegistryKey changekey = key.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", true); changekey.SetValue("ConsentPromptBehaviorAdmin", "0", RegistryValueKind.DWord); changekey.SetValue("EnableLUA", "0", RegistryValueKind.DWord); changekey.SetValue("PromptOnSecureDesktop", "0", RegistryValueKind.DWord); key.Close(); //显示隐藏文件和后缀名 RegistryKey key = Registry.CurrentUser; RegistryKey changekey = key.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced", true); changekey.SetValue("Hidden", "1", RegistryValueKind.DWord); changekey.SetValue("ShowSuperHidden", "1", RegistryValueKind.DWord); changekey.SetValue("HideFileExt", "0", RegistryValueKind.DWord); key.Close(); |
拉起系统应用
其实也可以通过 CMD 完成,但如果只是简单的调用 1 个系统应用,用 Process 就快多了。
1 2 3 4 5 6 7 |
//调用桌面图标设置 Process deskprocess = Process.Start("rundll32.exe", "shell32.dll,Control_RunDLL desk.cpl,,5"); deskprocess.WaitForExit(); //等待进程结束 //调用声音设置 Process deskprocess = Process.Start("rundll32.exe", "shell32.dll,Control_RunDLL mmsys.cpl @1"); deskprocess.WaitForExit(); |
PWRLED
上面才说写最后一个工具,结果 1 个月没到就自己打脸,LED 测试需要做防呆,同事找我帮忙,然后,我就......写了。
之前在笔记本电脑生产工艺中有提到一些制程,为了避免人员作业疏失或故意漏测,测试软件在设计上都要做到防呆,避免问题产品流出。举例:声音测试,本来其实放音乐,作业员听,有声音就过,这是人为控制,没声音人员也可以放入下一站,故为了防止这样的情况,在测试过程中通过播放随机数字的方式进行防呆,人员需敲击键盘对应的相同数字才能过,否则不通过。
程序传参代码,修改 program.cs 中的 main 入口。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
//定义字符串数组 static void Main(string[] args) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1(args)); } //在窗体代码中调用参数 string[] args; public Form1(string[] args) { this.args = args; InitializeComponent(); } //下面这句是判断传入参数的长度和内容 if(args.Length != 0 && args[0] == 700.ToString()) |
随机数设定,这里特别记录下,Random 在快速连续生成随机数的时候会出现相同随机数,我这里的使用环境不会出现快速连续的情况,所以 random 还是合适的,以后如果有需要快速生成大量随机数时,把对象种子修改为 GUID 声明或者延时均可。
1 2 3 |
Random rd = new Random(); x = rd.Next(1, 4); //Random random = new Random(Guid.NewGuid().GetHashCode()); |
程序执行结果返回(方便在 CMD 中使用 errorlevel 判断)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public static int b = 1; //定义一个公开的int变量,使用program.b进行赋值 static int Main(string[] args) //程序入口,通过return int返回结果 { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); if (args.Length != 0 && args[0] != 700.ToString()) { MessageBox.Show("Error, pls add argument | Coder: Sam.Z","Error",MessageBoxButtons.OK,MessageBoxIcon.Error) ; } else { Application.Run(new Form1(args)); } return b; //默认FAIL,PASS返回0 } |
其实都是一些很基础很常用的代码,勤能补拙,多记录免得以后到处查资料。
工厂底层的工具都是供应商提供,比如设置 BIOS 的软件,大都用 C 编写,厂内主要调用这些软件进行测试,所以我写的大多数都是壳或者文本处理,没啥高深的代码,让各位见笑了。
-End-
2019年09月07日 18:55 沙发
大佬!请收下我的膝盖!!!
2019年09月08日 19:14
@nice 都是些小东西,稍微懂都会的,你也可以。
2019年09月13日 20:06
@Sam.Z 嘿嘿!中秋节快乐~
2019年09月07日 21:18 板凳
开开心心的点进来,看到代码后一脸懵逼的爬出去了,真心看不懂。嘿嘿
2019年09月08日 19:14
@Mr.Chou 哈哈,这也是我生活的一部分,代码人生。
2019年09月07日 21:44 地板
有点高级
2019年09月08日 16:14
@小石 (*^ω^*) 都是基础
2019年09月08日 21:55 4楼
以前学的C#都忘记了……
2019年09月09日 11:41
@Mark 天下代码是一家,永远不分你我他。
2019年09月08日 21:57 5楼
佩服把代码当工作的人?据说脑细泡死的快容易秃顶hei’heiheihei
2019年09月09日 11:40
@执迷不悟 还好我搞的都是简单的,复杂的怕是已经快形成中南海了。
2019年09月08日 23:30 6楼
C# C++ C傻傻分不清楚
2019年09月09日 22:19 7楼
continue to work hard! that `s so cool~ 我是中文补丁.exe
2019年09月15日 00:05
@野生的喵喵 呀,真点不动补丁下载链接,求科普~
2019年09月10日 16:05 8楼
非技术的路过。
2019年09月11日 22:50 9楼
看到代码就傻眼了,可能俺天生就不是搞理科的料吧。
2019年09月15日 00:02
@淡然若雅 哈哈,你的文采已经胜过了无数代码
2019年09月12日 14:19 10楼
用C#编程,厉害!
2019年09月15日 00:01
@鸟叔 小打小闹,都是基础
2019年09月12日 18:30 11楼
一脸懵逼 哈哈哈
2019年09月14日 23:48
@刘大喵 =。= 维护大牛,我这完全是儿戏
2019年09月13日 14:48 12楼
C#,我用过好多年,不错也好多年没用了
2019年11月01日 16:13 13楼
大神,最近我也在用C#做自动设定Windows系统设置的东西。
一些设置比如屏幕超时设置,通知与操作,通过wmi也好,注册表也好,win api也好都没有找到合适的方法去设置。
Windows系统设置的东东我该去如何调查他们能否自动设置,怎么去自动设置
2019年11月01日 17:12
@yoyo7 可以一起讨论互相学习,发我邮箱,在关于页面有,我们一起来攻克
2019年11月06日 15:19
@yoyo7 给您留言了,请不惜赐教