___冷启动服务器后,在服务程序中自动登录Win2K的问题!!!___

MSVCer 2002-07-21 08:21:11
一台无人值守的服务器,当意外冷启动后,需要在远程控制一个本地安装的服务程序登录,这个服务开一个端口监听网络连接请求,当连接通过必要的验证后,服务程序根据远程提供的用户名与密码登录Win2K,请问如何实现?
我初步的想法:
方法一、服务程序获取当前活动桌面,枚举当前桌面上的窗口,将用户名与密码填写到这两个编辑框中,然后模拟鼠标或键盘按键点中“确定”
方法二、服务程序将当前活动桌面内容发送到远程计算机上,在远程控制服务器上鼠标与键盘来完成登录
现在程序还没有做,只是想法,不能哪位做过的大侠可否指定一二,令小生少走一些弯路
...全文
52 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
hyryxgs 2003-01-09
  • 打赏
  • 举报
回复
up
qiufuwang 2002-09-27
  • 打赏
  • 举报
回复
up
MSVCer 2002-08-15
  • 打赏
  • 举报
回复
MSVCer 2002-08-04
  • 打赏
  • 举报
回复
谢谢kingzai兄弟
kingzai 2002-08-02
  • 打赏
  • 举报
回复
家宝,我找到一个源代码,不过没仔细瞧,你有空看看把

http://yxme.net/encrypt_src/source_sys.htm
NT下能简单运行其它用户应用程序的程序
MSVCer 2002-08-02
  • 打赏
  • 举报
回复
up
kingzai 2002-07-22
  • 打赏
  • 举报
回复
void MyStartService(SC_HANDLE schSCManager, LPSTR lpServiceName)
{
SC_HANDLE schService;
DWORD dwWaitTime;
DWORD dwOldCheckPoint = 0;
DWORD dwStartTickCount;
SERVICE_STATUS ssStatus;
LPQUERY_SERVICE_CONFIG lpConfig;
DWORD dwSize;

schService = OpenService(schSCManager, lpServiceName, SERVICE_ALL_ACCESS);
if (schService == NULL)
{
printf ("Open service failed!\n");
return;
}

if (!QueryServiceStatus(schService, &ssStatus))
{
CloseServiceHandle(schService);
printf ("Query service status failed!\n");
return;
}
if (ssStatus.dwCurrentState == SERVICE_RUNNING
|| ssStatus.dwCurrentState == SERVICE_START_PENDING)
{
CloseServiceHandle(schService);
printf ("The service is running or starting!\n");
return;
}

lpConfig = (LPQUERY_SERVICE_CONFIG) LocalAlloc(LPTR, 1024);
if (!QueryServiceConfig(schService, lpConfig, 1024, &dwSize))
{
CloseServiceHandle(schService);
printf ("Query service config failed!\n");
return;
}
if (lpConfig->dwStartType == SERVICE_DISABLED)
{
printf ("The service is disabled!\n");
printf ("Try to change the service's start type...");
if (!ChangeServiceConfig(schService,
SERVICE_NO_CHANGE,
SERVICE_DEMAND_START,
SERVICE_NO_CHANGE,
NULL, NULL, NULL, NULL, NULL, NULL,NULL))
{
CloseServiceHandle(schService);
printf ("Failed!\n");
return;
}
else
printf ("Successfully!\n");
}

printf ("starting the service <%s>...\n", lpServiceName);
if (!StartService(schService, 0, NULL))
{
CloseServiceHandle(schService);
printf ("Starting the service failed!\n");
return;
}

if (!(QueryServiceStatus(schService, &ssStatus)))
{
CloseServiceHandle(schService);
printf ("Query service status failed!\n");
return;
}

while ( ssStatus.dwCurrentState == SERVICE_START_PENDING)
{
dwWaitTime = ssStatus.dwWaitHint / 10;
if( dwWaitTime < 1000 )
dwWaitTime = 1000;
else if ( dwWaitTime > 10000 )
dwWaitTime = 10000;
Sleep(dwWaitTime);

// Check the status again.
if (!QueryServiceStatus(
schService, // handle to service
&ssStatus) ) // address of structure
break;

if ( ssStatus.dwCheckPoint > dwOldCheckPoint )
{
// The service is making progress.
dwStartTickCount = GetTickCount();
dwOldCheckPoint = ssStatus.dwCheckPoint;
}
else
{
if(GetTickCount()-dwStartTickCount > ssStatus.dwWaitHint)
{
// No progress made within the wait hint
break;
}
}
}

if ( ssStatus.dwCurrentState == SERVICE_RUNNING )
{
printf ("Service is started successfully!\n");
}
else
{
printf ("Start service failed!\n");
}
return;
}

