• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > 我编写的windows服务究竟有何问题?请不栗次教!

我编写的windows服务究竟有何问题?请不栗次教!

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了读书究竟有何用,人生究竟有何不同,卑微究竟有何力量,霍金究竟知道什么,究竟的近义词等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 我编写的windows服务究竟有何问题?请不栗次教!
描述:

服务可以成功运行
服务管理器里面可以启动,停止 服务。
void ServiceMain(int argc, char** argv) 
{
//加了我自己的函数 主要是RegSetValueEx 写注册表
}
调试发现(RegSetValueEx函数执行没有问题。可是注册表就是不变!!
而且这段修改注册表代码我独测试也是没有问题的。
现在问题就在与为什么放在服务里面,他工作就异常了呢?


解决方案1:

HKEY_CURRENT_USER是用户相关的,而服务一般是属于System用户组的,所以不能访问
要访问需要模仿一个用户令牌

解决方案2:

LZ可以通过访问访问HKEY_USERS下用户对应的SID下面的实现,HKEY_CURRENT_USER是其中的映射罢了。
要获得用户态的SID,可以从Explorer.exe模拟一个Token过来


/*---------------------------------------------------------------------
Author:Tr0j4n
Blog:http://hi.baidu.com/tr0j4n
Function:Simulate Windows Sysinternals's PsGetSID.exe
      Get the SID of Current User
-----------------------------------------------------------------------*/
#include <windows.h>
#include <Sddl.h>
#include <iostream>
using namespace std;
int main(void)
{
      PSID pSID(NULL); //It is the protagonist
      HANDLE hCurrent(NULL),hToken(NULL);
      PTOKEN_USER pTokenUser(NULL);
      DWORD dwReturnLength(0),dwLength(0);
      SID_IDENTIFIER_AUTHORITY SNSA =
           SECURITY_NULL_SID_AUTHORITY;
      //Choose which process?As you will
      hCurrent=GetCurrentProcess();
      if(!hCurrent)
      {
           cout<<"Can't Open Process"<<endl;
           goto exit;
      }
      //Get the Token 
      if(!OpenProcessToken(hCurrent,TOKEN_QUERY,&hToken))
      {
           cout<<"Can't Get Own Token"<<endl;
           goto exit;
      }
      //Get the token information,for the length
      if(!GetTokenInformation(hToken,
           TokenUser,
           (LPVOID)pTokenUser,
           0,
           &dwReturnLength))
      {
           if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) 
                 goto exit;
           pTokenUser= (PTOKEN_USER)HeapAlloc(GetProcessHeap(),
                 HEAP_ZERO_MEMORY, dwReturnLength);
           if (pTokenUser == NULL)
                 goto exit;
      }
      //The real get information .Tr0j4n ^_^
      if(!GetTokenInformation(hToken,
           TokenUser,
           (LPVOID)pTokenUser,
           dwReturnLength,
           &dwReturnLength))
      {
           cout<<"Get Token of Explorer.exe Failed!"<<endl;
           goto exit;
      }
      dwLength=GetLengthSid(pTokenUser->User.Sid);
      //Allocate a Null SID
      if(!AllocateAndInitializeSid(&SNSA, 1, SECURITY_NULL_RID,0,0,0,0,0,0,0,&pSID))
      {
           cout<<"Allocate SID Failed!"<<endl;
           goto exit;
      }
      //Next to Copy SID
      if (!CopySid(dwLength, pSID, pTokenUser->User.Sid)) 
      {
           cout<<"Copy SID Failed"<<endl;
           HeapFree(GetProcessHeap(), 0,pTokenUser);
           goto exit;
      }
      LPTSTR lpSidString(NULL);
      /*Attention here ! You can choose ANSI or Unicode .if Character Union is ANIS ,
      change lpSidString to LPSTR,and use ConvertSidToStringSidA
      then 'COUT' it,not 'WCOUT'
      */
      BOOL bRet=ConvertSidToStringSid(pSID,&lpSidString);
      if(bRet)
           wcout<<lpSidString<<endl;
      exit:
      if(pSID)
           FreeSid(pSID);
      return 0;
}

解决方案3:

下载个例子研究一下

解决方案4:

服务里面不会默认加载HKEY_CURRENT_USER

解决方案5:

系统中的每个用户都有自己的HKEY_CURRENT_USER主键,服务程序默认是system用户身份,与登录用户不同,解决方法大概有三种:
1、安装服务指定用户名和密码;
2、访问HKEY_USERS下用户对应的主键;
3、创建一个用户身份的进程

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 我编写的windows服务究竟有何问题?请不栗次教!

相关文章

  • 2017-06-05 有没有什么方法或者什么工具知道某个文件(比如txt文件)是被哪个进程打开的?
  • 2017-06-05 这个问题,一个星期没搞定。求高手。
  • 2017-06-05 关于MFCDLL的问题,我在NET中调用时提示找不这个入口点,请大家帮忙-50分
  • 2017-06-04 请教,如何给一个应用程序发送键盘消息
  • 2017-06-05 WaitForSingleObject()返回的值问题!
  • 2017-06-04 怎样在vc中创建自己的web控件在html页上可以调用的可嵌入FRAME框架内的控件??比如用MFC做一个可在html页上调用的查询表单提交界面
  • 2017-06-04 在idl文件中引入外部接口的问题
  • 2017-06-05 怎么将一个字符串复制到剪切板上,然后在剪切板上再粘贴到文本框中
  • 2017-06-05 请问串口读写的问题WINCE
  • 2017-06-04 小妹问个菜鸟问题!

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • IDL接口:BYTE传入/传出参数的问题
    • [附图]——如何生成这样的流程图
    • WindowsUpdateAgentAPI中BeginDownload与EndDownload的使用?
    • 关于技术内幕存疑解惑!
    • vc6工程转为vc7时链接出错
    • 见笑了,如何调用ocx中的函数
    • 请教高手:javascript调用BHO中的method,method如何返回字符串?
    • Window线程的消息队列长度是多少?有没有溢出的可能呢?
    • 系统DEBUG报了这样一个错误,请各位看看有没有遇到过!
    • 调用动态链接库有哪些种方法?什么样的动态链接库可以调用?

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有