Hi,
I'm trying to eliminate the last 2 vb scripts from my programs.
Script 1 creates a new windows user account
Script 2 gets the day of week number - the msdn site tells you Sunday = 1, Monday = 2 etc.
I have searched the forum but I cannot find any examples I can work from.
Does anyone have any examples for these two.
Thanks,
Best wishes,
Andy.
			
			
			
				This should get you over the hump on day of the week.
Posted by celphick in May 2004
/************************************************
 *    Example of use of Ibasic Pro subroutine    *
 *    to calculate Day of Week from ISO Date     *
 *           Using Zeller's Congruence           *
 *                                               *
 *    Returns 0=Sun, 1=Mon, 2=Tue, ... 6=Sat     *
 *                                               *
 *************************************************/
openconsole
DECLARE zeller(ISOd : string),int
def dow : int
def ISOdate : string
INPUT "Enter ISO Date: yyyymmdd : ", ISOdate
dow = zeller(ISOdate)
PRINT MID$("Sunday   Monday   Tuesday  WednesdayThursday Friday   Saturday ", dow*9+1,9)
do : until inkey$<>""
closeconsole
end
sub zeller(ISOd : string),int
def y, m, d, day : int
y = val(left$(ISOd,4))
m = val(mid$(ISOd,5,2))
d = val(right$(ISOd,2))
if (m < 3)
   y = y - 1
    m = m + 12
ENDIF
day = ((13*M+3)/5+D+Y+Y/4-Y/100+y/400+1)
day = int(day%7)
return day
endsub
LarryMc
			
			
			
				Thanks Larry,
That works great for day of week I can use that, any ideas about creating a new windows user account ?
Many many Thanks,
Andy.
			
			
			
				This is a user creation part of my proxy spider:$include "windowssdk.inc"
$include "lm.inc"
$include "Userenv.inc"
$define USER_NAME    L"WebProxyUser"
$define PASSWORD     L"WebProxyUser"
$define DESCRIPTION  L"Restricted Proxy-Tester User"
$define USER_FLAGS   UF_SCRIPT | UF_PASSWD_CANT_CHANGE | UF_DONT_EXPIRE_PASSWD | UF_NORMAL_ACCOUNT
sub create_user()
	iwstring wszProfilesDir[MAX_PATH]
	DWORD cch = MAX_PATH
	GetProfilesDirectoryW(wszProfilesDir, &cch)
	lstrcatW(wszProfilesDir, L"\WebProxyUser")
	USER_INFO_1 ui
	ui.usri1_name         = USER_NAME
	ui.usri1_password     = PASSWORD
	ui.usri1_password_age = 0
	ui.usri1_priv         = USER_PRIV_USER ' guest/user/admin
	ui.usri1_home_dir     = wszProfilesDir ' can be null
	ui.usri1_comment      = DESCRIPTION    ' can be null
	ui.usri1_flags        = USER_FLAGS
	ui.usri1_script_path  = 0
	cch                   = len(ui)
	NET_API_STATUS status = NetUserAdd(NULL, 1, &ui, &cch)
	select (status)
		case ERROR_ACCESS_DENIED:
			MessageBoxW(0, L"NetUserAdd: The user does not have access to the requested information")
		case NERR_InvalidComputer:
			MessageBoxW(0, L"NetUserAdd: The computer name is invalid")
		case NERR_NotPrimary:
			MessageBoxW(0, L"NetUserAdd: The operation is allowed only on the primary domain controller of the domain")
		case NERR_GroupExists:
			MessageBoxW(0, L"NetUserAdd: The group already exists")
		case NERR_PasswordTooShort:
			MessageBoxW(0, L"NetUserAdd: The password is shorter than required")
		case NERR_UserExists:
			' success
		case NERR_Success:
			' success, optionally run ie4uinit.exe to initialize sounds
			STARTUPINFOW si
			PROCESS_INFORMATION pi
			ZeroMemory(&si, len(si))
			si.cb = len(si)
			GetSystemDirectory(wszProfilesDir, MAX_PATH)
			if (CreateProcessWithLogonW(USER_NAME, L".", PASSWORD, LOGON_WITH_PROFILE, NULL, L"ie4uinit.exe", 0,0, wszProfilesDir, &si, &pi))
				CloseHandle(pi.hProcess)
				CloseHandle(pi.hThread)
			endif
	endselect
