为什么在服务编程中 有些API无效? 而普通MFC程序没问题?

光谷中心城打工人 2013-07-17 09:23:05

int MappingNetDriver()
{
// TODO: 在此添加控件通知处理程序代码
char buf[256];

NETRESOURCE nr;
DWORD res;
TCHAR szUserName[32] = "",
szPassword[32] = "",
szLocalName[32] = "S:",
szRemoteName[MAX_PATH] = "\\\\192.168.169.1\\huaxiayou";

//FindUnusedDriver(szLocalName);
// Assign values to the NETRESOURCE structure.
//
nr.dwType = RESOURCETYPE_ANY;
nr.lpLocalName = szLocalName;
nr.lpRemoteName = szRemoteName;
nr.lpProvider = NULL;
//
// Call the WNetAddConnection2 function to assign
// a drive letter to the share.
//
res = WNetAddConnection2(&nr, NULL, NULL, FALSE);

if(NO_ERROR == res)
{
::MessageBox(NULL, "连接成功。", "",
MB_OK|MB_SERVICE_NOTIFICATION);

}
else
{
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
NULL, GetLastError(), 0, buf, sizeof(
buf), 0);
::MessageBox(0, buf, "", MB_SERVICE_NOTIFICATION);

}
return 0;
}



在服务程序中调用发现不能映射,普通MFC对话框程序可以。 我在另外一个别人写的服务程序中使用此函数也不行。

另外。

GetDriveType 在服务中和在普通程序中的结果有问题,比如 网络驱动器Z 的检测,服务中返回的 1(无效路径); 普通程序返回则是4(网络磁盘)

是权限问题?很奇怪呢。。。请教大家!
...全文
151 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
搞定了,这里说下解决方法。 1 可以获取用户用户名密码的情况下 可以 在CreateService 的时候最后两个参数天上用户名密码 这样服务就是在此用户的回话环境中,否则在system环境下运行。 2 关键功能,比如楼主 映射驱动器 和 断开驱动器的功能写在一个单独的小程序里面,在服务中使用CreateProcessAsUser 来调用此小程序。 此函数需要一个令牌 。怎么获取请百度搜索此函数,网上有 采用的是枚举系统进程获取“EXPLORER.EXE”的token的方法 好了。结贴!
  • 打赏
  • 举报
回复
然来是因为 会话环境的问题 服务运行在system 回话下,普通程序运行在当前登陆用户回话下。 但怎么解决呢?网上有些相同的帖子,没有看到比较好的解决方法。

16,471

社区成员

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

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

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