void MyStopService(SC_HANDLE schSCManager, LPSTR lpServiceName)
{
SC_HANDLE schService;
DWORD dwWaitTime;
SERVICE_STATUS ssStatus;

schService = OpenService(schSCManager, lpServiceName, SERVICE_ALL_ACCESS);
if (schService == NULL)
{
printf ("Open service failed!\n");
return;
}
if (!QueryServiceStatus(schService, &ssStatus))
{
printf ("Query service failed!\n");
CloseServiceHandle(schService);
return;
}

if (ssStatus.dwCurrentState == SERVICE_STOPPED
|| ssStatus.dwCurrentState == SERVICE_STOP_PENDING)
{
CloseServiceHandle(schService);
printf ("service is stopped!\n");
return;
}

printf ("stopping the service <%s>...\n", lpServiceName);
if (!(ControlService(schService, SERVICE_CONTROL_STOP, &ssStatus)))
{
CloseServiceHandle(schService);
printf ("Control service status failed!\n");
return;
}

dwWaitTime = ssStatus.dwWaitHint / 10;
if( dwWaitTime < 1000 )
dwWaitTime = 1000;
else if ( dwWaitTime > 10000 )
dwWaitTime = 10000;

Sleep(dwWaitTime);

if (!QueryServiceStatus(schService, &ssStatus))
{
printf ("Query service status failed!\n");
return;
}

if ( ssStatus.dwCurrentState == SERVICE_STOPPED || ssStatus.dwCurrentState == SERVICE_STOP_PENDING)
{
printf ("Service is stopped successfully!\n");
}
else
{
printf ("%d\n", ssStatus.dwCurrentState );
printf ("Service is not started!\n");
}
return;
}
kingzai 2002-07-22
  • 打赏
  • 举报
回复
void MyStartService(SC_HANDLE schSCManager, LPSTR lpServiceName)
{
SC_HANDLE schService;
DWORD dwWaitTime;
DWORD dwOldCheckPoint = 0;
DWORD dwStartTickCount;
SERVICE_STATUS ssStatus;
LPQUERY_SERVICE_CONFIG lpConfig;
DWORD dwSize;

schService = OpenService(schSCManager, lpServiceName, SERVICE_ALL_ACCESS);
if (schService == NULL)
{
printf ("Open service failed!\n");
return;
}

if (!QueryServiceStatus(schService, &ssStatus))
{
CloseServiceHandle(schService);
printf ("Query service status failed!\n");
return;
}
if (ssStatus.dwCurrentState == SERVICE_RUNNING
|| ssStatus.dwCurrentState == SERVICE_START_PENDING)
{
CloseServiceHandle(schService);
printf ("The service is running or starting!\n");
return;
}

lpConfig = (LPQUERY_SERVICE_CONFIG) LocalAlloc(LPTR, 1024);
if (!QueryServiceConfig(schService, lpConfig, 1024, &dwSize))
{
CloseServiceHandle(schService);
printf ("Query service config failed!\n");
return;
}
if (lpConfig->dwStartType == SERVICE_DISABLED)
{
printf ("The service is disabled!\n");
printf ("Try to change the service's start type...");
if (!ChangeServiceConfig(schService,
SERVICE_NO_CHANGE,
SERVICE_DEMAND_START,
SERVICE_NO_CHANGE,
NULL, NULL, NULL, NULL, NULL, NULL,NULL))
{
CloseServiceHandle(schService);
printf ("Failed!\n");
return;
}
else
printf ("Successfully!\n");
}

printf ("starting the service <%s>...\n", lpServiceName);
if (!StartService(schService, 0, NULL))
{
CloseServiceHandle(schService);
printf ("Starting the service failed!\n");
return;
}

if (!(QueryServiceStatus(schService, &ssStatus)))
{
CloseServiceHandle(schService);
printf ("Query service status failed!\n");
return;
}

while ( ssStatus.dwCurrentState == SERVICE_START_PENDING)
{
dwWaitTime = ssStatus.dwWaitHint / 10;
if( dwWaitTime < 1000 )
dwWaitTime = 1000;
else if ( dwWaitTime > 10000 )
dwWaitTime = 10000;
Sleep(dwWaitTime);

// Check the status again.
if (!QueryServiceStatus(
schService, // handle to service
&ssStatus) ) // address of structure
break;

if ( ssStatus.dwCheckPoint > dwOldCheckPoint )
{
// The service is making progress.
dwStartTickCount = GetTickCount();
dwOldCheckPoint = ssStatus.dwCheckPoint;
}
else
{
if(GetTickCount()-dwStartTickCount > ssStatus.dwWaitHint)
{
// No progress made within the wait hint
break;
}
}
}

if ( ssStatus.dwCurrentState == SERVICE_RUNNING )
{
printf ("Service is started successfully!\n");
}
else
{
printf ("Start service failed!\n");
}
return;
}

