俺最多只能给300分,不够可以另加,意在解决问题:(这个问题是我几年前就遇到的问题,当时不了了之了,现在又遇到,今天特意花了一个下午研究,还是没有解决,郁闷,特请教诸位高手。
需求说起来很简单:我要创建一个windows服务,并且运行服务的用户、密码都是要指定的以下是我的主要代码:
void InstallSvr(const char* sUser, const char* sPwd)
{
SC_HANDLE hSCDB = NULL;
try
{
//open SCM
char sPath[1024];
memset(sPath, 0, sizeof(sPath));
GetModuleFileName(NULL, sPath, sizeof(sPath));
hSCDB=OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if( !hSCDB )
{
throw "Failed to open SCM in InstallSvr.";
} //create service
char strUser[64];
char strPwd[64];
strcpy(strUser, "NT AUTHORITY\\NetworkService");
strcpy(strPwd, "");
if ( strlen(sUser)>0 && strlen(sPwd)>0 ) //指定用户、密码,问题就发生在这种场合
{
strcpy(strUser, sUser);
strcpy(strPwd, sPwd);
if ( SetSrvPriOfAccount(strUser)==RTN_OK ) //为这个用户指派权限“以服务登录”
{
printf("set SeServiceLogonRight to user[%s] OK.\n", strUser);
}
}
SC_HANDLE hTemp = CreateService(hSCDB, NIK_SERVICE_NAME, NIK_SERVICE_DISPLAYNAME,
SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START,SERVICE_ERROR_NORMAL,
sPath, NULL, NULL, NULL, strUser, strPwd);
if( !hTemp )
{
throw "Failed to CreateService.";
}
//ChangeServiceConfig(hTemp, SERVICE_NO_CHANGE, SERVICE_NO_CHANGE, SERVICE_NO_CHANGE,
// NULL, NULL, NULL, NULL, strUser, strPwd, NULL); //无效的测试 //set description
SERVICE_DESCRIPTION stDescription;
stDescription.lpDescription = NIK_SERVICE_DESCRIPTION;
ChangeServiceConfig2(hTemp, SERVICE_CONFIG_DESCRIPTION, &stDescription);
CloseServiceHandle(hTemp);
}
catch (const char* e1)
{
printf(e1);
}
catch (...)
{
printf("Unknown error in InstallSvr.");
}
if( hSCDB != NULL )
{
CloseServiceHandle(hSCDB);
hSCDB = NULL;
}
}问题是:服务成功创建,但是启动服务显示“1069错误(由于登录失败而无法启动服务)”
暂时我的解决方法是手工打开service控制面板,修改密码,然后确定,服务即可成功启动。
说明:程序中设置的密码肯定是正确的。代码行SetSrvPriOfAccount(strUser)是我今天增加的,目的是是指定的用户具有“以服务登录”的权限,但是问题依然存在,我又以为是系统更新的问题,重启系统之后依然不行。不管我怎么改,依然是需要手工改一下密码,服务才可以启动。郁闷。。
需求说起来很简单:我要创建一个windows服务,并且运行服务的用户、密码都是要指定的以下是我的主要代码:
void InstallSvr(const char* sUser, const char* sPwd)
{
SC_HANDLE hSCDB = NULL;
try
{
//open SCM
char sPath[1024];
memset(sPath, 0, sizeof(sPath));
GetModuleFileName(NULL, sPath, sizeof(sPath));
hSCDB=OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if( !hSCDB )
{
throw "Failed to open SCM in InstallSvr.";
} //create service
char strUser[64];
char strPwd[64];
strcpy(strUser, "NT AUTHORITY\\NetworkService");
strcpy(strPwd, "");
if ( strlen(sUser)>0 && strlen(sPwd)>0 ) //指定用户、密码,问题就发生在这种场合
{
strcpy(strUser, sUser);
strcpy(strPwd, sPwd);
if ( SetSrvPriOfAccount(strUser)==RTN_OK ) //为这个用户指派权限“以服务登录”
{
printf("set SeServiceLogonRight to user[%s] OK.\n", strUser);
}
}
SC_HANDLE hTemp = CreateService(hSCDB, NIK_SERVICE_NAME, NIK_SERVICE_DISPLAYNAME,
SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START,SERVICE_ERROR_NORMAL,
sPath, NULL, NULL, NULL, strUser, strPwd);
if( !hTemp )
{
throw "Failed to CreateService.";
}
//ChangeServiceConfig(hTemp, SERVICE_NO_CHANGE, SERVICE_NO_CHANGE, SERVICE_NO_CHANGE,
// NULL, NULL, NULL, NULL, strUser, strPwd, NULL); //无效的测试 //set description
SERVICE_DESCRIPTION stDescription;
stDescription.lpDescription = NIK_SERVICE_DESCRIPTION;
ChangeServiceConfig2(hTemp, SERVICE_CONFIG_DESCRIPTION, &stDescription);
CloseServiceHandle(hTemp);
}
catch (const char* e1)
{
printf(e1);
}
catch (...)
{
printf("Unknown error in InstallSvr.");
}
if( hSCDB != NULL )
{
CloseServiceHandle(hSCDB);
hSCDB = NULL;
}
}问题是:服务成功创建,但是启动服务显示“1069错误(由于登录失败而无法启动服务)”
暂时我的解决方法是手工打开service控制面板,修改密码,然后确定,服务即可成功启动。
说明:程序中设置的密码肯定是正确的。代码行SetSrvPriOfAccount(strUser)是我今天增加的,目的是是指定的用户具有“以服务登录”的权限,但是问题依然存在,我又以为是系统更新的问题,重启系统之后依然不行。不管我怎么改,依然是需要手工改一下密码,服务才可以启动。郁闷。。
解决方案 »
- vc6用下面的函数无法创建一个access数据库,请大牛们赐教???
- 使用了vs2008 feature pack 引发的问题
- 如何解决移动静态控件的闪烁问题
- 怎样获取用户双击或单击的是那个逻辑盘符?怎样在显示某个逻辑磁盘的内容之前得到该盘符,并进行拦截Win自动响应用户的功能(如显示或提
- 请问,我有什么办法可以用程序的方式打开我指定的磁盘呢
- 图形的颜色识别问题
- 设置背景图片问题
- SendMessage()未何消息发不出去
- 在qq有新的消息时,我的监视程序怎样知道呢?有提思路就给加分
- 江湖救急,真心被socket虐待了!求救
- DrawDibDraw绘制出来的图像谈话怎么是上下颠倒的呀?
- tab控件 为什么显示不了图标??
顺便提一个问题:为何不用默认的LocalSystem账号而改用权限更低的NetworkService账号?
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\服务名
应该是这样的形式: .\user
{
SC_HANDLE hSCDB = NULL;
try
{
//open SCM
char sPath[] = "c:\\Project1.exe";
//memset(sPath, 0, sizeof(sPath));
//GetModuleFileName(NULL, sPath, sizeof(sPath));
hSCDB=OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if( !hSCDB )
{
throw "Failed to open SCM in InstallSvr.";
} //create service
char strUser[64];
char strPwd[64];
strcpy(strUser, "NT AUTHORITY\\NetworkService");
strcpy(strPwd, "");
if ( strlen(sUser)>0 && strlen(sPwd)>0 ) //指定用户、密码,问题就发生在这种场合
{
strcpy(strUser, sUser);
strcpy(strPwd, sPwd);
//if ( SetSrvPriOfAccount(strUser)==RTN_OK ) //为这个用户指派权限“以服务登录”
//{
//printf("set SeServiceLogonRight to user[%s] OK.\n", strUser);
//}}
SC_HANDLE hTemp = CreateService(hSCDB, "MyCnfgSvc", "MyCnfgSvc",
SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START,SERVICE_ERROR_NORMAL,
sPath, NULL, NULL, NULL, strUser, strPwd);
if( !hTemp )
{
throw "Failed to CreateService.";
}
//ChangeServiceConfig(hTemp, SERVICE_NO_CHANGE, SERVICE_NO_CHANGE, SERVICE_NO_CHANGE,
// NULL, NULL, NULL, NULL, strUser, strPwd, NULL); //无效的测试 //set description
SERVICE_DESCRIPTION stDescription;
stDescription.lpDescription = "Tester";
ChangeServiceConfig2(hTemp, SERVICE_CONFIG_DESCRIPTION, &stDescription); CloseServiceHandle(hTemp);
}
catch (const char* e1)
{
printf(e1);
}
catch (...)
{
printf("Unknown error in InstallSvr.");
}
if( hSCDB != NULL )
{
CloseServiceHandle(hSCDB);
hSCDB = NULL;
}
}
InstallSvr(".\\Administrator"/*不知道楼主是不是犯了低级错误,*/,"******");
".\Administrator"
win2003下一切OK!与\转义符无关,看来应该是OS的bug奇怪为什么os sp一直都没更新这个bug吗?这个问题从win2000到xp一直都存在@_@本帖告一段落,回头有空找vista试试,谢谢各位-_-
添加该用户