endsub
			
			
			
				Thanks sapero,
will give it a go
Best wishes,
Andy.
			
			
			
				Hi sapero,
I have tried to get the code to work but I have some problems with it.
Sizeof(ui)  undefined error when I compile the code so I replaced sizeof(ui) with a number 260
Also, probably a stupid question but I assume you need to call the Create_User subroutine
e.g. Create_User()  or Create_User(USER_NAME,PASSWORD ...........etc) ?
am I doing this wrong as no new users have been created, have tried all day yesterday - help!
do you have to set the new user account as 'active' ?
Thanks,
Andy.
			
			
			
				Sorry, replace sizeof with len.
The new account is created, and you can use it with the CreateProcessWithLogonW api, or right clicking a file / run as.
If you execute NET USER from command prompt, the new user will be listed there.
If you want the user to be listed in welcome screen, add its name to HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList, and set the value (REG_DWORD) to 1.
			
			
			
				Thanks, it's working now thats great!
just one last question - how do set the account to an Administrator account at the moment it creates guest accounts only ?
do I change USER_PRIV_USER or UF_NORMAL_ACCOUNT and if so to what ?
Thanks,
Andy.
			
			
			
				Add the user to administrator group:
sub MakeUserAdmin(wstring pszUserName),BOOL
'	SID_IDENTIFIER_AUTHORITY siaNT = SECURITY_NT_AUTHORITY
	PSID pSidAdmins = NULL
	BOOL bOk
	for bOk=0 to 0
		' initialize well-known SID of the local administrators group
'		if (!AllocateAndInitializeSid(&siaNT, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, _
		if (!AllocateAndInitializeSid(&SECURITY_NT_AUTHORITY, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, _
			0, 0, 0, 0, 0, 0, &pSidAdmins))
			breakfor
		endif
		iwstring szGroupName[UNLEN + 1]
		iwstring szDomainName[DNLEN + 1]
		ULONG cchGroupName = UNLEN + 1
		ULONG cchDomainName = DNLEN + 1
		SID_NAME_USE Use
		' convert SID to the localized name of the group
		if (!LookupAccountSidW(NULL, pSidAdmins, szGroupName, &cchGroupName, szDomainName, &cchDomainName, &Use))
			 breakfor
		endif
		' prepare user name
		LOCALGROUP_MEMBERS_INFO_3 info
		info.lgrmi3_domainandname = pszUserName
		' add the user to the administrators group
		if (NetLocalGroupAddMembers(NULL, szGroupName, 3, &info, 1))
			 breakfor
		endif
	next bOk
	if (pSidAdmins) then FreeSid(pSidAdmins)
	return bOk
endsub :)
			
			
			
				Thanks sapero,
will try it tomorrow.
Thanks again,
Andy.
			
			
			
				Tomorrow will be too late!
			
			
			
				Hi sapero,
Sorry I couldn't try this one until today, was very late when I replied and couldn't get onto the forum until just now.
And sorry again for being a pain but I get 2 errors when compiling:
   SID_IDENTIFIER_AUTHORITY siaNT = SECURITY_NT_AUTHORITY
   PSID pSidAdmins = NULL
syntax error "="
also, do I need any include files etc.
Thanks,
Andy.
			
			
			
				Andy, use the same includes as in the previous example, you don't need anything more.
			
			
			
				Yes, thanks sapero, tried with the include files but I still have problems with the code.
