做一个服务程序,但是在程序中读取注册表,不能读出?请教原因!(100分)

  • 主题发起人 wangwei200208
  • 开始时间
W

wangwei200208

Unregistered / Unconfirmed
GUEST, unregistred user!
读去注册表程序在普通应用程序中测试通过!
请问如何在服务程序中读取注册表?
 
可能和权限有关,先取得管理员权限试试
 
如何取得管理员权限?
服务是运行在服务器控制台注销的状态下的!!
 
未登陆好象不能读注册表,很多的文件网络操作都不允许的.
 
我想读入设置信息!采用其他办法怎么办呢?
 
你试一下能不能读文件,如果不能那可能比较难解决.也可能是权限问题.
 
看看这里,也许可以帮你的忙。

http://expert.csdn.net/Expert/topic/1176/1176692.xml?temp=.2631952
 
delphi下不能通过!!请举例说明好吗?
 
delphi下不能通过!!请举例说明好吗?
 
非常抱歉,我对Delphi不熟悉,这个无法帮你。
 
同意大家的观点,权限问题!
 
如何获取权限呢?详细一些好吗!!
 
找找资料把,这个方面的操作比较麻烦,要设置一些结构,调用几个函数
 
这个问题已经找了很久,没有答案
找到的资料中都需要用户名和密码,但是把用户名密码放到程序中还有什么意义呢!
另外,我获得的用户是SYSTEM,这个用户可以访问那类注册表项,有人知道吗?
 
人们一般都欣赏“授人以鱼,不如授人以渔”这句话,
但是楼主好像对“授人以渔,不如授人以鱼”更感兴趣!

我上面提到的那个贴子已经给出了实现的方法,你却还一定要代码!
好吧,下面就是代码。但是是C++的,不要叫我帮你转换成Delphi啊,
那样你不如杀可我!如果你实在看不懂,就叫老大“copy_paste”帮你转换吧。
如果在这里找不到他,就到CSDN的C++Builder版下面发贴找他。

不过他最近好像很郁闷,不知道是否有心情帮你转换.........

如果你想知道下面这些代码的具体工作原理,请参考MSDN“Winbase/Security”下面的内容。

===================================
在NT/2000/XP中,针对每一个用户,系统都使用一个描述文件来描述该用户的配置信息,
比如桌面、网络等,这个文件名称为NTUSER.DAT。当一个用户以交互式登陆时,系统自动
装载这个用户的描述文件的内容到HKEY_USERS/User' SID注册表键下面,并且把HKEY_CURRENT_USER
映射到HKEY_USERS/User' SID,这样用户对注册表键HKEY_CURRENT_USER的操作将自动重
新映射为对HKEY_USERS/User' SID的操作。换句话说:对注册表键HKEY_USERS/User' SID
的操作也将自动影响HKEY_CURRENT_USER的下面的值。

当某个用户由于特殊原因没有描述文件时,则对KHEY_CURRENT_USER的操作将自动重新映
射为对HKEY_USERS/.DEFAULT注册表键的操作。
===================================

