Full name of Windows user name (in Domain) using PythonSet user under a windows domain with no domain...
Preparing as much as possible of a cake in advance
Why do we call complex numbers “numbers” but we don’t consider 2 vectors numbers?
Align equations with text before one of them
Why can't we use freedom of speech and expression to incite people to rebel against government in India?
Integrating function with /; in its definition
Replacing tantalum capacitor with ceramic capacitor for Op Amps
The need of reserving one's ability in job interviews
Are small insurances worth it
Affine transformation of circular arc in 3D
Has a sovereign Communist government ever run, and conceded loss, on a fair election?
Why doesn't "adolescent" take any articles in "listen to adolescent agonising"?
Does the US political system, in principle, allow for a no-party system?
Sundering Titan and basic normal lands and snow lands
Can inspiration allow the Rogue to make a Sneak Attack?
Can a Mimic (container form) actually hold loot?
I've given my players a lot of magic items. Is it reasonable for me to give them harder encounters?
In the world of The Matrix, what is "popping"?
Can you run a ground wire from stove directly to ground pole in the ground
How to write a chaotic neutral protagonist and prevent my readers from thinking they are evil?
Deal the cards to the players
Why are special aircraft used for the carriers in the United States Navy?
Calculate total length of edges in select Voronoi diagram
What is the meaning of option 'by' in TikZ Intersections
When to use the term transposed instead of modulation?
Full name of Windows user name (in Domain) using Python
Set user under a windows domain with no domain availablewhat programs can a domain user install?Using OneDrive with a Domain User account on Windows 8.1UPN vs DOMAINUSER signinRun as different domain user without password with domain administrator account under windows 7How user can logon on all domain computers?Windows 10: Local administrator account as a domain userGive full access to user in one Domain to another DomainHow to get SID of Windows domain using WMIC?New Windows Domain Name
I want to retrieve the full name of a Windows computer user in Python.
I have found the equivalent batch command:
net user "%USERNAME%" /domain | FIND /I "Full Name"
that returns the full name (e.g. Full Name John Doe).
I have done the following way by using subprocess but I am wondering if there is a more native way to do it with some Python modules.
import getpass
import subprocess
import re
username = getpass.getuser()
p = subprocess.Popen(
'net user %s /domain' % username,
stdout=subprocess.PIPE, stderr=subprocess.PIPE
)
info, err = p.stdout.read(), p.stderr.read()
full_name = re.findall(r'Full Names+(.*S)', info)
print(full_name)
Thanks
windows python windows-domain
add a comment |
I want to retrieve the full name of a Windows computer user in Python.
I have found the equivalent batch command:
net user "%USERNAME%" /domain | FIND /I "Full Name"
that returns the full name (e.g. Full Name John Doe).
I have done the following way by using subprocess but I am wondering if there is a more native way to do it with some Python modules.
import getpass
import subprocess
import re
username = getpass.getuser()
p = subprocess.Popen(
'net user %s /domain' % username,
stdout=subprocess.PIPE, stderr=subprocess.PIPE
)
info, err = p.stdout.read(), p.stderr.read()
full_name = re.findall(r'Full Names+(.*S)', info)
print(full_name)
Thanks
windows python windows-domain
add a comment |
I want to retrieve the full name of a Windows computer user in Python.
I have found the equivalent batch command:
net user "%USERNAME%" /domain | FIND /I "Full Name"
that returns the full name (e.g. Full Name John Doe).
I have done the following way by using subprocess but I am wondering if there is a more native way to do it with some Python modules.
import getpass
import subprocess
import re
username = getpass.getuser()
p = subprocess.Popen(
'net user %s /domain' % username,
stdout=subprocess.PIPE, stderr=subprocess.PIPE
)
info, err = p.stdout.read(), p.stderr.read()
full_name = re.findall(r'Full Names+(.*S)', info)
print(full_name)
Thanks
windows python windows-domain
I want to retrieve the full name of a Windows computer user in Python.
I have found the equivalent batch command:
net user "%USERNAME%" /domain | FIND /I "Full Name"
that returns the full name (e.g. Full Name John Doe).
I have done the following way by using subprocess but I am wondering if there is a more native way to do it with some Python modules.
import getpass
import subprocess
import re
username = getpass.getuser()
p = subprocess.Popen(
'net user %s /domain' % username,
stdout=subprocess.PIPE, stderr=subprocess.PIPE
)
info, err = p.stdout.read(), p.stderr.read()
full_name = re.findall(r'Full Names+(.*S)', info)
print(full_name)
Thanks
windows python windows-domain
windows python windows-domain
edited Aug 11 '17 at 3:45
Jean-Francois T.
asked Aug 11 '17 at 2:27
Jean-Francois T.Jean-Francois T.
3501314
3501314
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
The more direct way to do this is to query Active Directory. You'd perform a lookup on the user, followed by getting the displayName attribute. (This maps to the Full Name displayed in Windows.)
You have two options here:
Using a Python AD library, e.g. pyad
This is very Windows-specific, and requires the pywin32 library. It relies on ADSI APIs, so will only work on Windows.
from pyad import aduser
user = aduser.ADUser.from_cn(username)
print user.get_attribute("displayName")
How you get the username is up to you. You can use getpass.getuser(), os.environ["USERNAME"] (Windows-only), etc.
Using a Python LDAP library, e.g. ldap3
This follows the standard LDAP protocol, with a pure Python implementation, so should work from any client OS.
Using raw LDAP queries is rather more involved than the ADSI abstractions. I suggest you read the documentation (which has decent tutorials) and search for more tutorials on interacting with Microsoft AD via ldap3.
Note that one possible issue is that searching by username (CN) alone might get you the wrong object. It's possible to have multiple objects with the same CN across multiple OUs. If you want to be more precise, you might want to use a unique identifier like the SID.
Is there a method using Windows' "Net*()" functions? (Or, well, similar.) It would then work for any kind of account – local, nt4, ad...
– grawity
Aug 11 '17 at 6:55
1
@grawity Hm, I'd not even thought of that. Withpywin32you could useimport win32netand usewin32net.NetUserGetInfo(), which callsNetUserGetInfo(). A level of 2 or higher includes afull_name. However, with a bit of testing, it appears that you have to specify the server to get a domain response anyway - querying a domain user (even the currently logged in one) againstNone/localhostfails.
– Bob
Aug 11 '17 at 7:19
Interesting answer, although I have an error while trying with pyad when doingaduser.ADUser.from_cn:The specified query resturned 0 results. getSingleResults only functions with a single result.. I believe I will stick to my ugly solution :)
– Jean-Francois T.
Aug 14 '17 at 3:04
@Jean-FrancoisT. Hm, that's interesting - it worked when I tested. I assume the machine you're running it on is joined to the domain, and that you are using a correctusername? It should work with the same thing you pass intonet user /domain. Failing that, you could try theNetUserGetInfomethod. Or your subprocess method if you can accept the ugliness ;)
– Bob
Aug 14 '17 at 4:08
add a comment |
Based on the comments from @Bob, the following is working on Windows and is pure Python but it requires to install pywin32 (based on this Recipe):
import win32api
import win32net
user_info = win32net.NetUserGetInfo(win32net.NetGetAnyDCName(), win32api.GetUserName(), 2)
full_name = user_info["full_name"]
Another shorter version of the script in the question using only subprocess is:
import subprocess
name = subprocess.check_output(
'net user "%USERNAME%" /domain | FIND /I "Full Name"', shell=True
)
full_name name.replace(b"Full Name", b"").strip()
NOTE: in the last example, you will need to change the last line to ...replace("Full Name", "").strip() for Python 2.7.
add a comment |
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "3"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fsuperuser.com%2fquestions%2f1239773%2ffull-name-of-windows-user-name-in-domain-using-python%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
The more direct way to do this is to query Active Directory. You'd perform a lookup on the user, followed by getting the displayName attribute. (This maps to the Full Name displayed in Windows.)
You have two options here:
Using a Python AD library, e.g. pyad
This is very Windows-specific, and requires the pywin32 library. It relies on ADSI APIs, so will only work on Windows.
from pyad import aduser
user = aduser.ADUser.from_cn(username)
print user.get_attribute("displayName")
How you get the username is up to you. You can use getpass.getuser(), os.environ["USERNAME"] (Windows-only), etc.
Using a Python LDAP library, e.g. ldap3
This follows the standard LDAP protocol, with a pure Python implementation, so should work from any client OS.
Using raw LDAP queries is rather more involved than the ADSI abstractions. I suggest you read the documentation (which has decent tutorials) and search for more tutorials on interacting with Microsoft AD via ldap3.
Note that one possible issue is that searching by username (CN) alone might get you the wrong object. It's possible to have multiple objects with the same CN across multiple OUs. If you want to be more precise, you might want to use a unique identifier like the SID.
Is there a method using Windows' "Net*()" functions? (Or, well, similar.) It would then work for any kind of account – local, nt4, ad...
– grawity
Aug 11 '17 at 6:55
1
@grawity Hm, I'd not even thought of that. Withpywin32you could useimport win32netand usewin32net.NetUserGetInfo(), which callsNetUserGetInfo(). A level of 2 or higher includes afull_name. However, with a bit of testing, it appears that you have to specify the server to get a domain response anyway - querying a domain user (even the currently logged in one) againstNone/localhostfails.
– Bob
Aug 11 '17 at 7:19
Interesting answer, although I have an error while trying with pyad when doingaduser.ADUser.from_cn:The specified query resturned 0 results. getSingleResults only functions with a single result.. I believe I will stick to my ugly solution :)
– Jean-Francois T.
Aug 14 '17 at 3:04
@Jean-FrancoisT. Hm, that's interesting - it worked when I tested. I assume the machine you're running it on is joined to the domain, and that you are using a correctusername? It should work with the same thing you pass intonet user /domain. Failing that, you could try theNetUserGetInfomethod. Or your subprocess method if you can accept the ugliness ;)
– Bob
Aug 14 '17 at 4:08
add a comment |
The more direct way to do this is to query Active Directory. You'd perform a lookup on the user, followed by getting the displayName attribute. (This maps to the Full Name displayed in Windows.)
You have two options here:
Using a Python AD library, e.g. pyad
This is very Windows-specific, and requires the pywin32 library. It relies on ADSI APIs, so will only work on Windows.
from pyad import aduser
user = aduser.ADUser.from_cn(username)
print user.get_attribute("displayName")
How you get the username is up to you. You can use getpass.getuser(), os.environ["USERNAME"] (Windows-only), etc.
Using a Python LDAP library, e.g. ldap3
This follows the standard LDAP protocol, with a pure Python implementation, so should work from any client OS.
Using raw LDAP queries is rather more involved than the ADSI abstractions. I suggest you read the documentation (which has decent tutorials) and search for more tutorials on interacting with Microsoft AD via ldap3.
Note that one possible issue is that searching by username (CN) alone might get you the wrong object. It's possible to have multiple objects with the same CN across multiple OUs. If you want to be more precise, you might want to use a unique identifier like the SID.
Is there a method using Windows' "Net*()" functions? (Or, well, similar.) It would then work for any kind of account – local, nt4, ad...
– grawity
Aug 11 '17 at 6:55
1
@grawity Hm, I'd not even thought of that. Withpywin32you could useimport win32netand usewin32net.NetUserGetInfo(), which callsNetUserGetInfo(). A level of 2 or higher includes afull_name. However, with a bit of testing, it appears that you have to specify the server to get a domain response anyway - querying a domain user (even the currently logged in one) againstNone/localhostfails.
– Bob
Aug 11 '17 at 7:19
Interesting answer, although I have an error while trying with pyad when doingaduser.ADUser.from_cn:The specified query resturned 0 results. getSingleResults only functions with a single result.. I believe I will stick to my ugly solution :)
– Jean-Francois T.
Aug 14 '17 at 3:04
@Jean-FrancoisT. Hm, that's interesting - it worked when I tested. I assume the machine you're running it on is joined to the domain, and that you are using a correctusername? It should work with the same thing you pass intonet user /domain. Failing that, you could try theNetUserGetInfomethod. Or your subprocess method if you can accept the ugliness ;)
– Bob
Aug 14 '17 at 4:08
add a comment |
The more direct way to do this is to query Active Directory. You'd perform a lookup on the user, followed by getting the displayName attribute. (This maps to the Full Name displayed in Windows.)
You have two options here:
Using a Python AD library, e.g. pyad
This is very Windows-specific, and requires the pywin32 library. It relies on ADSI APIs, so will only work on Windows.
from pyad import aduser
user = aduser.ADUser.from_cn(username)
print user.get_attribute("displayName")
How you get the username is up to you. You can use getpass.getuser(), os.environ["USERNAME"] (Windows-only), etc.
Using a Python LDAP library, e.g. ldap3
This follows the standard LDAP protocol, with a pure Python implementation, so should work from any client OS.
Using raw LDAP queries is rather more involved than the ADSI abstractions. I suggest you read the documentation (which has decent tutorials) and search for more tutorials on interacting with Microsoft AD via ldap3.
Note that one possible issue is that searching by username (CN) alone might get you the wrong object. It's possible to have multiple objects with the same CN across multiple OUs. If you want to be more precise, you might want to use a unique identifier like the SID.
The more direct way to do this is to query Active Directory. You'd perform a lookup on the user, followed by getting the displayName attribute. (This maps to the Full Name displayed in Windows.)
You have two options here:
Using a Python AD library, e.g. pyad
This is very Windows-specific, and requires the pywin32 library. It relies on ADSI APIs, so will only work on Windows.
from pyad import aduser
user = aduser.ADUser.from_cn(username)
print user.get_attribute("displayName")
How you get the username is up to you. You can use getpass.getuser(), os.environ["USERNAME"] (Windows-only), etc.
Using a Python LDAP library, e.g. ldap3
This follows the standard LDAP protocol, with a pure Python implementation, so should work from any client OS.
Using raw LDAP queries is rather more involved than the ADSI abstractions. I suggest you read the documentation (which has decent tutorials) and search for more tutorials on interacting with Microsoft AD via ldap3.
Note that one possible issue is that searching by username (CN) alone might get you the wrong object. It's possible to have multiple objects with the same CN across multiple OUs. If you want to be more precise, you might want to use a unique identifier like the SID.
answered Aug 11 '17 at 3:05
BobBob
45.9k20139173
45.9k20139173
Is there a method using Windows' "Net*()" functions? (Or, well, similar.) It would then work for any kind of account – local, nt4, ad...
– grawity
Aug 11 '17 at 6:55
1
@grawity Hm, I'd not even thought of that. Withpywin32you could useimport win32netand usewin32net.NetUserGetInfo(), which callsNetUserGetInfo(). A level of 2 or higher includes afull_name. However, with a bit of testing, it appears that you have to specify the server to get a domain response anyway - querying a domain user (even the currently logged in one) againstNone/localhostfails.
– Bob
Aug 11 '17 at 7:19
Interesting answer, although I have an error while trying with pyad when doingaduser.ADUser.from_cn:The specified query resturned 0 results. getSingleResults only functions with a single result.. I believe I will stick to my ugly solution :)
– Jean-Francois T.
Aug 14 '17 at 3:04
@Jean-FrancoisT. Hm, that's interesting - it worked when I tested. I assume the machine you're running it on is joined to the domain, and that you are using a correctusername? It should work with the same thing you pass intonet user /domain. Failing that, you could try theNetUserGetInfomethod. Or your subprocess method if you can accept the ugliness ;)
– Bob
Aug 14 '17 at 4:08
add a comment |
Is there a method using Windows' "Net*()" functions? (Or, well, similar.) It would then work for any kind of account – local, nt4, ad...
– grawity
Aug 11 '17 at 6:55
1
@grawity Hm, I'd not even thought of that. Withpywin32you could useimport win32netand usewin32net.NetUserGetInfo(), which callsNetUserGetInfo(). A level of 2 or higher includes afull_name. However, with a bit of testing, it appears that you have to specify the server to get a domain response anyway - querying a domain user (even the currently logged in one) againstNone/localhostfails.
– Bob
Aug 11 '17 at 7:19
Interesting answer, although I have an error while trying with pyad when doingaduser.ADUser.from_cn:The specified query resturned 0 results. getSingleResults only functions with a single result.. I believe I will stick to my ugly solution :)
– Jean-Francois T.
Aug 14 '17 at 3:04
@Jean-FrancoisT. Hm, that's interesting - it worked when I tested. I assume the machine you're running it on is joined to the domain, and that you are using a correctusername? It should work with the same thing you pass intonet user /domain. Failing that, you could try theNetUserGetInfomethod. Or your subprocess method if you can accept the ugliness ;)
– Bob
Aug 14 '17 at 4:08
Is there a method using Windows' "Net*()" functions? (Or, well, similar.) It would then work for any kind of account – local, nt4, ad...
– grawity
Aug 11 '17 at 6:55
Is there a method using Windows' "Net*()" functions? (Or, well, similar.) It would then work for any kind of account – local, nt4, ad...
– grawity
Aug 11 '17 at 6:55
1
1
@grawity Hm, I'd not even thought of that. With
pywin32 you could use import win32net and use win32net.NetUserGetInfo(), which calls NetUserGetInfo(). A level of 2 or higher includes a full_name. However, with a bit of testing, it appears that you have to specify the server to get a domain response anyway - querying a domain user (even the currently logged in one) against None/localhost fails.– Bob
Aug 11 '17 at 7:19
@grawity Hm, I'd not even thought of that. With
pywin32 you could use import win32net and use win32net.NetUserGetInfo(), which calls NetUserGetInfo(). A level of 2 or higher includes a full_name. However, with a bit of testing, it appears that you have to specify the server to get a domain response anyway - querying a domain user (even the currently logged in one) against None/localhost fails.– Bob
Aug 11 '17 at 7:19
Interesting answer, although I have an error while trying with pyad when doing
aduser.ADUser.from_cn: The specified query resturned 0 results. getSingleResults only functions with a single result.. I believe I will stick to my ugly solution :)– Jean-Francois T.
Aug 14 '17 at 3:04
Interesting answer, although I have an error while trying with pyad when doing
aduser.ADUser.from_cn: The specified query resturned 0 results. getSingleResults only functions with a single result.. I believe I will stick to my ugly solution :)– Jean-Francois T.
Aug 14 '17 at 3:04
@Jean-FrancoisT. Hm, that's interesting - it worked when I tested. I assume the machine you're running it on is joined to the domain, and that you are using a correct
username? It should work with the same thing you pass into net user /domain. Failing that, you could try the NetUserGetInfo method. Or your subprocess method if you can accept the ugliness ;)– Bob
Aug 14 '17 at 4:08
@Jean-FrancoisT. Hm, that's interesting - it worked when I tested. I assume the machine you're running it on is joined to the domain, and that you are using a correct
username? It should work with the same thing you pass into net user /domain. Failing that, you could try the NetUserGetInfo method. Or your subprocess method if you can accept the ugliness ;)– Bob
Aug 14 '17 at 4:08
add a comment |
Based on the comments from @Bob, the following is working on Windows and is pure Python but it requires to install pywin32 (based on this Recipe):
import win32api
import win32net
user_info = win32net.NetUserGetInfo(win32net.NetGetAnyDCName(), win32api.GetUserName(), 2)
full_name = user_info["full_name"]
Another shorter version of the script in the question using only subprocess is:
import subprocess
name = subprocess.check_output(
'net user "%USERNAME%" /domain | FIND /I "Full Name"', shell=True
)
full_name name.replace(b"Full Name", b"").strip()
NOTE: in the last example, you will need to change the last line to ...replace("Full Name", "").strip() for Python 2.7.
add a comment |
Based on the comments from @Bob, the following is working on Windows and is pure Python but it requires to install pywin32 (based on this Recipe):
import win32api
import win32net
user_info = win32net.NetUserGetInfo(win32net.NetGetAnyDCName(), win32api.GetUserName(), 2)
full_name = user_info["full_name"]
Another shorter version of the script in the question using only subprocess is:
import subprocess
name = subprocess.check_output(
'net user "%USERNAME%" /domain | FIND /I "Full Name"', shell=True
)
full_name name.replace(b"Full Name", b"").strip()
NOTE: in the last example, you will need to change the last line to ...replace("Full Name", "").strip() for Python 2.7.
add a comment |
Based on the comments from @Bob, the following is working on Windows and is pure Python but it requires to install pywin32 (based on this Recipe):
import win32api
import win32net
user_info = win32net.NetUserGetInfo(win32net.NetGetAnyDCName(), win32api.GetUserName(), 2)
full_name = user_info["full_name"]
Another shorter version of the script in the question using only subprocess is:
import subprocess
name = subprocess.check_output(
'net user "%USERNAME%" /domain | FIND /I "Full Name"', shell=True
)
full_name name.replace(b"Full Name", b"").strip()
NOTE: in the last example, you will need to change the last line to ...replace("Full Name", "").strip() for Python 2.7.
Based on the comments from @Bob, the following is working on Windows and is pure Python but it requires to install pywin32 (based on this Recipe):
import win32api
import win32net
user_info = win32net.NetUserGetInfo(win32net.NetGetAnyDCName(), win32api.GetUserName(), 2)
full_name = user_info["full_name"]
Another shorter version of the script in the question using only subprocess is:
import subprocess
name = subprocess.check_output(
'net user "%USERNAME%" /domain | FIND /I "Full Name"', shell=True
)
full_name name.replace(b"Full Name", b"").strip()
NOTE: in the last example, you will need to change the last line to ...replace("Full Name", "").strip() for Python 2.7.
answered yesterday
Jean-Francois T.Jean-Francois T.
3501314
3501314
add a comment |
add a comment |
Thanks for contributing an answer to Super User!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fsuperuser.com%2fquestions%2f1239773%2ffull-name-of-windows-user-name-in-domain-using-python%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown