关于程序自启动的问题,发现win7家庭版会不自启动

时间:2022-12-18 08:42:05
编了一个小程序,该程序能设置注册表中自启动项,首先能打开谷歌浏览器,并在谷歌浏览器上打开指定页面,并把该小程序和谷歌浏览器再次添加到注册表自启动中。
这个程序在win7专业版、旗舰版都测试通过,但是在家庭版中谷歌浏览器自启动成功,小程序没有自启动。
请问有什么办法解决这个问题。

23 个解决方案

#1


看下是否被杀软件拦截了,另外设置成按管理员权限启动试下

#2


是管理员权限,安全卫士管家杀毒啥的都不是原因,因为专业版和旗舰版也一样安装了。

#3


推荐使用软件autoruns查看当前Windows系统都有哪些自启动项。

#4


在注册表里有,在安全卫士里也能看见。
赵4老师这个回答有失水准。

#5


引用 4 楼 njywangcong 的回复:
在注册表里有,在安全卫士里也能看见。
赵4老师这个回答有失水准。

那可能不是没启动;而是启动后立即退出或启动后界面没显示出来。
在程序中加写日志到文件观察:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef _MSC_VER
    #pragma warning(disable:4996)
    #include <windows.h>
    #include <io.h>
#else
    #include <unistd.h>
    #include <sys/time.h>
    #include <pthread.h>
    #define  CRITICAL_SECTION   pthread_mutex_t
    #define  _vsnprintf         vsnprintf
#endif
//Log{
#define MAXLOGSIZE 20000000
#define MAXLINSIZE 16000
#include <time.h>
#include <sys/timeb.h>
#include <stdarg.h>
char logfilename1[]="MyLog1.log";
char logfilename2[]="MyLog2.log";
static char logstr[MAXLINSIZE+1];
char datestr[16];
char timestr[16];
char mss[4];
CRITICAL_SECTION cs_log;
FILE *flog;
#ifdef _MSC_VER
void Lock(CRITICAL_SECTION *l) {
    EnterCriticalSection(l);
}
void Unlock(CRITICAL_SECTION *l) {
    LeaveCriticalSection(l);
}
#else
void Lock(CRITICAL_SECTION *l) {
    pthread_mutex_lock(l);
}
void Unlock(CRITICAL_SECTION *l) {
    pthread_mutex_unlock(l);
}
#endif
void LogV(const char *pszFmt,va_list argp) {
    struct tm *now;
    struct timeb tb;

    if (NULL==pszFmt||0==pszFmt[0]) return;
    _vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);
    ftime(&tb);
    now=localtime(&tb.time);
    sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);
    sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );
    sprintf(mss,"%03d",tb.millitm);
    printf("%s %s.%s %s",datestr,timestr,mss,logstr);
    flog=fopen(logfilename1,"a");
    if (NULL!=flog) {
        fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);
        if (ftell(flog)>MAXLOGSIZE) {
            fclose(flog);
            if (rename(logfilename1,logfilename2)) {
                remove(logfilename2);
                rename(logfilename1,logfilename2);
            }
        } else {
            fclose(flog);
        }
    }
}
void Log(const char *pszFmt,...) {
    va_list argp;

    Lock(&cs_log);
    va_start(argp,pszFmt);
    LogV(pszFmt,argp);
    va_end(argp);
    Unlock(&cs_log);
}
//Log}
int main(int argc,char * argv[]) {
    int i;
#ifdef _MSC_VER
    InitializeCriticalSection(&cs_log);
#else
    pthread_mutex_init(&cs_log,NULL);
#endif
    for (i=0;i<10000;i++) {
        Log("This is a Log %04d from FILE:%s LINE:%d\n",i, __FILE__, __LINE__);
    }
#ifdef _MSC_VER
    DeleteCriticalSection(&cs_log);
#else
    pthread_mutex_destroy(&cs_log);
#endif
    return 0;
}
//1-79行添加到你带main的.c或.cpp的那个文件的最前面
//81-86行添加到你的main函数开头
//90-94行添加到你的main函数结束前
//在要写LOG的地方仿照第88行的写法写LOG到文件MyLog1.log中

#6


我想问为啥其他版本的系统就没问题呢?只有家庭版会有呢?我昨天装了30台不同情况的电脑,只有家庭版的两台win7出现了这个情况。不是我不想测试,是我如果测试需要找个家庭版的win7装虚拟机上再试,比较麻烦。想问有没有人有经验遇到过这个情况,知道家庭版的win7有啥猫腻,需要怎么设置解决一下。代码和启动情况都应该没问题。

#7


引用 6 楼 njywangcong的回复:
我想问为啥其他版本的系统就没问题呢?只有家庭版会有呢?我昨天装了30台不同情况的电脑,只有家庭版的两台win7出现了这个情况。不是我不想测试,是我如果测试需要找个家庭版的win7装虚拟机上再试,比较麻烦。想问有没有人有经验遇到过这个情况,知道家庭版的win7有啥猫腻,需要怎么设置解决一下。代码和启动情况都应该没问题。

可能家庭版需要管理员权限,就像WIN8

#8


但是程序编译的时候是管理员权限啊,在其他版本的系统里是这样提现的。单独运行的时候也是这样提示的。

#9


我用Win10的时候,遇到过针对需要管理员权限启动的启动项,必须要使用超级管理员账户登录才能使启动项正常生效,不知是不是这个原因,你可以试试。

#10


超级管理员账户?

#11


我刚才看系统那个版本叫家庭普通版。

#12


找个家庭版的win7装虚拟机上调试

#13


找到问题了,真是管理员用户的事,administrator用户就好使了。但是我想知道,都是administrators组的用户,为啥得必须是administrator才行呢?
我要安装的电脑使用者不同意更换用户。
或者有没有啥办法让原用户和administrator一样呢?

还是代码上能让这个权限变成administrator这个所谓的超级管理员呢?

#14


你的自启程序可不可以取消“以管理员权限运行”?因为只有以管理员权限运行的自启程序,才必须需要超级管理员账户才能生效。

引用 13 楼 njywangcong 的回复:
找到问题了,真是管理员用户的事,administrator用户就好使了。但是我想知道,都是administrators组的用户,为啥得必须是administrator才行呢?
我要安装的电脑使用者不同意更换用户。
或者有没有啥办法让原用户和administrator一样呢?

还是代码上能让这个权限变成administrator这个所谓的超级管理员呢?

#15


或者你使用批处理的形式,把你的自启程序放到一个.bat文件里去启动,然后把这个.bat加入到自启。

引用 13 楼 njywangcong 的回复:
找到问题了,真是管理员用户的事,administrator用户就好使了。但是我想知道,都是administrators组的用户,为啥得必须是administrator才行呢?
我要安装的电脑使用者不同意更换用户。
或者有没有啥办法让原用户和administrator一样呢?

还是代码上能让这个权限变成administrator这个所谓的超级管理员呢?

#16


取消以管理员运行的情况下,刚开始我的程序是因为添加到注册表时需要管理员权限才变成管理员权限运行的,除非有办法让添加注册表不用管理员权限添加了。

但是win7旗舰版的用户名就不是administrator也能成功啊?

是因为win7家庭普通版就是这样特殊么?

#17


Quote: 引用 15 楼 wanggui2015 的回复:

或者你使用批处理的形式,把你的自启程序放到一个.bat文件里去启动,然后把这个.bat加入到自启。

“然后把这个.bat添加到自启”是手动还是用代码添加?你的意思是管理员权限是和.EXE文件有关系和.BAT没有关系,是这个意思么?


#18


对,貌似还得设置一个延时启动,比如你启动的程序名称叫 program.exe,然后在这个exe的同名文件夹下新建一个 program.bat 的批处理文件,内容如下:


@echo off
@ping 127.0.0.1 -n 10 >nul
start program.exe


里面设置了一个10s的延时启动,然后把这个批处理文件的快捷方式添加到启动项里。

引用 17 楼 njywangcong 的回复:
Quote: 引用 15 楼 wanggui2015 的回复:

或者你使用批处理的形式,把你的自启程序放到一个.bat文件里去启动,然后把这个.bat加入到自启。

“然后把这个.bat添加到自启”是手动还是用代码添加?你的意思是管理员权限是和.EXE文件有关系和.BAT没有关系,是这个意思么?

#19


引用 18 楼 wanggui2015 的回复:
对,貌似还得设置一个延时启动,比如你启动的程序名称叫 program.exe,然后在这个exe的同名文件夹下新建一个 program.bat 的批处理文件,内容如下:


@echo off
@ping 127.0.0.1 -n 10 >nul
start program.exe


里面设置了一个10s的延时启动,然后把这个批处理文件的快捷方式添加到启动项里。

Quote: 引用 17 楼 njywangcong 的回复:

Quote: 引用 15 楼 wanggui2015 的回复:

或者你使用批处理的形式,把你的自启程序放到一个.bat文件里去启动,然后把这个.bat加入到自启。

“然后把这个.bat添加到自启”是手动还是用代码添加?你的意思是管理员权限是和.EXE文件有关系和.BAT没有关系,是这个意思么?


我试试。

#20


具体原因我也不太清楚额,是不是会跟这两个不同系统版本的一些默认配置有关系?

引用 16 楼 njywangcong 的回复:
取消以管理员运行的情况下,刚开始我的程序是因为添加到注册表时需要管理员权限才变成管理员权限运行的,除非有办法让添加注册表不用管理员权限添加了。

但是win7旗舰版的用户名就不是administrator也能成功啊?

是因为win7家庭普通版就是这样特殊么?

#21


这个方法在逻辑顺序上有快捷方式这一项,不符合我要做的事,不过还是谢谢你了。

我看看能不能把家庭版升级到旗舰版。

其实最关键是没办法自己去试,这个奇葩的系统我没找到下载的地方。

Quote: 引用 18 楼 wanggui2015 的回复:

对,貌似还得设置一个延时启动,比如你启动的程序名称叫 program.exe,然后在这个exe的同名文件夹下新建一个 program.bat 的批处理文件,内容如下:


#22


该回复于2018-03-08 13:16:12被管理员删除

#23


补充解决途径,第一种是关闭UAC的提醒,第二种是编突破UAC提醒的程序,第三种是使用administrator用户登录。

#1


看下是否被杀软件拦截了,另外设置成按管理员权限启动试下

#2


是管理员权限,安全卫士管家杀毒啥的都不是原因,因为专业版和旗舰版也一样安装了。

#3


推荐使用软件autoruns查看当前Windows系统都有哪些自启动项。

#4


在注册表里有,在安全卫士里也能看见。
赵4老师这个回答有失水准。

#5


引用 4 楼 njywangcong 的回复:
在注册表里有,在安全卫士里也能看见。
赵4老师这个回答有失水准。

那可能不是没启动;而是启动后立即退出或启动后界面没显示出来。
在程序中加写日志到文件观察:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef _MSC_VER
    #pragma warning(disable:4996)
    #include <windows.h>
    #include <io.h>
#else
    #include <unistd.h>
    #include <sys/time.h>
    #include <pthread.h>
    #define  CRITICAL_SECTION   pthread_mutex_t
    #define  _vsnprintf         vsnprintf