Think it's me not being very bright today, tried to rework the code but now i'm getting another error line 42 'no appropriate conversion exists'.
      if (NetLocalGroupAddMembers(NULL, szGroupName, 3, &info, 1))
reworked code:
$include "windowssdk.inc"
$include "lm.inc"
$include "Userenv.inc"
sub MakeUserAdmin(wstring pszUserName),BOOL
        siaNT = SECURITY_NT_AUTHORITY
   SID_IDENTIFIER_AUTHORITY = siaNT
   PSID pSidAdmins 
        pSidAdmins = NULL
   BOOL bOk
   for bOk=0 to 0
      ' initialize well-known SID of the local administrators group
      if (0=AllocateAndInitializeSid(&siaNT, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, _
         0, 0, 0, 0, 0, 0, &pSidAdmins))
         breakfor
      endif
      iwstring szGroupName[UNLEN + 1]
      iwstring szDomainName[DNLEN + 1]
      ULONG cchGroupName 
        cchGroupName = UNLEN + 1
      ULONG cchDomainName 
        cchDomainName = DNLEN + 1
      SID_NAME_USE Use
      ' convert SID to the localized name of the group
      if (0=LookupAccountSidW(NULL, pSidAdmins, szGroupName, &cchGroupName, szDomainName, &cchDomainName, &Use))
          breakfor
      endif
      ' prepare user name
      LOCALGROUP_MEMBERS_INFO_3 info
      info.lgrmi3_domainandname = pszUserName
      ' add the user to the administrators group
      if (NetLocalGroupAddMembers(NULL, szGroupName, 3, &info, 1))
          breakfor
      endif
   next bOk
   if (pSidAdmins) then FreeSid(pSidAdmins)
   return bOk
endsub
also, have I done this right:
        siaNT = SECURITY_NT_AUTHORITY
   SID_IDENTIFIER_AUTHORITY = siaNT
   PSID pSidAdmins 
        pSidAdmins = NULL
Just lost on this one.
Thanks,
Andy.
			
			
			
				Ok, I know what is going on. The siaNT variable was actually a structure, and the first assignment in MakeUserAdmin is not supported in EBasic compiler older than 2.0.
Just remove the line with SID_IDENTIFIER_AUTHORITY siaNT definition, and the other siaNT passed to AllocateAndInitializeSid, replace with SECURITY_NT_AUTHORITY (see my previous post).
This code was found in Google, so I just converted it, tested and posted here, but didn't noticed that it duplicates SECURITY_NT_AUTHORITY structure.
			
			
			
				Hi sapero,
I know i'm probably becoming a pain in the you know what but I did what you said, I have cleared all errors except now get 5 errors on the line
      if (NetLocalGroupAddMembers(NULL, szGroupName, 3, &info, 1))
'no appropriate conversion exsists' for all 5 parameters passed to this statement.
Any ideas?
Thanks,
Andy.
			
			
			
				Andy, this is a bug in lmaccess.inc file:
declare import, NetLocalGroupAddMembers(_LPCWSTR servername, _LPCWSTR groupname, _DWORD level, _pointer buf, _DWORD totalentries),intIf you edit this file and remove the (invalid) pre-underscores, it will compile.
You could also keep it as is, and add the following after the last $include statement in your program:
$undeclare NetLocalGroupAddMembers ' undefine it
' and then define again
declare import, NetLocalGroupAddMembers(LPCWSTR servername, LPCWSTR groupname, DWORD level, pointer buf, DWORD totalentries),intIn the new, not yet released compiler, the STRICT option will notify you about such bugs/typos.
QuoteWarning: Unknown argument type: "_LPCWSTR", assuming INT
			
				Fantastic !!!!! it works.
Thank you so very much for all your help this was a sticky one for me - again many thanks.
Thanks,
Andy.
 :)
			
			
			
				Just one last question 
How can I change the code from a set user name / password to one where the user can pick a username and password?
Thanks,
Andy.
			
			
			
				You need to ask again, I/we need precise questions :) I have 100 answers for your question, each answer assumes something.
