Bagaimana cara mendapatkan nama pengguna saat ini di Windows PowerShell?
windows
powershell
scripting
Thomas Bratt
sumber
sumber
$env:username
mengambil nama pengguna dari variabel lingkungan yang sesuai.sumber
$env:USERNAME
dapat diubah oleh pengguna, tetapi ini tidak akan dibodohi dengan melakukan itu.Saya pikir akan sangat berharga untuk merangkum dan membandingkan jawaban yang diberikan.
Jika Anda ingin mengakses variabel lingkungan :
(opsi lebih mudah / pendek / mudah diingat)
[Environment]::UserName
- @ThomasBratt$env:username
- @Eoinwhoami
- @galaktorJika Anda ingin mengakses token akses Windows :
(opsi yang lebih bisa diandalkan)
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
- @MarkSeemannJika Anda ingin nama pengguna yang masuk
(bukan nama pengguna yang menjalankan instance PowerShell)
$(Get-WMIObject -class Win32_ComputerSystem | select username).username
- @TwonOfAn di forum lain iniPerbandingan
Komentar @Kevin Panko pada jawaban @Mark Seemann berkaitan dengan memilih salah satu kategori di atas yang lain:
Singkatnya, opsi variabel lingkungan lebih ringkas, dan opsi token akses Windows lebih dapat diandalkan.
Saya harus menggunakan pendekatan token akses @Mark Seemann dalam skrip PowerShell yang saya jalankan dari aplikasi C # dengan peniruan.
Aplikasi C # dijalankan dengan akun pengguna saya, dan menjalankan skrip PowerShell sebagai akun layanan. Karena keterbatasan cara saya menjalankan skrip PowerShell dari C #, contoh PowerShell menggunakan variabel lingkungan akun pengguna saya, meskipun dijalankan sebagai pengguna akun layanan.
Dalam pengaturan ini, opsi variabel lingkungan mengembalikan nama akun saya, dan opsi token akses Windows mengembalikan nama akun layanan (yang saya inginkan), dan opsi pengguna yang masuk mengembalikan nama akun saya.
Pengujian
Juga, jika Anda ingin membandingkan sendiri opsi-opsi ini, berikut adalah skrip yang dapat Anda gunakan untuk menjalankan skrip sebagai pengguna lain. Anda perlu menggunakan cmdlet Get-Credential untuk mendapatkan objek kredensial, dan kemudian jalankan skrip ini dengan skrip untuk dijalankan sebagai pengguna lain sebagai argumen 1, dan objek kredensial sebagai argumen 2.
Pemakaian:
Isi skrip Run-AsUser.ps1:
sumber
[Environment]::UserName
adalah pilihan terbaik, karena berfungsi lintas platform.whoami
tampaknya juga berfungsi, tetapi tergantung padawhoami
alat yang tersedia di platform.$env:USERNAME
hasilkanSYSTEM
kecuali saya menjalankan sebagai administrator, sementara[Environment]::UserName]
menghasilkan nama pengguna saya.Get-WmiObject
metode ini tidak lagi berfungsi di pwsh. Bahkan mencoba mengimpor modul kompatibilitas danMicrosoft.PowerShell.Management
yang memiliki cmdlet. Adakah yang tahu apa yang terjadi?$env:username
adalah cara termudahsumber
Saya ingin memasukkan perintah whoami , yang pada dasarnya adalah alias yang bagus untuk melakukan
%USERDOMAIN%\%USERNAME%
seperti yang diusulkan dalam jawaban lain.sumber
$env:USERNAME
dapat diubah oleh pengguna, tetapi ini tidak akan dibodohi dengan melakukan itu.[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
)whoami
adalah executable. Itu tidak dapat dihapus dari PowerShell. Ini berpotensi dihapus dari Windows, tetapi masih ada pada Windows Server non-Nano 2012.[Environment]::UserName
mengembalikan hanya nama pengguna. Misalnya bob[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
mengembalikan nama pengguna, diawali dengan domainnya jika sesuai. Misalnya SOMEWHERENICE \ bobsumber
Saya telah menggunakan
$env:username
di masa lalu, tetapi seorang rekan menunjukkan itu adalah variabel lingkungan dan dapat diubah oleh pengguna dan oleh karena itu, jika Anda benar-benar ingin mendapatkan nama pengguna pengguna saat ini, Anda tidak boleh mempercayainya.Saya akan mendukung jawaban Mark Seemann: [System.Security.Principal.WindowsIdentity] :: GetCurrent (). Name
Tapi saya tidak diizinkan. Dengan jawaban Mark, jika Anda hanya perlu nama pengguna, Anda mungkin harus menguraikannya sejak di sistem saya, itu kembali
hostname\username
dan pada mesin yang bergabung dengan domain dengan akun domain itu akan kembalidomain\username
.Saya tidak akan menggunakan
whoami.exe
karena tidak ada di semua versi Windows, dan itu panggilan ke biner lain dan mungkin memberikan beberapa tim keamanan cocok.sumber
[Environment]::UserName
kurang mengetik, independen$env:username
dan lintas-platform: Lihat pastebin.com/GsfR6HrpSekarang PowerShell Core (alias v6) telah dirilis, dan orang mungkin ingin menulis skrip lintas-platform, banyak jawaban di sini tidak akan berfungsi selain Windows.
[Environment]::UserName
tampaknya menjadi cara terbaik untuk mendapatkan nama pengguna saat ini di semua platform yang didukung oleh PowerShell Core jika Anda tidak ingin menambahkan deteksi platform dan casing khusus ke kode Anda.sumber
Hanya membangun karya orang lain di sini:
sumber
$username
Nama pengguna kedua adalah hanya untuk tujuan tampilan jika Anda menyalin dan menempelnya.
sumber
Saya tidak melihat contoh berbasis Add-Type . Ini adalah salah satu yang menggunakan GetUserName langsung dari advapi32.dll.
sumber
UNLEN+1
, danUNLEN
256), ia mengabaikan kesalahan yang mungkin dikembalikan dari GetUserName (melalui ia mempertahankan GetLastError, poin yang bagus), ia tidak membersihkan buffer string; dan mungkin beberapa yang lain. Dan seperti yang orang lain katakan, komentar juga sangat hilang.Saya menemukan yang paling mudah digunakan: cd $ home \ Desktop \
akan membawa Anda ke desktop pengguna saat ini
Dalam kasus saya, saya perlu mengambil nama pengguna untuk mengaktifkan skrip untuk mengubah jalur, yaitu. c: \ users \% username%. Saya perlu memulai skrip dengan mengubah path ke desktop pengguna. Saya dapat melakukan ini, dengan bantuan dari atas dan dari tempat lain, dengan menggunakan applet get-location.
Anda mungkin memiliki cara lain, atau bahkan lebih baik untuk melakukannya, tetapi ini berhasil bagi saya:
$ Path = Dapatkan-Lokasi
Set-Lokasi $ Path \ Desktop
sumber
Jika sudah terbiasa, Anda dapat menelepon
Ini pada dasarnya mencuri output dari apa yang akan Anda dapatkan jika Anda memiliki file batch hanya dengan "echo% username%".
sumber
$(...)
itu berlebihan:$a = cmd.exe /c echo %username%
bekerja, b) itu tidak portabel, c) itu tidak benar-benar menjawab pertanyaan tentang bagaimana melakukannya dalam PowerShell, ia menjawab bagaimana melakukannya dalam dos, dan itu lebih baik memberi seorang pria pancing daripada memberinya ikan, misalnyapowershell puts environment variables into $env, so %username% = $env:username
.get-content "cm.txt"
write-host "entr file name" $file = read-host get-content $file
$content = get-content "cm.txt"
$content = get-content "cn.txt" for each ($line in $count) {write-host $line}
sumber
Dalam kasus saya, saya perlu mengambil nama pengguna untuk mengaktifkan skrip untuk mengubah jalur, yaitu.
c:\users\%username%\
. Saya perlu memulai skrip dengan mengubah path ke desktop pengguna. Saya dapat melakukan ini, dengan bantuan dari atas dan dari tempat lain, dengan menggunakan applet get-location .Anda mungkin memiliki cara lain, atau bahkan lebih baik untuk melakukannya, tetapi ini berhasil bagi saya:
sumber
Set-Location Desktop
. (Get-Location
hanya mengembalikan lokasi saat ini, yang tersirat untukSet-Location
dengan jalur relatif.)