Here is some JSL that I wrote for getting the username from the system. This worked in JMP 10, running on Windows 7.
dll = Load DLL( "mpr.dll" );
dll << DeclareFunction(
"WNetGetUserA",
Convention( STDCALL ),
Alias ( "GetUserName" ),
Arg( UInt8, "format", input ),
Arg( AnsiString, "username", output ),
Arg( UInt64, "length", update ),
Returns( UInt32 )
);
username = " ";
unlen = length(username);
result = dll << GetUserName(0, username, unlen);
show(username);
dll << UnloadDLL();
First, you need to load the system DLL. I didn't have any luck with Advapi32.dll. But I found what I needed with mpr.dll. Notice I didn't need to specify a path to the DLL since it was on my system path.
dll = Load DLL("mpr.dll");
Next, you need to declare any method that you are going to call in the DLL. The method I want to use is actually called WNetGetUserA(), but by defining an alias, I can simply call it using GetUserName().
dll << DeclareFunction(
"WNetGetUserA",
Convention( STDCALL ),
Alias ( "GetUserName" ),
Arg( UInt8, "format", input ),
Arg( AnsiString, "username", output ),
Arg( UInt64, "length", update ),
Returns( UInt32 )
);
Now I want to define the variables that I am going to pass in as arguments. I create a username and initialize it to blanks. Then I use the length() function in JMP to get the current length of the buffer I just created.
username = " " ;
unlen = length(username);
Now I can call the function. Notice the first argument is input only, so I just use a constant instead of defining a variable. Then the show() command shows my username after making the call.
result = dll << GetUserName(0, username, unlen);
show(username);
Finally, I am done so I clean up.
dll << UnloadDLL();
I hope this works for you. If you come up with a better way, please let us know.
By the way, using loadDLL only works on Windows. It isn't supported on the Mac. For that reason I do a check at the top of my script.
Names Default To Here( 1 );
If( Host is( Mac ),
Print( "Sorry, this script is not supported on Mac." );
Stop();
);
Enjoy,
JohnP
I need to get the computer user name and store it in a column of a datatable.I am using following script -
uname = Get Environment Variable( "COMPUTERNAME" );
dt:user = uname;
where dt is the data table and user is the name of the column.
But I get the following error -
"Cannot set value for the column 'user' because the row number (-1) is not valid."
Can someone pls tell me what is wrong here?
You have to tell JMP which row in the data table for column User you want to save the value to.
uname = Get Environment Variable( "COMPUTERNAME" );
dt:user[1] = uname;
The above would save the value of "uname" to row 1 value for column "user"
It works.But what if I have 10 rows and want to have uname ina ll rows?
Do I use a for loop?
You can use a For() Loop, or you could do something like the below:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Consumer Preferences.jmp" );
uname = Get Environment Variable( "COMPUTERNAME" );
dt << New Column( "User", character, set each value( uname ) );
This worked for me to get the current user name on Windows:
uname = Get Environment Variable( "USERNAME" );