Which names, passwords, and where do you want to list, then what to do with the selected items?
			
			
			
				Sorry,
I was wondering instead of creating a fixed username and password, if the user can type in the name / password they want
In other words how could I pass these two parameters to the lines
$define USER_NAME    L"WebProxyUser"
$define PASSWORD     L"WebProxyUser"
so changing L"WebProxyUser" to what ever they have entered.
Thanks,
Andy.
			
			
			
				OK, completed!
Below is the code that will 
1 - ask for a new account name
2 - ask for a password
3 - create the account (as an administrator)
4 - make the account active
5 - adds the new account to the windows login screen.
Don't forget to do this first:
lmaccess.inc file:
change:
declare import, NetLocalGroupAddMembers(_LPCWSTR servername, _LPCWSTR groupname, _DWORD level, _pointer buf, _DWORD totalentries),int
to:
declare import, NetLocalGroupAddMembers(LPCWSTR servername, LPCWSTR groupname, DWORD level, pointer buf, DWORD totalentries),int
Now here is the program:
$INCLUDE "Registry.inc"
$include "windowssdk.inc"
$include "lm.inc"
$include "Userenv.inc"
DEF USER_NAME,PASSWORD,DESCRIPTION:string 
OPENCONSOLE
INPUT "Please enter a username " ,USER_NAME 
un2= S2W(USER_NAME)
INPUT "Please enter a password " ,PASSWORD 
pw2= S2W(PASSWORD)
INPUT "Please enter a description " ,DESCRIPTION 
desc2= S2W(DESCRIPTION)
PRINT
PRINT "Please wait a moment ...."
$define un2
$define pw2     
$define desc2
$define USER_FLAGS   UF_SCRIPT | UF_DONT_EXPIRE_PASSWD | UF_NORMAL_ACCOUNT
'$define USER_FLAGS   UF_SCRIPT | UF_PASSWD_CANT_CHANGE | UF_DONT_EXPIRE_PASSWD | UF_NORMAL_ACCOUNT
create_user()
MakeUserAdmin(un2)
MakeActive()
END
sub create_user()
	iwstring wszProfilesDir[MAX_PATH]
	DWORD cch 
    cch = MAX_PATH
	GetProfilesDirectoryW(wszProfilesDir, &cch)
	lstrcatW(wszProfilesDir, un2)
	USER_INFO_1 ui
	ui.usri1_name         = un2
	ui.usri1_password     = pw2
	ui.usri1_password_age = 0
	ui.usri1_priv         = USER_PRIV_USER ' guest/user/admin
	ui.usri1_home_dir     = wszProfilesDir ' can be null
	ui.usri1_comment      = desc2          ' can be null
	ui.usri1_flags        = USER_FLAGS
	ui.usri1_script_path  = 0
	cch                   = LEN(ui)
	NET_API_STATUS status
    status = NetUserAdd(NULL, 1, &ui, &cch)
	select (status)
		case ERROR_ACCESS_DENIED:
			MessageBoxW(0, L"NetUserAdd: The user does not have access to the requested information")
		case NERR_InvalidComputer:
			MessageBoxW(0, L"NetUserAdd: The computer name is invalid")
		case NERR_NotPrimary:
			MessageBoxW(0, L"NetUserAdd: The operation is allowed only on the primary domain controller of the domain")
		case NERR_GroupExists:
			MessageBoxW(0, L"NetUserAdd: The group already exists")
		case NERR_PasswordTooShort:
			MessageBoxW(0, L"NetUserAdd: The password is shorter than required")
		case NERR_UserExists:
			' success
			MessageBoxW(0, L"This user name has already been used.") 
		case NERR_Success:
			MessageBoxW(0, L"The new user account was created successfully.") 
			' success, optionally run ie4uinit.exe to initialize sounds
			STARTUPINFOW si
			PROCESS_INFORMATION pi
			ZeroMemory(&si, len(si))
			si.cb = len(si)
			GetSystemDirectory(wszProfilesDir, MAX_PATH)
			if (CreateProcessWithLogonW(un2, L".", pw2, LOGON_WITH_PROFILE, NULL, L"ie4uinit.exe", 0,0, wszProfilesDir, &si, &pi))
				CloseHandle(pi.hProcess)
				CloseHandle(pi.hThread)
			endif
	endselect
