背景:windows环境下,原有程序为控制台应用程序,需要把程序做成开机自启。
方案一:把程序重新做成服务。改动大且运维习惯改变,暂不考虑。
方案二:把程序对应的快捷方式添加到启动目录(windows server 2016为:C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup,其他windows版本启动目录请自查)。服务器重启后,若无用户登录,则程序不会启动。
方案三:用windows自带的“任务计划程序”,
触发器:选系统启用时;
操作:启用程序,到对应目录选择需启用的程序;
常规:1.“只在用户登录时运行”:服务器重启后,若无用户登录,则程序不会启动。
2.“不管用户是否登录都要运行”:程序会自启,可在任务管理器查看对应的进程,但是没有对应的控制台界面
方案四:远程桌面连接后,再自启
设置服务器可远程桌面登录且允许多连接(具体如何配置请自查)。
在服务器上运行mstsc,连接自己,记住凭证,勾选不再询问我是否连接到此计算机,然后保存rdp文件,新建一个bat文件,内容如下:mstsc D:\Default.rdp,路径为刚保存drp文件的路径。
通过方案三,常规选择“不管用户是否登录都要运行”,操作选择刚刚建立bat文件。(为什么不直接选择rdp文件?通过测试,发现只能是bat和exe文件)。
重启服务器后,直接访问程序,发现已启动,通过远程桌面登录,发现也有控制台程序的界面。
到此,已基本解决问题。
如果服务器需定期修改密码,则每次都要重新创建rdp文件,就很烦。
方案五:借助Microsoft RDP client control实现远程桌面自动登录
首先注册控件:regsvr32 C:\Windows\System32\mstscax.dll。
VS2019 新建一个Windows窗体项目,打开菜单"工具->选择工具箱项",选择COM组件"Microsoft RDP Client Control -version 9":
界面:
添加配置:
连接按钮核心代码:
this.RdpClient.Server = this.textBoxIP.Text;
this.RdpClient.UserName = this.textBoxUser.Text;
this.RdpClient.AdvancedSettings2.RDPPort = Convert.ToInt32(this.textBoxPort.Text);
this.RdpClient.AdvancedSettings2.SmartSizing = true;
this.RdpClient.AdvancedSettings9.NegotiateSecurityLayer = true;
IMsTscNonScriptable secured = (IMsTscNonScriptable)this.RdpClient.GetOcx();
secured.ClearTextPassword = this.textBoxPassword.Text;
this.RdpClient.AdvancedSettings5.ClearTextPassword = this.textBoxPassword.Text;
this.RdpClient.AdvancedSettings9.EnableCredSspSupport = true;
this.RdpClient.FullScreenTitle = this.textBoxIP.Text;
this.RdpClient.Connect();
RdpClient为控件名
自动连接核心代码:
在构造函数里加上
public FormRDP()
{
InitializeComponent();
LoadSetting();
if (Settings.Default.AutoConnect)
{
this.WriteLog($"当前模式为自动连接:连接按钮不可用,{Delay}秒后自动连接!");
this.buttonConnect.Enabled = false;
Thread.Sleep(Delay * 1000);
//经过测试 不能在后台线程对ActiveX 控件进行操作,会直接抛异常
//所以只能写在构造函数里
buttonConnect_Click(null, null);//连接按钮操作方法
Timer = new System.Threading.Timer(Timer_Callback);
Timer.Change(Delay * 1000, Timeout.Infinite);
this.WriteLog($"自动连接:{Delay}秒后退出!");
}
else
{
this.WriteLog($"当前模式为手动连接:可点击连接按钮!");
}
}
private void Timer_Callback(object state)
{
this.WriteLog("exit");
Environment.Exit(0);
}
private void LoadSetting()
{
this.textBoxIP.Text = Settings.Default.IP;
this.textBoxPort.Text = Settings.Default.Port.ToString();
this.textBoxUser.Text = Settings.Default.User;
this.textBoxPassword.Text = Settings.Default.Passwrod;
this.Delay = Settings.Default.delay;
}
最后通过方案三配置,常规选择“不管用户是否登录都要运行”,操作选择刚刚生成的RDPClient.exe文件。
重启服务器后,直接访问程序,发现已启动,通过远程桌面登录,发现也有控制台程序的界面。
如果服务器需修改密码,则直接在RDPClient.exe.config修改密码即可。