void MyStopService(SC_HANDLE schSCManager, LPSTR lpServiceName)
{
SC_HANDLE schService;
DWORD dwWaitTime;
SERVICE_STATUS ssStatus;

schService = OpenService(schSCManager, lpServiceName, SERVICE_ALL_ACCESS);
if (schService == NULL)
{
printf ("Open service failed!\n");
return;
}
if (!QueryServiceStatus(schService, &ssStatus))
{
printf ("Query service failed!\n");
CloseServiceHandle(schService);
return;
}

if (ssStatus.dwCurrentState == SERVICE_STOPPED
|| ssStatus.dwCurrentState == SERVICE_STOP_PENDING)
{
CloseServiceHandle(schService);
printf ("service is stopped!\n");
return;
}

printf ("stopping the service <%s>...\n", lpServiceName);
if (!(ControlService(schService, SERVICE_CONTROL_STOP, &ssStatus)))
{
CloseServiceHandle(schService);
printf ("Control service status failed!\n");
return;
}

dwWaitTime = ssStatus.dwWaitHint / 10;
if( dwWaitTime < 1000 )
dwWaitTime = 1000;
else if ( dwWaitTime > 10000 )
dwWaitTime = 10000;

Sleep(dwWaitTime);

if (!QueryServiceStatus(schService, &ssStatus))
{
printf ("Query service status failed!\n");
return;
}

if ( ssStatus.dwCurrentState == SERVICE_STOPPED || ssStatus.dwCurrentState == SERVICE_STOP_PENDING)
{
printf ("Service is stopped successfully!\n");
}
else
{
printf ("%d\n", ssStatus.dwCurrentState );
printf ("Service is not started!\n");
}
return;
}
kingzai 2002-07-22
  • 打赏
  • 举报
回复
from opengram.com
////////////////////////////////////////////////////////////////////////////////
#include "ConnectServer.h"
#include <stdio.h>
#include <windows.h>
#include <Winnetwk.h>
#include <Shlwapi.h>

#pragma comment(lib, "Advapi32.lib")
#pragma comment(lib, "Mpr.lib")

DWORD g_dwManagerAccess = SC_MANAGER_ALL_ACCESS;
DWORD g_dwServiceAccess = SERVICE_ALL_ACCESS;

void ListServices (SC_HANDLE, DWORD);
void MyStartService (SC_HANDLE, LPSTR);
void MyStopService (SC_HANDLE, LPSTR);
void MyViewService (SC_HANDLE, LPSTR);
void Usage(char*);

