Làm cách nào để có được tên người dùng hiện tại trong Windows PowerShell?
Làm cách nào để có được tên người dùng hiện tại trong Windows PowerShell?
Câu trả lời:
Tôi đã tìm thấy nó:
$env:UserName
Ngoài ra còn có:
$env:UserDomain
$env:ComputerName
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
$env:USERNAME
có thể thay đổi, nhưng điều này sẽ không bị đánh lừa khi làm điều đó.
Tôi nghĩ rằng nó sẽ có giá trị để tóm tắt và so sánh các câu trả lời đã cho.
(tùy chọn dễ dàng hơn / ngắn hơn / dễ nhớ)
[Environment]::UserName
- @ThomasBratt$env:username
- @Eininwhoami
- @galaktor(tùy chọn đáng tin cậy hơn)
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
- @MarkSeemann(thay vì tên của người dùng đang chạy phiên bản PowerShell)
$(Get-WMIObject -class Win32_ComputerSystem | select username).username
- @TwonOfAn trên diễn đàn khác nàyNhận xét của @Kevin Panko về câu trả lời của @Mark Seemann với việc chọn một trong các danh mục khác:
[Cách tiếp cận mã thông báo truy cập Windows] là câu trả lời an toàn nhất, bởi vì $ env: USERNAME có thể bị thay đổi bởi người dùng, nhưng điều này sẽ không bị đánh lừa khi làm điều đó.
Nói tóm lại, tùy chọn biến môi trường ngắn gọn hơn và tùy chọn mã thông báo truy cập Windows đáng tin cậy hơn.
Tôi đã phải sử dụng phương pháp tiếp cận mã thông báo truy cập Windows của @Mark Seemann trong tập lệnh PowerShell mà tôi đang chạy từ ứng dụng C # với mạo danh.
Ứng dụng C # được chạy với tài khoản người dùng của tôi và nó chạy tập lệnh PowerShell dưới dạng tài khoản dịch vụ. Do hạn chế về cách tôi chạy tập lệnh PowerShell từ C #, phiên bản PowerShell sử dụng các biến môi trường của tài khoản người dùng của tôi, mặc dù nó được chạy với tư cách là người dùng tài khoản dịch vụ.
Trong thiết lập này, các tùy chọn biến môi trường trả về tên tài khoản của tôi và tùy chọn mã thông báo truy cập Windows trả về tên tài khoản dịch vụ (đó là những gì tôi muốn) và tùy chọn người dùng đã đăng nhập trả về tên tài khoản của tôi.
Ngoài ra, nếu bạn muốn tự so sánh các tùy chọn, đây là tập lệnh bạn có thể sử dụng để chạy tập lệnh với tư cách người dùng khác. Bạn cần sử dụng lệnh ghép ngắn Get-Credential để lấy đối tượng thông tin xác thực, sau đó chạy tập lệnh này với tập lệnh để chạy như một người dùng khác làm đối số 1 và đối tượng thông tin làm đối số 2.
Sử dụng:
$cred = Get-Credential UserTo.RunAs
Run-AsUser.ps1 "whoami; pause" $cred
Run-AsUser.ps1 "[System.Security.Principal.WindowsIdentity]::GetCurrent().Name; pause" $cred
Nội dung của tập lệnh 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
là tùy chọn tốt nhất, vì nó hoạt động đa nền tảng. whoami
dường như cũng hoạt động, nhưng phụ thuộc vào whoami
công cụ có sẵn trên nền tảng.
$env:USERNAME
tạo ra SYSTEM
trừ khi tôi chạy với tư cách quản trị viên, trong khi vẫn [Environment]::UserName]
mang lại tên người dùng của mình.
Get-WmiObject
phương pháp không còn hoạt động trong pwsh. Thậm chí đã cố gắng nhập mô-đun tương thích và cái Microsoft.PowerShell.Management
đó có lệnh ghép ngắn. Bất cứ ý tưởng những gì đang xảy ra?
Tôi muốn đưa ra lệnh whoami , về cơ bản là một bí danh hay để thực hiện %USERDOMAIN%\%USERNAME%
như đề xuất trong các câu trả lời khác.
Write-Host "current user:"
Write-Host $(whoami)
$env:USERNAME
người dùng có thể thay đổi, nhưng điều này sẽ không bị đánh lừa khi làm điều đó.
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
)
whoami
là một thực thi. Nó không thể bị xóa khỏi PowerShell. Nó có khả năng có thể bị xóa khỏi Windows, nhưng nó vẫn ở đó kể từ máy chủ Windows không phải là Nano 2012.
Tôi đã sử dụng $env:username
trước đây, nhưng một đồng nghiệp đã chỉ ra đó là biến môi trường và người dùng có thể thay đổi và do đó, nếu bạn thực sự muốn lấy tên người dùng hiện tại, bạn không nên tin vào nó.
Tôi muốn nâng cao câu trả lời của Mark Seemann: [System.Security.Principal.WindowsIdentity] :: GetCản (). Tên
Nhưng tôi không được phép. Với câu trả lời của Mark, nếu bạn chỉ cần tên người dùng, bạn có thể phải phân tích nó vì trên hệ thống của tôi, nó sẽ trả về hostname\username
và trên các máy được nối với tên miền có tài khoản miền thì nó sẽ trả về domain\username
.
Tôi sẽ không sử dụng whoami.exe
vì nó không có trên tất cả các phiên bản Windows và nó được gọi là một nhị phân khác và có thể cung cấp cho một số nhóm bảo mật phù hợp.
[Environment]::UserName
ít gõ, độc lập $env:username
và đa nền tảng: Xem pastebin.com/GsfR6Hrp
Bây giờ PowerShell Core (còn gọi là v6) đã được phát hành và mọi người có thể muốn viết các tập lệnh đa nền tảng, nhiều câu trả lời ở đây sẽ không hoạt động trên bất kỳ thứ gì ngoài Windows.
[Environment]::UserName
dường như là cách tốt nhất để có được tên người dùng hiện tại trên tất cả các nền tảng được PowerShell Core hỗ trợ nếu bạn không muốn thêm phát hiện nền tảng và vỏ đặc biệt vào mã của mình.
$username=( ( Get-WMIObject -class Win32_ComputerSystem | Select-Object -ExpandProperty username ) -split '\\' )[1]
$username
Các thứ hai tên là để trưng bày chỉ nhằm mục đích duy nhất nếu bạn sao chép và dán nó.
Tôi không thấy bất kỳ ví dụ dựa trên Add-Type nào . Đây là một cách sử dụng GetUserName trực tiếp từ 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
, và UNLEN
là 256), nó bỏ qua mọi lỗi có thể được trả về từ GetUserName (thông qua nó bảo tồn GetLastError, một điểm tốt), nó không dọn sạch bộ đệm chuỗi; và có lẽ một số người khác. Và như những người khác nói, bình luận cũng vô cùng thiếu.
Tôi thấy dễ sử dụng nhất: cd $ home \ Desktop \
Trong trường hợp của tôi, tôi cần phải lấy tên người dùng để cho phép tập lệnh thay đổi đường dẫn, tức là. c: \ người dùng \% tên người dùng%. Tôi cần bắt đầu tập lệnh bằng cách thay đổi đường dẫn đến màn hình của người dùng. Tôi đã có thể làm điều này, với sự giúp đỡ từ phía trên và những nơi khác, bằng cách sử dụng applet vị trí get.
Bạn có thể có một cách khác, hoặc thậm chí tốt hơn để làm điều đó, nhưng điều này làm việc cho tôi:
$ Path = Nhận vị trí
Đặt vị trí $ Path \ Desktop
Nếu bạn đã quen với lô, bạn có thể gọi
$user=$(cmd.exe /c echo %username%)
Điều này về cơ bản đánh cắp đầu ra từ những gì bạn sẽ nhận được nếu bạn có một tệp bó chỉ với "echo% username%".
$(...)
là người thừa thãi: $a = cmd.exe /c echo %username%
hoạt động, b) nó không phải là di động, c) nó không thực sự trả lời câu hỏi làm thế nào để làm điều đó trong powershell, nó trả lời làm thế nào để làm điều đó trong dos, và nó tốt hơn là cho một người đàn ông một cái cần câu hơn là cho anh ta một con cá, ví dụ 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}
Trong trường hợp của tôi, tôi cần phải lấy tên người dùng để cho phép tập lệnh thay đổi đường dẫn, tức là. c:\users\%username%\
. Tôi cần bắt đầu tập lệnh bằng cách thay đổi đường dẫn đến màn hình của người dùng. Tôi đã có thể làm điều này, với sự giúp đỡ từ phía trên và những nơi khác, bằng cách sử dụng applet vị trí get .
Bạn có thể có một cách khác, hoặc thậm chí tốt hơn để làm điều đó, nhưng điều này làm việc cho tôi:
$Path = Get-Location
Set-Location $Path\Desktop
Set-Location Desktop
. ( Get-Location
chỉ trả về vị trí hiện tại, ẩn Set-Location
với đường dẫn tương đối.)
$env:username
lấy tên người dùng từ biến môi trường tương ứng.