|
On my local machine are a number of user accounts. When I use either NetUserEnum() or NetQueryDisplayInformation() to get those, I always get a few extra. For example, HelpAssistant and SUPPORT_388945a0.
Here's the code I'm using:
LPUSER_INFO_0 pTmpBuf;
DWORD dwEntriesRead,
dwTotalEntries;
NetUserEnum(NULL, 0, FILTER_NORMAL_ACCOUNT, (LPBYTE *) &pTmpBuf, MAX_PREFERRED_LENGTH, &dwEntriesRead, &dwTotalEntries, NULL);
LPUSER_INFO_0 pBuf = pTmpBuf;
for (; dwTotalEntries > 0; dwTotalEntries--)
{
_tprintf(_T("%s\n"), pBuf->usri0_name);
pBuf++;
}
NetApiBufferFree(pTmpBuf); Any idea how I can exclude those other user accounts?
Thanks.
- DC
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"Man who follows car will be exhausted." - Confucius
|
|
|
|
|
Oh boy! I wish it was that easy to remember what I did almost 10 years back. I have done exactly what you trying to do. The gist of it is
a. Initially you get all the accounts, including the ones you never seen or heard of in the system, some don't even show in the accounts list of the User Control Panel
b. I was trying to get the user names which show in the log on screen ONLY
Then you going to call NetUserGetInfo for every user. I think using level 11, USER_INFO_11 will give more detail about the account including the type. I thought there is somewhere you can query for "interactive?" turned on. By interactive it means the user name can be used to login interactively to the system.
I hope, I could be more helpful, but the thought is killing me. I hope this leads you to the right direction.
|
|
|
|
|
Hello all,
I am detecting deletion of files on the system and to do this i am hooking the NtSetInformationFile function. this gets passed to it the file handle, and from this i need the file name. so i am using the API GetFileInformationByHandleEx to get the file name, But the problem is that the file name comes like this "\sample\a.txt", Now this doesn't give me device name(\device\volume) with File name, so i cannot assume from where the file has been accessed, It could be "C:\sample\a.txt" or "D:\sample\a.txt".
So it's quite clear that i must have "\Device\volume0", "\Device\volume1" etc before the filename, Further googling took me to THIS page where the file name can be retrieved from FileHandle, This uses CreateFileMapping, MapViewOfFile, GetMappedFileName, GetLogicalDriveStrings and QueryDosDevice to retrieve the file name, But when i use it CreateFileMapping fail with error 5 which is "Access Denied", Some more google and i found that the file handle must have GENERIC_READ access else CreateFileMapping will fail.
Now i'm not opening the file, explorer is.. So how could i check with which access explorer opens or access the file or how could i change the dwDesiredAccess..
Thanks All..
|
|
|
|
|
Skimming this MSDN page[^] tells me it isn't really simple, however it also suggests me one could call GetFileInformationByHandleEx more than once, with different values for FileInformationClass, and then combine the results.
|
|
|
|
|
Thanks for the reply, and yes we can call GetFileInformationByHandleEx more than once, But i don't see any value returning the Drive letter or Device name of drive where the file is located in FileInformationClass unless i'm missing something..
|
|
|
|
|
As GetFileInformationByHandleEx won't give me the device name, I'm using GetFileInformationByHandle to get the volume number and hopefully compare the number with drive manually.. But the dwVolumeSerialNumber reurns some garbage value..
BY_HANDLE_FILE_INFORMATION info;
DWORD dwSerialNumber = 0;
if(GetFileInformationByHandle(FileHandle, &info) != 0)
{
dwSerialNumber = info.dwVolumeSerialNumber;
swprintf(szTemp, L"The Volume Serial Number = %d", info.dwVolumeSerialNumber);
MessageBox(NULL, szTemp, L"Success", MB_OK);
}
else
{
swprintf(szTemp, L"GetFileInformationByHandle Error = %d", GetLastError());
MessageBox(NULL, szTemp, L"Success", MB_OK);
}
|
|
|
|
|
I think it's done, I don't know if it's ugly...
I used GetFileInformationByHandleEx to get the truncated file name, GetFileInformationByHandle to get the volume serial number, GetLogicalDriveStrings to get all the drives and GetVolumeInformation to get the volume serial number of all the drives, I then compare volume serial number returned by GetVolumeInformation and GetFileInformationByHandle, If it matches then it concatenate the drive letter with the truncated file name returned by GetFileInformationByHandleEx...
|
|
|
|
|
|
You asked this question a few minutes ago in Q&A. Do *NOT* cross-post.
Software rusts. Simon Stephenson, ca 1994.
|
|
|
|
|
Hello Simon sorry about that this is my first post in this forum ...was just trying to get to know how and where to post...thanks
|
|
|
|
|
That's why we have guidelines everywhere (here[^] for example) which explain the rules; please read them.
It's time for a new signature.
|
|
|
|
|
Hi guys i have a new kind of error , i never seen before . Error Message is - Cannot update Program database "e:\ganesh_projects\Framework\Framework\debug\vc90.pdp . I am a fresher so any one tell what the problem is ?
|
|
|
|
|
Clean / rebuild, and you will most likely be fine.
|
|
|
|
|
As you know, if the call to LoadLibrary specifies a DLL module already mapped into the address space of the calling process, the function simply returns a handle of the DLL and increments the module's reference count.
Somewhere, I need to get the reference count od a dll. How to get the dll's reference count? Thanks.
|
|
|
|
|
|
|
well, did you try it? what was the outcome?
|
|
|
|
|
I am trying to convert float to text.
the reason i am doing this is because the float contains 0.09999987 and i want that variable as 0.10 and then compare it to other float which is initially 0.10000
if anyone have idea how to convert float to text let me know
thx,
cheers from Canada.
|
|
|
|
|
|
You should not be trying to do this; float/double values are inherently imprecise so two variables which nominally contain the same value will not necessarily be exactly the same. This is due to the binary representation of floating point numbers. There are many papers on the internet including this one[^] that deal with it.
It's time for a new signature.
|
|
|
|
|
You need to compare the difference to some epsilon. Check float.h for DBL_EPSILON or FLT_EPSILON .
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"Man who follows car will be exhausted." - Confucius
|
|
|
|
|
thx all for your support..
nvm it i solved it ..stupid ME ...
just added this method:
bool classname::isStringEquals(float fNewNumber,float fOldNumber)
{
CString value1;
CString value2;
value1.Format( _T("%.4f"), fNewNumber);
value2.Format( _T("%.4f"), fOldNumber);
if(value1==value2)
return true;
else
return false;
cheers from canada
|
|
|
|
|
|
How am i killing performance, well all i wanted to check is if the other float value is close or 0.10 and that code does check that i cannot use greater or less than since both float can be changed might be >0 or <0 , so rounding off values check if it's close to 0.10 or not because i do not have problem in my math if value if 0.0999978 or 0.10 both will give me same answer since it just checks value and then do not use them for any calculation, i will paste my code later on here and then you can have a look at it and you might be able to give me better suggestion,
thx for reply tho
cheers from canada.
|
|
|
|
|
Performance is killed because CString will new and delete memory to hold the chars for both instances.
If this is in a highly used piece of code, you could fragment the heck out of your heap.
The Epsilon isEqualish(float, float, float) approach is the best.
An alternative would be to use a Fixed Point numeric class that would exactly represent a decimal value, but that might also have performance implications. It all depends on what you are doing.
Skip the CString.Format even though it seems convenient.
|
|
|
|