void ReadRegAtService()
{
HANDLE hToken;
HANDLE hProcess;

hProcess = OpenProcess(PROCESS_ALL_ACCESS,false,GetPIDFromName("Explorer.Exe"));
if(hProcess == NULL)
{
MessageBox(NULL,AnsiString("Error Opening Process").c_str(),NULL,MB_OK | MB_APPLMODAL | MB_ICONWARNING | MB_SERVICE_NOTIFICATION);
return 0;
}

if(OpenProcessToken(hProcess,TOKEN_ALL_ACCESS,&hToken) == 0)
{
MessageBox(NULL,AnsiString("Error Opening Process Token.Err = " + SysErrorMessage(GetLastError())).c_str(),NULL,MB_OK | MB_APPLMODAL | MB_ICONWARNING | MB_SERVICE_NOTIFICATION);
return 1;
}

//
// 模拟当前登陆用户
//
if(ImpersonateLoggedOnUser(hToken) == 0)
{
MessageBox(NULL,AnsiString("Error Calling ImpersonateLoggedOnUser.Err = " + SysErrorMessage(GetLastError())).c_str(),NULL,MB_OK | MB_APPLMODAL | MB_ICONWARNING | MB_SERVICE_NOTIFICATION);
return 0;
}

//////

HKEY hKey;
HKEY hSubKey;
long Ret;

char LogonUserSidKeyBuf[256];
DWORD dwBufLen = sizeof(LogonUserSidKeyBuf);

//
// 得到当前登陆用户的SID的字符串形式
//
GetUserTextualSid(true,NULL,LogonUserSidKeyBuf,&dwBufLen);

Ret = RegOpenKey(HKEY_USERS,LogonUserSidKeyBuf,&hKey);
if(Ret != ERROR_SUCCESS)
{
MessageBox(NULL,AnsiString("Error Opening Key 11.Err = " + SysErrorMessage(Ret)+ " Hex = " + IntToHex((int)Ret,8)).c_str(),NULL,MB_OK | MB_APPLMODAL | MB_ICONWARNING | MB_SERVICE_NOTIFICATION);
return 0;
}

Ret = RegOpenKey(hKey,"Software//Adobe//Photoshop//6.0",&hSubKey);

if(Ret != ERROR_SUCCESS)
{
MessageBox(NULL,AnsiString("Error Opening Key 22.Err = " + SysErrorMessage(Ret)+ " Hex = " + IntToHex((int)Ret,8)).c_str(),NULL,MB_OK | MB_APPLMODAL | MB_ICONWARNING | MB_SERVICE_NOTIFICATION);
}
else
{
DWORD dwType = REG_DWORD;
DWORD dwData;
DWORD dwSize = sizeof(DWORD);

Ret = RegQueryValueEx(hSubKey,"MemoryUsage",0,&dwType,(LPBYTE)&dwData,&dwSize);
if(Ret != ERROR_SUCCESS)
{
MessageBox(NULL,AnsiString("Error reading Value.Err = " + SysErrorMessage(Ret)).c_str(),NULL,MB_OK | MB_APPLMODAL | MB_ICONWARNING | MB_SERVICE_NOTIFICATION);
}
else
{
MessageBox(NULL,AnsiString("OK.Value = " + IntToStr(dwData)).c_str(),NULL,MB_OK | MB_APPLMODAL | MB_ICONWARNING | MB_SERVICE_NOTIFICATION);
}
}

RegCloseKey(hKey);
RegCloseKey(hSubKey);

CloseHandle(hToken);
CloseHandle(hProcess);

RevertToSelf();
}

==============

// 辅助函数

//
// 通过进程名称得到进程的ID(这里使用方法Toolhelp函数,因此在NT上无法使用,当然也
// 可以PSAPI函数,这样就可以在NT上使用了)
//
DWORD __fastcall GetPIDFromName(AnsiString ProcName)
{
HANDLE hSnapshot;
PROCESSENTRY32 ProcStruct;
DWORD ProcessID = -1;
bool Result;

hSnapshot = CreateToolhelp32Snapshot((DWORD)TH32CS_SNAPPROCESS,0);
ProcStruct.dwSize = sizeof(PROCESSENTRY32);

Result = Process32First(hSnapshot,&ProcStruct);
while(Result)
{
if(AnsiString(ProcStruct.szExeFile).LowerCase().Pos(ProcName.LowerCase()) > 0)
{
ProcessID = ProcStruct.th32ProcessID;
break;
}
Result = Process32Next(hSnapshot,&ProcStruct);
}
CloseHandle(hSnapshot);

return ProcessID;
}

