- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎01-16-2024 02:19 AM
I have a requirement to tracking last user login included:
- User name
- IP Address
- Date/Time login
How can I storage this information and show this information in Service Portal page?
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎01-22-2024 06:21 AM
Hi Atul,
Thank you for your reply. I got the solution for me. Below is my Solution
Create a Widget and add it to the Service Portal
Here is my script in the widget:
HTML
<div class="row">
<div ng-class="" class="col-sm-12 col-xs-12">
<div class="panel panel-default b">
<div class="panel-heading">
<h2 class="panel-title">
<i class="fa fa-info-circle m-r-sm"></i>User Tracker
</h2>
</div>
<div class="body padder-xs">
<div class="list-group">
<div class="list-group-item">
<div>
User Name: {{data.userName}}
</div>
<div>
Display Name: {{data.name}}
</div>
<div>
IP Address: {{data.ipAddress}}
</div>
<div>
Last Login: {{data.process_on}}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
CSS ( I'm not sure which one apply because this widget I clone from Hello World widget just reuse)
.list-group-item {
border: none;
padding: 5px 15px;
.btn-link {
padding-left: 0;
padding-right: 0;
}
}
.user-details {
word-wrap: break-word; // ie support
overflow-wrap: break-word;
}
.select2-container.select2-allowclear .select2-choice .select2-chosen {
margin-right: 60px;
}
.mia i {
font-size: 6rem;
}
.mia {
color: #808080;
}
.popover {
z-index: 1049;
}
.user-profile-container {
width: 100%;
max-width: 755px;
margin: 0 auto;
padding: 0 8px;
}
.input-switch input[type=checkbox]:checked ~ .switch {
background-color: $brand-primary;
}
// accessible accessibility toggle
@media screen and (-ms-high-contrast: active) {
.input-switch input.ng-not-empty+label.switch[for="accessibility-enabled"] {
background-color: highlight;
border: none;
&:before {
background-color: highlightText;
}
}
.input-switch input.ng-empty+label[for="accessibility-enabled"] {
background-color: window;
border: 1px solid windowText;
&:before {
background-color: windowText;
}
}
}
Server-script:
(function() {
data.userName = gs.getUserName();
data.userID = gs.getUserID();
data.name = gs.getUserDisplayName();
// Query current login User
var user = new GlideRecord('sys_user');
user.get('sys_id', data.userID); // replace USER_SYS_ID with the actual sys_id of the user
// Query login Event
var event = new GlideRecord('sysevent');
event.orderByDesc('sys_created_on');
event.addQuery('user_id',gs.getUserID());
event.addQuery('name', 'login'); // replace 'your_event_name' with the actual event name
event.query();
if (event.next()) {
data.ipAddress = event.getValue('parm2'); // replace 'field_name' with the actual field name
data.process_on = event.getValue('process_on');
var login_history = new GlideRecord('u_login_history');
login_history.addQuery('u_user_name',data.userName);
login_history.query();
if(login_history.next()){
login_history.u_current_login = data.process_on;
login_history.u_ip_address = data.ipAddress;
login_history.u_user_name = data.userName;
login_history.u_last_login = login_history.u_current_login;
login_history.u_user_id = data.userID;
login_history.update();
}
else{
var gr = new GlideRecord('u_login_history');
gr.initialize();
gr.u_user_name = data.userName;
gr.u_ip_address = data.ipAddress;
gr.u_last_login = data.process_on;
gr.insert();
}
}
I created a Login history table to save event login because sysevent table will remove login events after 7 days
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎01-16-2024 09:02 AM
Hi @thoang93
https://www.servicenow.com/community/platform-analytics-forum/service-portal-visitors/m-p/1206599
https://www.servicenow.com/community/developer-forum/tracking-user-login-information/m-p/1496885
If my response proves useful, please indicate its helpfulness by selecting " Accept as Solution" and " Helpful." This action benefits both the community and me.
Regards
Dr. Atul G. - Learn N Grow Together
ServiceNow Techno - Functional Trainer
LinkedIn: https://www.linkedin.com/in/dratulgrover
YouTube: https://www.youtube.com/@LearnNGrowTogetherwithAtulG
Topmate: https://topmate.io/atul_grover_lng [ Connect for 1-1 Session]
****************************************************************************************************************
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎01-22-2024 06:21 AM
Hi Atul,
Thank you for your reply. I got the solution for me. Below is my Solution
Create a Widget and add it to the Service Portal
Here is my script in the widget:
HTML
<div class="row">
<div ng-class="" class="col-sm-12 col-xs-12">
<div class="panel panel-default b">
<div class="panel-heading">
<h2 class="panel-title">
<i class="fa fa-info-circle m-r-sm"></i>User Tracker
</h2>
</div>
<div class="body padder-xs">
<div class="list-group">
<div class="list-group-item">
<div>
User Name: {{data.userName}}
</div>
<div>
Display Name: {{data.name}}
</div>
<div>
IP Address: {{data.ipAddress}}
</div>
<div>
Last Login: {{data.process_on}}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
CSS ( I'm not sure which one apply because this widget I clone from Hello World widget just reuse)
.list-group-item {
border: none;
padding: 5px 15px;
.btn-link {
padding-left: 0;
padding-right: 0;
}
}
.user-details {
word-wrap: break-word; // ie support
overflow-wrap: break-word;
}
.select2-container.select2-allowclear .select2-choice .select2-chosen {
margin-right: 60px;
}
.mia i {
font-size: 6rem;
}
.mia {
color: #808080;
}
.popover {
z-index: 1049;
}
.user-profile-container {
width: 100%;
max-width: 755px;
margin: 0 auto;
padding: 0 8px;
}
.input-switch input[type=checkbox]:checked ~ .switch {
background-color: $brand-primary;
}
// accessible accessibility toggle
@media screen and (-ms-high-contrast: active) {
.input-switch input.ng-not-empty+label.switch[for="accessibility-enabled"] {
background-color: highlight;
border: none;
&:before {
background-color: highlightText;
}
}
.input-switch input.ng-empty+label[for="accessibility-enabled"] {
background-color: window;
border: 1px solid windowText;
&:before {
background-color: windowText;
}
}
}
Server-script:
(function() {
data.userName = gs.getUserName();
data.userID = gs.getUserID();
data.name = gs.getUserDisplayName();
// Query current login User
var user = new GlideRecord('sys_user');
user.get('sys_id', data.userID); // replace USER_SYS_ID with the actual sys_id of the user
// Query login Event
var event = new GlideRecord('sysevent');
event.orderByDesc('sys_created_on');
event.addQuery('user_id',gs.getUserID());
event.addQuery('name', 'login'); // replace 'your_event_name' with the actual event name
event.query();
if (event.next()) {
data.ipAddress = event.getValue('parm2'); // replace 'field_name' with the actual field name
data.process_on = event.getValue('process_on');
var login_history = new GlideRecord('u_login_history');
login_history.addQuery('u_user_name',data.userName);
login_history.query();
if(login_history.next()){
login_history.u_current_login = data.process_on;
login_history.u_ip_address = data.ipAddress;
login_history.u_user_name = data.userName;
login_history.u_last_login = login_history.u_current_login;
login_history.u_user_id = data.userID;
login_history.update();
}
else{
var gr = new GlideRecord('u_login_history');
gr.initialize();
gr.u_user_name = data.userName;
gr.u_ip_address = data.ipAddress;
gr.u_last_login = data.process_on;
gr.insert();
}
}
I created a Login history table to save event login because sysevent table will remove login events after 7 days
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎01-16-2024 11:04 AM
The last login you can get from the last login in sys_user, and the IP information can cross with this KB https://support.servicenow.com/kb?id=kb_article_view&sysparm_article=KB0564981