当前位置: 澳门新濠3559 > 编程 > 正文

这个方法是有问题的,澳门新濠3559:存在则进行

时间:2019-11-07 12:30来源:编程
一、前言 很多监控软件要求软件能够在系统重新启动后不用用户去点击图标启动项目,而是直接能够启动运行,方法是写注册表Software//Microsoft//Windows//CurrentVersion//Run。       关于

一、前言

很多监控软件要求软件能够在系统重新启动后不用用户去点击图标启动项目,而是直接能够启动运行,方法是写注册表Software//Microsoft//Windows//CurrentVersion//Run 。

       关于C#开机自动启动程序的方法,网上出现比较多的是修改注册表:

参考程序可以见下:(查找程序目录的执行文件,存在则进行添加注册表操作)

       1. HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRun或者RunOnce

//实用代码一

       2.HKEY_Current_UserSoftwareMicrosoftWindowsCurrentVersionRun或者RunOnce

int C***Dlg::CreateRun(void)
{

       将你想要自动开机执行的程序的名称与路径写入该注册表就能实现开机自动启动,但是!这个方法是有问题的:

//添加以下代码
HKEY   RegKey;  
CString   sPath;  
GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);  
sPath.ReleaseBuffer();  
int   nPos;  
nPos=sPath.ReverseFind('//');  
sPath=sPath.Left(nPos);  
CString   lpszFile=sPath+"//getip.exe";//这里加上你要查找的执行文件名称  
CFileFind   fFind;  
BOOL   bSuccess;  
bSuccess=fFind.FindFile(lpszFile);  
fFind.Close();  
if(bSuccess)  
{  
   CString   fullName;  
   fullName=lpszFile;  
   RegKey=NULL;  
   RegOpenKey(HKEY_LOCAL_MACHINE,"Software//Microsoft//Windows//CurrentVersion//Run",&RegKey);  
   RegSetValueEx(RegKey,"getip",0,REG_SZ,(const   unsigned   char*)(LPCTSTR)fullName,fullName.GetLength());//这里加上你需要在注册表中注册的内容  
   this->UpdateData(FALSE);  
}  
else  
{  
   //theApp.SetMainSkin();  
   ::AfxMessageBox("没找到执行程序,自动运行失败");  
   exit(0);  
}  
return 0;
}

      1. 微软自Vista之后对注册表的权限管理更加严格,需要一系列的权限操作,对注册表操作需要app.manifest文件:

//把上面的getip(共2处)替换成自己想启动程序的名字。

          <requestedExecutionLevel level="highestAvailable" uiAccess="false" />

================================================

          并且操作注册表时还需要

实用代码二:

          Registry.LocalMachine.OpenSubKey(Yoursubkey,

//写入注册表,开机自启动
HKEY hKey;
//找到系统的启动项
LPCTSTR lpRun = "Software//Microsoft//Windows//CurrentVersion//Run";
//打开启动项Key
long lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpRun, 0, KEY_WRITE, &hKey);
if(lRet == ERROR_SUCCESS)
{
    char pFileName[MAX_PATH] = {0};
    //得到程序自身的全路径
    DWORD dwRet = GetModuleFileName(NULL, pFileName, MAX_PATH);
    //添加一个子Key,并设置值 // 下面的"getip"是应用程序名字(不加后缀.exe)
    lRet = RegSetValueEx(hKey, "getip", 0, REG_SZ, (BYTE *)pFileName, dwRet);

          RegistryKeyPermissionCheck.ReadWriteSubTree,System.Security.AccessControl.RegistryRights.FullControl);实现全部控制

    //关闭注册表
    RegCloseKey(hKey);
    if(lRet != ERROR_SUCCESS)
    {
        AfxMessageBox("系统参数错误,不能随系统启动");
    }
}

      2. 我在编写开机自动启动程序时也是先用修改注册表的方法,但是发现针对不同电脑不是每次都能成功的,也就是说修改注册表的方法的成功率并不是100%

     一、当前用户专有的启动文件夹

 

     这是许多应用软件自动启动的常用位置,Windows自动启动放入该文件夹的所有快捷方式。用户启动文件夹一般在:/Documents and Settings/<用户名字>/「开始」菜单/程序/启动,其中“<用户名字>”是当前登录的用户帐户名称。