int main(int argc, char* argv[])
{
int nRetCode = 0;
char szIpc[50] = "";
DWORD dwServiceType;
SC_HANDLE schSCManager;
LPSTR lpUserName, lpPassword, lpServiceName;
NETRESOURCE NET;

if (argc < 2)
{
Usage(argv[0]);
return 0;
}

if (argv[1][0] == '/' && strlen(argv[1]) == 2)
{
switch (tolower(argv[1][1]))
{
case 'l':
dwServiceType = SERVICE_WIN32 | SERVICE_DRIVER;
break;
case 'd':
dwServiceType = SERVICE_DRIVER;
break;
case 'w':
dwServiceType = SERVICE_WIN32;
break;
case 'k':
dwServiceType = SERVICE_KERNEL_DRIVER;
break;
case 'f':
dwServiceType = SERVICE_FILE_SYSTEM_DRIVER;
break;
case 'o':
dwServiceType = SERVICE_WIN32_OWN_PROCESS;
break;
case 'h':
dwServiceType = SERVICE_WIN32_SHARE_PROCESS;
break;
case 'r':
dwServiceType = -1;
break;
case 's':
case 'p':
case 'v':
if (argc < 6 && (argc != 3))
{
printf ("Error! Input a service name!\n");
return 0;
}
else if (argc >6)
{
printf ("Error! A wrong service name!\n");
return 0;
}
break;
case '?':
Usage(argv[0]);
return 0;
default:
printf ("Error: Unknow option!\n");
return 0;;
}
}
else
{
printf ("Error: Unknow option!\n");
return 0;
}

//get service name
if (argc == 6)
{
lpServiceName = argv[5];
}
else if (argc == 3)
{
// if ((argv[2][0] != '\\') && (argv[2][1] != '\\'))
// {
if (argv[1][0] == '/' && strlen(argv[1]) == 2)
{
switch (tolower(argv[1][1]))
{
case 'l':
case 'd':
case 'w':
case 'k':
case 'f':
case 'o':
case 'h':
case 'r':
printf ("Error arguments!\n");
return 0;
default:
lpServiceName = argv[2];
break;
}
}
// lpServiceName = argv[2];
// }
}

if (argc > 3)
{
/* if ((argv[2][0] != '\\') && (argv[2][1] != '\\'))
{
schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
}
else
{
if (argc == 3)
{
lpUserName = "";
lpPassword = "";
//change access
g_dwManagerAccess = SC_MANAGER_CONNECT;
g_dwServiceAccess = GENERIC_READ;
sprintf (szIpc, "%s", argv[2]);
}
else
{
*/
lpUserName = argv[3];
lpPassword = argv[4];
sprintf (szIpc, "%s\\ipc$", argv[2]);
// }

NET.lpLocalName = NULL;
NET.lpRemoteName = szIpc;
NET.dwType = RESOURCETYPE_ANY;
NET.lpProvider = NULL;

printf ("Connecting %s...",argv[2]);

nRetCode = MyConnectServer(&NET, lpPassword, lpUserName, CONNECT_INTERACTIVE, szIpc);
if (!nRetCode)
printf ("Successfully!\n");
else
{
printf ("Failed!\n");
}
schSCManager = OpenSCManager(argv[2], NULL, SC_MANAGER_ALL_ACCESS);
// }
}
else
{
schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
}

if (schSCManager == NULL)
{
printf ("%d\n", argc);
printf ("%d\n", GetLastError());
printf ("Open SCManager failed!\n");
return 0;
}

//
switch (tolower(argv[1][1]))
{
case 'l':
case 'd':
case 'w':
case 'k':
case 'f':
case 'o':
case 'h':
case 'r':
ListServices(schSCManager, dwServiceType);
break;
case 's':
MyStartService(schSCManager, lpServiceName);
break;
case 'p':
MyStopService(schSCManager, lpServiceName);
break;
case 'v':
MyViewService(schSCManager, lpServiceName);
break;
}

CloseServiceHandle(schSCManager);

if (argc >3 )
{
//close the session with remote server
printf ("\nDisconnecting server...");
nRetCode = MyDisConnectServer(szIpc, CONNECT_UPDATE_PROFILE, TRUE);
if (!nRetCode)
printf ("Successfully!\n");
else
printf ("Failed!\n");
}

return 0;
}