#endif
//Log{
#define MAXLOGSIZE 20000000
#define MAXLINSIZE 16000
#include <time.h>
#include <sys/timeb.h>
#include <stdarg.h>
char logfilename1[]="MyLog1.log";
char logfilename2[]="MyLog2.log";
static char logstr[MAXLINSIZE+1];
char datestr[16];
char timestr[16];
char mss[4];
CRITICAL_SECTION cs_log;
FILE *flog;
#ifdef _MSC_VER
void Lock(CRITICAL_SECTION *l) {
    EnterCriticalSection(l);
}
void Unlock(CRITICAL_SECTION *l) {
    LeaveCriticalSection(l);
}
#else
void Lock(CRITICAL_SECTION *l) {
    pthread_mutex_lock(l);
}
void Unlock(CRITICAL_SECTION *l) {
    pthread_mutex_unlock(l);
}
#endif
void LogV(const char *pszFmt,va_list argp) {
    struct tm *now;
    struct timeb tb;

    if (NULL==pszFmt||0==pszFmt[0]) return;
    _vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);
    ftime(&tb);
    now=localtime(&tb.time);
    sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);
    sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );
    sprintf(mss,"%03d",tb.millitm);
    printf("%s %s.%s %s",datestr,timestr,mss,logstr);
    flog=fopen(logfilename1,"a");
    if (NULL!=flog) {
        fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);
        if (ftell(flog)>MAXLOGSIZE) {
            fclose(flog);
            if (rename(logfilename1,logfilename2)) {
                remove(logfilename2);
                rename(logfilename1,logfilename2);
            }
        } else {
            fclose(flog);
        }
    }
}
void Log(const char *pszFmt,...) {
    va_list argp;

    Lock(&cs_log);
    va_start(argp,pszFmt);
    LogV(pszFmt,argp);
    va_end(argp);
    Unlock(&cs_log);
}
//Log}
int main(int argc,char * argv[]) {
    int i;
#ifdef _MSC_VER
    InitializeCriticalSection(&cs_log);
#else
    pthread_mutex_init(&cs_log,NULL);
#endif
    for (i=0;i<10000;i++) {
        Log("This is a Log %04d from FILE:%s LINE:%d\n",i, __FILE__, __LINE__);
    }
#ifdef _MSC_VER
    DeleteCriticalSection(&cs_log);
#else
    pthread_mutex_destroy(&cs_log);
#endif
    return 0;
}
//1-79行添加到你带main的.c或.cpp的那个文件的最前面
//81-86行添加到你的main函数开头
//90-94行添加到你的main函数结束前
//在要写LOG的地方仿照第88行的写法写LOG到文件MyLog1.log中

#6


我想问为啥其他版本的系统就没问题呢?只有家庭版会有呢?我昨天装了30台不同情况的电脑,只有家庭版的两台win7出现了这个情况。不是我不想测试,是我如果测试需要找个家庭版的win7装虚拟机上再试,比较麻烦。想问有没有人有经验遇到过这个情况,知道家庭版的win7有啥猫腻,需要怎么设置解决一下。代码和启动情况都应该没问题。

#7


引用 6 楼 njywangcong的回复:
我想问为啥其他版本的系统就没问题呢?只有家庭版会有呢?我昨天装了30台不同情况的电脑,只有家庭版的两台win7出现了这个情况。不是我不想测试,是我如果测试需要找个家庭版的win7装虚拟机上再试,比较麻烦。想问有没有人有经验遇到过这个情况,知道家庭版的win7有啥猫腻,需要怎么设置解决一下。代码和启动情况都应该没问题。

可能家庭版需要管理员权限,就像WIN8

#8


但是程序编译的时候是管理员权限啊,在其他版本的系统里是这样提现的。单独运行的时候也是这样提示的。

#9


我用Win10的时候,遇到过针对需要管理员权限启动的启动项,必须要使用超级管理员账户登录才能使启动项正常生效,不知是不是这个原因,你可以试试。

#10


超级管理员账户?

#11


我刚才看系统那个版本叫家庭普通版。

#12


找个家庭版的win7装虚拟机上调试

#13


找到问题了,真是管理员用户的事,administrator用户就好使了。但是我想知道,都是administrators组的用户,为啥得必须是administrator才行呢?
我要安装的电脑使用者不同意更换用户。
或者有没有啥办法让原用户和administrator一样呢?

还是代码上能让这个权限变成administrator这个所谓的超级管理员呢?

#14


你的自启程序可不可以取消“以管理员权限运行”?因为只有以管理员权限运行的自启程序,才必须需要超级管理员账户才能生效。

引用 13 楼 njywangcong 的回复:
找到问题了,真是管理员用户的事,administrator用户就好使了。但是我想知道,都是administrators组的用户,为啥得必须是administrator才行呢?
我要安装的电脑使用者不同意更换用户。
或者有没有啥办法让原用户和administrator一样呢?

