Bagaimana cara mendapatkan nama pengguna saat ini di Windows PowerShell?
Bagaimana cara mendapatkan nama pengguna saat ini di Windows PowerShell?
Jawaban:
Aku menemukannya:
$env:UserName
Ada juga:
$env:UserDomain
$env:ComputerName
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
$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.
(opsi lebih mudah / pendek / mudah diingat)
[Environment]::UserName
- @ThomasBratt$env:username
- @Eoinwhoami
- @galaktor(opsi yang lebih bisa diandalkan)
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
- @MarkSeemann(bukan nama pengguna yang menjalankan instance PowerShell)
$(Get-WMIObject -class Win32_ComputerSystem | select username).username
- @TwonOfAn di forum lain iniKomentar @Kevin Panko pada jawaban @Mark Seemann berkaitan dengan memilih salah satu kategori di atas yang lain:
[Pendekatan token akses Windows] adalah jawaban yang paling aman, karena $ env: USERNAME dapat diubah oleh pengguna, tetapi ini tidak akan dibodohi dengan melakukan itu.
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.
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:
$cred = Get-Credential UserTo.RunAs
Run-AsUser.ps1 "whoami; pause" $cred
Run-AsUser.ps1 "[System.Security.Principal.WindowsIdentity]::GetCurrent().Name; pause" $cred
Isi skrip Run-AsUser.ps1:
param(
[Parameter(Mandatory=$true)]
[string]$script,
[Parameter(Mandatory=$true)]
[System.Management.Automation.PsCredential]$cred
)
Start-Process -Credential $cred -FilePath 'powershell.exe' -ArgumentList 'noprofile','-Command',"$script"
[Environment]::UserName
adalah pilihan terbaik, karena berfungsi lintas platform. whoami
tampaknya juga berfungsi, tetapi tergantung pada whoami
alat yang tersedia di platform.
$env:USERNAME
hasilkan SYSTEM
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 dan Microsoft.PowerShell.Management
yang memiliki cmdlet. Adakah yang tahu apa yang terjadi?
Saya ingin memasukkan perintah whoami , yang pada dasarnya adalah alias yang bagus untuk melakukan %USERDOMAIN%\%USERNAME%
seperti yang diusulkan dalam jawaban lain.
Write-Host "current user:"
Write-Host $(whoami)
$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 \ bob
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 kembali domain\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.
[Environment]::UserName
kurang mengetik, independen $env:username
dan lintas-platform: Lihat pastebin.com/GsfR6Hrp
Sekarang 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.
$username=( ( Get-WMIObject -class Win32_ComputerSystem | Select-Object -ExpandProperty username ) -split '\\' )[1]
$username
Nama pengguna kedua adalah hanya untuk tujuan tampilan jika Anda menyalin dan menempelnya.
Saya tidak melihat contoh berbasis Add-Type . Ini adalah salah satu yang menggunakan GetUserName langsung dari advapi32.dll.
$sig = @'
[DllImport("advapi32.dll", SetLastError = true)]
public static extern bool GetUserName(System.Text.StringBuilder sb, ref Int32 length);
'@
Add-Type -MemberDefinition $sig -Namespace Advapi32 -Name Util
$size = 64
$str = New-Object System.Text.StringBuilder -ArgumentList $size
[Advapi32.util]::GetUserName($str, [ref]$size) |Out-Null
$str.ToString()
UNLEN+1
, dan UNLEN
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 \
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
Jika sudah terbiasa, Anda dapat menelepon
$user=$(cmd.exe /c echo %username%)
Ini pada dasarnya mencuri output dari apa yang akan Anda dapatkan jika Anda memiliki file batch hanya dengan "echo% username%".
$(...)
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, misalnya powershell 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}
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 = Get-Location
Set-Location $Path\Desktop
Set-Location Desktop
. ( Get-Location
hanya mengembalikan lokasi saat ini, yang tersirat untuk Set-Location
dengan jalur relatif.)
$env:username
mengambil nama pengguna dari variabel lingkungan yang sesuai.