//
// 查询用户的SID并转换为字符串形式
//
bool __fastcall GetUserTextualSid(
bool IsQueryCurrentLogonUser,
LPTSTR TargetUserName,
LPTSTR lpTextualSid,
LPDWORD lpBufferLength
)
{
char AdminSidBuf[128];
PSID AdminSid = (PSID)AdminSidBuf;
DWORD AdminSidSize = 128;

char DomainName[128];
DWORD DomainNameSize = 128;
SID_NAME_USE SidType;

char CurrentUserName[32];
DWORD dwNameLen = 32;

//////////
if(IsQueryCurrentLogonUser)
{
GetUserName(CurrentUserName,&dwNameLen);
}
else
{
lstrcpy(CurrentUserName,TargetUserName);
CurrentUserName[lstrlen(TargetUserName)] = '/0';
}

LookupAccountName(NULL,CurrentUserName,AdminSid,&AdminSidSize,DomainName,&DomainNameSize,&SidType);

return GetTextualSid(AdminSid,lpTextualSid,lpBufferLength);
}
//---------------------------------------------------------------------------
//
// 把一个二进制的SID转换为字符串形式,这个函数是从MSDN上面拷贝过来的。
//
bool __fastcall GetTextualSid(PSID pSid,LPTSTR TextualSid,LPDWORD lpdwBufferLen)
{
PSID_IDENTIFIER_AUTHORITY psia;
DWORD dwSubAuthorities;
DWORD dwSidRev=SID_REVISION;
DWORD dwCounter;
DWORD dwSidSize;

//
// Validate the binary SID.
//
if(!IsValidSid(pSid))
return FALSE;

//
// Get the identifier authority value from the SID.
//
psia = GetSidIdentifierAuthority(pSid);

//
// Get the number of subauthorities in the SID.
//
dwSubAuthorities = *GetSidSubAuthorityCount(pSid);

//
// Compute the buffer length.
// S-SID_REVISION- + IdentifierAuthority- + subauthorities- + NULL
//
dwSidSize = (15 + 12 + (12 * dwSubAuthorities) + 1) * sizeof(TCHAR);

//
// Check input buffer length.
// If too small, indicate the proper size and set last error.
//
if(*lpdwBufferLen < dwSidSize)
{
*lpdwBufferLen = dwSidSize;
SetLastError(ERROR_INSUFFICIENT_BUFFER);
return false;
}

//
// Add 'S' prefix and revision number to the string.
//
dwSidSize = wsprintf(TextualSid, TEXT("S-%lu-"), dwSidRev );

//
// Add SID identifier authority to the string.
//
if((psia->Value[0] != 0) || (psia->Value[1] != 0) )
{
dwSidSize += wsprintf(TextualSid + lstrlen(TextualSid),
TEXT("0x%02hx%02hx%02hx%02hx%02hx%02hx"),
(USHORT)psia->Value[0],
(USHORT)psia->Value[1],
(USHORT)psia->Value[2],
(USHORT)psia->Value[3],
(USHORT)psia->Value[4],
(USHORT)psia->Value[5]
);
}
else
{
dwSidSize += wsprintf(TextualSid + lstrlen(TextualSid),
TEXT("%lu"),
(ULONG)(psia->Value[5] ) +
(ULONG)(psia->Value[4] << 8) +
(ULONG)(psia->Value[3] << 16) +
(ULONG)(psia->Value[2] << 24)
);
}

//
// Add SID subauthorities to the string.
//
for (dwCounter=0 ; dwCounter < dwSubAuthorities ; dwCounter++)
{
dwSidSize += wsprintf(TextualSid + dwSidSize, TEXT("-%lu"),
*GetSidSubAuthority(pSid, dwCounter)
);
}

return true;
}
//---------------------------------------------------------------------------
 
要看你的服务程序以什么用户身份运行?一般是以系统用户身份运行,那么它和你的登录用户一般不一样,所以你如果读HKEY_CURRENT_USER下的是读不到的(因为不同用户),只能读HKEY_LOCAL_MACHINE,但如果不是本地系统用户,则有可能又没有权限读HKEY_LOCAL_MACHINE,检查一下吧。
 
没有满意的答案!!!不愿太长时间结贴!!还是给分了吧!!
一视同仁,全部20
 
多人接受答案了。
 
顶部