二、一个古老而可靠的方法

    
     二、对所有用户有效的启动文件夹

       其实有一个相当可靠而且实用的方法,那就是在计算机【开始/启动】文件夹中,将你想要开机自动启动的程序的快捷方式放入进去。这样下次开机就会执行这个文件夹的程序,

     这是寻找自动启动程序的第二个重要位置,不管用户用什么身份登录系统,放入该文件夹的快捷方式总是自动启动——这是它与用户专有的启动文件夹的区别所在。该文件夹一般在:/Documents and Settings/All Users/「开始」菜单/程序/启动。

      不要忘记** !**如果不是每次开机都要执行这个程序的话,你应该在程序中有一个删除该快捷方式的语句。

    
      三、Load注册键

     

     介绍该注册键的资料不多,实际上它也能够自动启动程序。位置:HKEY_CURRENT_USER/Software/Microsoft/WindowsNT/CurrentVersion/Windows/load。

      下面是我的开机自动程序的组成部分:

    
     四、Userinit注册键

      1. 需要开机自动执行的程序                 Restart.exe

     位置:HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/WindowsNT/CurrentVersion/Winlogon/Userinit。这里也能够使系统启动时自动初始化程序。通常该注册键下面有一个userinit.exe,如图,但这个键允许指定用逗号分隔的多个程序,例如“userinit.exe,OSA.exe”(不含引号)。

      2. 一个引导执行Restart.exe的脚本      Restart.vbs

   
     五、Explorer/Run注册键

    

     和load、Userinit不同,Explorer/Run键在HKEY_CURRENT_USER和HKEY_LOCAL_MACHINE下都有,具体位置是:HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Policies/Explorer/Run,和HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Policies/Explorer/Run。

      如果Restart.exe与.vbs 在客户机的任意一个硬盘上的任意一个位置,我的流程是:

    
     六、RunServicesOnce注册键

      1. 生成Restart.vbs的快捷方式Restart.lnk——>将.lnk剪切至【开始/启动】文件夹内

     RunServicesOnce注册键用来启动服务程序,启动时间在用户登录之前,而且先于其他通过注册键启动的程序。RunServicesOnce注册键的位置是:HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/RunServicesOnce,和HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/RunServicesOnce。

      2. 当下次开机时会先通过快捷方式.lnk执行.vbs,再通过.vbs执行.exe

    
     七、RunServices注册键

      3. 当exe里的程序执行完之后,用File.Delete将.lnk删除(我可不想每次开机执行这个.lnk)

     RunServices注册键指定的程序紧接RunServicesOnce指定的程序之后运行,但两者都在用户登录之前。RunServices的位置是:HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/RunServices,和HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/RunServices。

 

    
     八、RunOnce/Setup注册键

三、代码实现

     RunOnce/Setup指定了用户登录之后运行的程序,它的位置是:HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/RunOnce/Setup,和HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/RunOnce/Setup。

     1. vbs脚本代码 (这个脚本必须和.exe在同一文件夹中)

    
     九、RunOnce注册键

Set shell =Wscript.createobject("WScript.Shell")  
shell.Run "Restart.exe",0,False

澳门新濠3559,     安装程序通常用RunOnce键自动运行程序,它的位置在HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/RunOnce和HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/RunOnce。HKEY_LOCAL_MACHINE下面的RunOnce键会在用户登录之后立即运行程序,运行时机在其他Run键指定的程序之前。HKEY_CURRENT_USER下面的RunOnce键在操作系统处理其他Run键以及“启动”文件夹的内容之后运行。如果是XP,你还需要检查一下HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/RunOnceEx。

     

    
     十、Run注册键

     2. 创建快捷方式的代码 (需要引入COM组件,名称为Windows Script Host Object Model)

     Run是自动运行程序最常用的注册键,位置在:HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Run,和HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Run。HKEY_CURRENT_USER下面的Run键紧接HKEY_LOCAL_MACHINE下面的Run键运行,但两者都在处理“启动”文件夹之前。

 if (!File.Exists(Environment.GetFolderPath(Environment.SpecialFolder.Startup) + "\Restart.lnk"))
 {
     IWshRuntimeLibrary.WshShell shell = new IWshRuntimeLibrary.WshShell();
     IWshRuntimeLibrary.IWshShortcut shortcut = (IWshRuntimeLibrary.IWshShortcut)shell.CreateShortcut(System.IO.Path.Combine("The path you want", "Restart.lnk")); 
     //有些目录下不允许建快捷方式
     shortcut.TargetPath = System.IO.Path.Combine("Your exe file path", "Restart.vbs"); 
     shortcut.WorkingDirectory = "The path you want";
     shortcut.WindowStyle = 7;
     shortcut.Save();            
     File.Move(System.IO.Path.Combine("The path you want", "Restart.lnk"), Environment.GetFolderPath(Environment.SpecialFolder.Startup) + "\Restart.lnk");
 }

有时候人们往往会为了一个程序的启动而头痛,因为一些用户往往不知道那些文件是如何启动的。所以经常会有些没用的东西挂在系统上占用资源。有时候也会有人因为不知道如何启动某个文件而头痛。更有些特洛依木马的作者因为不清楚系统的自启动方式而使自己的木马轻松被别人发现……

      注意!最后一句! 

      File.Move的Environment.GetFolderPath(Environment.SpecialFolder.Startup)

  • "\Restart.lnk"

      不能写成

      Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Startup),"Restart.lnk")

 

    3. 执行完exe中的主要代码后,删除该快捷方式以防每次开机都执行这个程序(根据自已的需要)

File.Delete(Environment.GetFolderPath(Environment.SpecialFolder.Startup) + "\Restart.lnk");

 

编辑:编程 本文来源:这个方法是有问题的,澳门新濠3559:存在则进行

关键词:

  • 上一篇:没有了
  • 下一篇:没有了