void ListServices(SC_HANDLE schSCManager, DWORD ServiceType)
{
//list services
LPENUM_SERVICE_STATUS_PROCESS lpServices;
DWORD n;
DWORD nSize = 0;
DWORD nServicesReturned;
DWORD nResumeHandle;
DWORD dwServiceType;
nResumeHandle = 0;
dwServiceType = ServiceType;
if (ServiceType == -1)
{
dwServiceType = SERVICE_WIN32;
}

lpServices = (LPENUM_SERVICE_STATUS_PROCESS) LocalAlloc(LPTR, 30720);

if (EnumServicesStatusEx(schSCManager, SC_ENUM_PROCESS_INFO,
dwServiceType, SERVICE_STATE_ALL,
(LPBYTE)lpServices, 30720,
&nSize, &nServicesReturned,
&nResumeHandle, NULL) == NULL)
{
printf ("Enum Error!%d\n",GetLastError());
return;
}
else
{
printf ("Listing service...\n\n");
}

printf ("------------------------------------------------------\n");
printf ("PID \t ServiceName {Service Display Name} <Current status>\n");
printf ("------------------------------------------------------\n");
for (n = 0; n < nServicesReturned; n++)
{
if (!(ServiceType == -1
&& lpServices[n].ServiceStatusProcess.dwCurrentState != SERVICE_RUNNING))
{
//Show the name of service
printf ("pid:%d.",lpServices[n].ServiceStatusProcess.dwProcessId);
if (lpServices[n].ServiceStatusProcess.dwProcessId == 0 )
{
printf ("\t");
}
printf ("%s\t{%s}", lpServices[n].lpServiceName, lpServices[n].lpDisplayName);
// printf ("\t");
//Show the status of service
switch (lpServices[n].ServiceStatusProcess.dwCurrentState)
{
case SERVICE_STOPPED:
printf ("<not running.>");
break;
case SERVICE_START_PENDING:
printf ("<starting.>");
break;
case SERVICE_STOP_PENDING:
printf ("<stopping.>");
break;
case SERVICE_RUNNING:
printf ("<running.>");
break;
case SERVICE_CONTINUE_PENDING:
printf ("<continue pending.>");
break;
case SERVICE_PAUSE_PENDING:
printf ("<pause pending.>");
break;
case SERVICE_PAUSED:
printf ("<paused.>");
break;
}
printf ("\n");
}
}
return;
}
MSVCer 2002-07-22
  • 打赏
  • 举报
回复
我们头说解决方向还是要用服务程序获取当前活动桌面,头说的话一般都是没错的,经过多次验证了
请继续
UPP
MSVCer 2002-07-22
  • 打赏
  • 举报
回复
我们头说解决方向还是要用服务程序获取当前活动桌面,头说的话一般都是没错的,经过多次验证了
请继续
UPP
MSVCer 2002-07-21
  • 打赏
  • 举报
回复
gina的相关资料看了。。。
bluecrest 2002-07-21
  • 打赏
  • 举报
回复
抬一下
daehappy 2002-07-21
  • 打赏
  • 举报
回复
up!gz!
MSVCer 2002-07-21
  • 打赏
  • 举报
回复
to jink(活得比我好):
请问哪有这些导出函数的说明啊,或相关的例子文章都行
1 0 00011487 ShellShutdownDialog
2 1 000066FC WlxActivateUserShell
3 2 0000C450 WlxDisplayLockedNotice
4 3 0000BA98 WlxDisplaySASNotice
5 4 00002703 WlxDisplayStatusMessage
6 5 000117CE WlxGetStatusMessage
7 6 00001807 WlxInitialize
8 7 0000BF08 WlxIsLockOk
9 8 0000BF42 WlxIsLogoffOk
10 9 0000BDB6 WlxLoggedOnSAS
11 A 00002E1F WlxLoggedOutSAS
12 B 0000BF48 WlxLogoff
13 C 000017E4 WlxNegotiate
14 D 0000C04B WlxNetworkProviderLoad
15 E 00002D8B WlxRemoveStatusMessage
16 F 0000C011 WlxScreenSaverNotify
17 10 0000C00E WlxShutdown
18 11 00005B89 WlxStartApplication
19 12 0000C491 WlxWkstaLockedSAS
MSVCer 2002-07-21
  • 打赏
  • 举报
回复
有人建议我替换msgina.dll,我胆小,不敢,下周就交了
jink 2002-07-21
  • 打赏
  • 举报
回复
再恐怖也没你要做的这个东西恐怖~~(盖茨语)
MSVCer 2002-07-21
  • 打赏
  • 举报
回复
msgina.dll这个东西太恐怖乐
jink 2002-07-21
  • 打赏
  • 举报
回复
winnt登录没有这么简单,建议先看看gina再说
MSVCer 2002-07-21
  • 打赏
  • 举报
回复
啊!!太好乐!!发帖成功,我的问题就解决一半乐!!

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