还是代码上能让这个权限变成administrator这个所谓的超级管理员呢?

#15


或者你使用批处理的形式,把你的自启程序放到一个.bat文件里去启动,然后把这个.bat加入到自启。

引用 13 楼 njywangcong 的回复:
找到问题了,真是管理员用户的事,administrator用户就好使了。但是我想知道,都是administrators组的用户,为啥得必须是administrator才行呢?
我要安装的电脑使用者不同意更换用户。
或者有没有啥办法让原用户和administrator一样呢?

还是代码上能让这个权限变成administrator这个所谓的超级管理员呢?

#16


取消以管理员运行的情况下,刚开始我的程序是因为添加到注册表时需要管理员权限才变成管理员权限运行的,除非有办法让添加注册表不用管理员权限添加了。

但是win7旗舰版的用户名就不是administrator也能成功啊?

是因为win7家庭普通版就是这样特殊么?

#17


Quote: 引用 15 楼 wanggui2015 的回复:

或者你使用批处理的形式,把你的自启程序放到一个.bat文件里去启动,然后把这个.bat加入到自启。

“然后把这个.bat添加到自启”是手动还是用代码添加?你的意思是管理员权限是和.EXE文件有关系和.BAT没有关系,是这个意思么?


#18


对,貌似还得设置一个延时启动,比如你启动的程序名称叫 program.exe,然后在这个exe的同名文件夹下新建一个 program.bat 的批处理文件,内容如下:


@echo off
@ping 127.0.0.1 -n 10 >nul
start program.exe


里面设置了一个10s的延时启动,然后把这个批处理文件的快捷方式添加到启动项里。

引用 17 楼 njywangcong 的回复:
Quote: 引用 15 楼 wanggui2015 的回复:

或者你使用批处理的形式,把你的自启程序放到一个.bat文件里去启动,然后把这个.bat加入到自启。

“然后把这个.bat添加到自启”是手动还是用代码添加?你的意思是管理员权限是和.EXE文件有关系和.BAT没有关系,是这个意思么?

#19


引用 18 楼 wanggui2015 的回复:
对,貌似还得设置一个延时启动,比如你启动的程序名称叫 program.exe,然后在这个exe的同名文件夹下新建一个 program.bat 的批处理文件,内容如下:


@echo off
@ping 127.0.0.1 -n 10 >nul
start program.exe


里面设置了一个10s的延时启动,然后把这个批处理文件的快捷方式添加到启动项里。

Quote: 引用 17 楼 njywangcong 的回复:

Quote: 引用 15 楼 wanggui2015 的回复:

或者你使用批处理的形式,把你的自启程序放到一个.bat文件里去启动,然后把这个.bat加入到自启。

“然后把这个.bat添加到自启”是手动还是用代码添加?你的意思是管理员权限是和.EXE文件有关系和.BAT没有关系,是这个意思么?


我试试。

#20


具体原因我也不太清楚额,是不是会跟这两个不同系统版本的一些默认配置有关系?

引用 16 楼 njywangcong 的回复:
取消以管理员运行的情况下,刚开始我的程序是因为添加到注册表时需要管理员权限才变成管理员权限运行的,除非有办法让添加注册表不用管理员权限添加了。

但是win7旗舰版的用户名就不是administrator也能成功啊?

是因为win7家庭普通版就是这样特殊么?

#21


这个方法在逻辑顺序上有快捷方式这一项,不符合我要做的事,不过还是谢谢你了。

我看看能不能把家庭版升级到旗舰版。

其实最关键是没办法自己去试,这个奇葩的系统我没找到下载的地方。

Quote: 引用 18 楼 wanggui2015 的回复:

对,貌似还得设置一个延时启动,比如你启动的程序名称叫 program.exe,然后在这个exe的同名文件夹下新建一个 program.bat 的批处理文件,内容如下:


#22


该回复于2018-03-08 13:16:12被管理员删除

#23


补充解决途径,第一种是关闭UAC的提醒,第二种是编突破UAC提醒的程序,第三种是使用administrator用户登录。