endsub
sub MakeUserAdmin(wstring pszUserName),BOOL
'	SID_IDENTIFIER_AUTHORITY siaNT = SECURITY_NT_AUTHORITY
	PSID pSidAdmins
    pSidAdmins = NULL
	BOOL bOk
	for bOk=0 to 0
		' initialize well-known SID of the local administrators group
		if (0=AllocateAndInitializeSid(&SECURITY_NT_AUTHORITY, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, _
			0, 0, 0, 0, 0, 0, &pSidAdmins))
			breakfor
		endif
		iwstring szGroupName[UNLEN + 1]
		iwstring szDomainName[DNLEN + 1]
		ULONG cchGroupName
        cchGroupName = UNLEN + 1
		ULONG cchDomainName
        cchDomainName = DNLEN + 1
		SID_NAME_USE Use
		' convert SID to the localized name of the group
		if (0=LookupAccountSidW(NULL, pSidAdmins, szGroupName, &cchGroupName, szDomainName, &cchDomainName, &Use))
			 breakfor
		endif
		' prepare user name
		LOCALGROUP_MEMBERS_INFO_3 info
		info.lgrmi3_domainandname = pszUserName
		' add the user to the administrators group
		if (NetLocalGroupAddMembers(NULL, szGroupName, 3, &info, 1))
			 breakfor
		endif
	next bOk
	if (pSidAdmins) then FreeSid(pSidAdmins)
	return bOk
endsub
SUB MakeActive()
SYSTEM "cmd.exe" , "/c net user Safeuser /active:yes"
sleep(1000)
result = RegSetDWValue("HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList", 1, "Safeuser")
RETURN
ENDSUBTested on XP pro and Win 7
Will post this again in the user offerings section as well.
Special thanks to sapero who did most of this work.
Regards,
Andy.
			
			
			
				I forgot that I had edited the Windowssdk.inc file.
Open it and edit the line
$include "winreg.inc"  to ' $include "winreg.inc" (commented out) or just delete it.
As for the warnings - they appear because some variable have not been set an initial value
Just forget about them.
Once you have edited the Windowssdk.inc file it should compile.
sapero has given an alternative:
add the following before $include windowssdk.inc
Code:
$define __winreg_inc__
After you define this condition, winreg.inc will be "excluded" from compilation, because it has an $ifndef at the beginning.
			
			
			
				We really don't need to be maintaining identical topics in two different places. ;)
LarryMc
			
			
			
				Hi Larry,
sorry if I have caused you some work but you have been very good to me in answering my questions, perhaps if you are maintaining this site then you could answer my previous question - until now no replies.
I will be buying IWBasic in the next few weeks, and probably some add ons, currently i'm on a free version of Ebasic.
Does the IW site take payments with Maestro? or do I have to get my friend to use his Visa card?
Also with the recent hack (don't know why anyone would do that) is it still safe to pay online or are there other ways to pay.
AND to you and everone who has helped me over the last few months - Many thanks.
Thanks,
Andy. :)
			
			
			
				QuoteDoes the IW site take payments with Maestro?
no
Quoteor do I have to get my friend to use his Visa card?
yes
QuoteAlso with the recent hack (don't know why anyone would do that) is it still safe to pay online or are there other ways to pay.
that is a separate part and it wasn't touched, so it is safe.
Don't purchase IWB until ver 2.0 comes out which will be real soon.
LarryMc
			
 
			
			
				
Thanks Larry
will wait unil version 2 comes out.
Thanks again for all your help
Andy.
 :)