উইন্ডোজ পাওয়ারশেলের বর্তমান ব্যবহারকারীর নামটি কীভাবে পাব?


উত্তর:


397

আমি এটি খুঁজে পেয়েছি:

$env:UserName

এছাড়াও আছে:

$env:UserDomain
$env:ComputerName

10
একটি দ্রুত এবং নোংরা বিকল্প $env:usernameহ'ল সংশ্লিষ্ট পরিবেশ পরিবর্তনশীল থেকে ব্যবহারকারীর নাম পুনরুদ্ধার করা।
গিলারমুও

7
আমি মনে করি $ env: ব্যবহারকারীর নাম এবং [পরিবেশ] :: ব্যবহারকারীর নাম উভয়ই একই জিনিসকে নির্দেশ করছে।
সিফাস

16
আপনার নিজের প্রশ্নের উত্তর দিতে ফিরে আসার জন্য ধন্যবাদ। কেউ যখন নিজেরাই নিজের উত্তরটি খুঁজে বের করেন এবং কেবল উত্তর দেন, "কিছু মনে করবেন না, তা পেয়ে গেছেন!"
ম্যাট ডিট্রলিও

6
@MattDiTrolio যে অবশ্যই হতাশাজনক, কিন্তু আপনি কি মনে করেন সেখানে কিছুই যে এর চেয়ে বেশি হতাশাজনক ?!
কোড জকি

5
পছন্দ করেছেন চিরকালের ইতিহাসে নয়। :)
ম্যাট ডিট্রালিও

180
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name

16
এটি সর্বাধিক সুরক্ষিত উত্তর কারণ $env:USERNAMEব্যবহারকারীর দ্বারা পরিবর্তন করা যেতে পারে তবে এটি করে বোকা বানানো হবে না।
কেভিন প্যাঙ্কো

6
@ কেভিনপ্যাঙ্কো সত্য, তবে আপনি আপনার ব্যবহারকারীর উপর বিশ্বাস রাখতে পারবেন না, এমন আরও অনেক দার্শনিক প্রশ্ন রয়েছে যা জিজ্ঞাসা করা দরকার। ;-)
জেপাহ

4
এই পদ্ধতিতে ডোমেনের নাম এবং ব্যবহারকারীর নাম অন্তর্ভুক্ত রয়েছে। আপনার খেলায় একাধিক ডোমেন থাকলে অবশ্যই অবশ্যই উপকারী।
রায়ান গেটস

আশানুরূপ কাজ করে। Url ঠিকানা সংরক্ষণের জন্য পরীক্ষিত T
মারেক বার

এছাড়াও, এটি পাওয়ারশেল 6 তেও কাজ করতে দেখায়, এর অর্থ এটি ক্রস প্ল্যাটফর্ম (। নেট স্ট্যান্ডার্ড) সামঞ্জস্যপূর্ণ। যখন আমি নামস্থানটি দেখলাম তখনই আমি এটি প্রশ্নবিদ্ধ হওয়ার পরে এটি উল্লেখ করার মতো ভেবেছিলাম।
মারাত্মক ডগ

120

আমি ভেবেছিলাম প্রদত্ত উত্তরগুলি সংক্ষিপ্ত করে তুলনা করা মূল্যবান হবে।

যদি আপনি পরিবেশের পরিবর্তনশীল অ্যাক্সেস করতে চান :

(সহজ / সংক্ষিপ্ত / স্মরণীয় বিকল্প)

  • [Environment]::UserName - @ থমাসব্র্যাট
  • $env:username - @Eoin
  • whoami - @ গ্যালাকোটর

আপনি যদি উইন্ডোজ অ্যাক্সেস টোকেন অ্যাক্সেস করতে চান :

(আরও নির্ভরযোগ্য বিকল্প)

  • [System.Security.Principal.WindowsIdentity]::GetCurrent().Name - @ মার্কসিমন

আপনি যদি লগ ইন ব্যবহারকারীর নাম চান

(পাওয়ারশেল ইনস্ট্যান্স ব্যবহারকারী ব্যবহারকারীর নাম বাদে)


তুলনা

@ মারক সিম্যানের উত্তর সম্পর্কে কেভিন প্যাঙ্কোর মন্তব্য অন্য যে কোনও বিভাগের মধ্যে একটি বেছে নেওয়ার বিষয়ে আলোচনা করেছে:

[উইন্ডোজ অ্যাক্সেস টোকেন পদ্ধতির] সর্বাধিক সুরক্ষিত উত্তর, কারণ $ env: USERNAME ব্যবহারকারীর দ্বারা পরিবর্তন করা যেতে পারে, তবে এটি করে বোকা বানানো হবে না।

সংক্ষেপে, এনভায়রনমেন্ট ভেরিয়েবল বিকল্পটি আরও সংযোগযুক্ত, এবং উইন্ডোজ অ্যাক্সেস টোকেন বিকল্পটি আরও নির্ভরযোগ্য।

আমাকে পাওয়ার্ক শেল স্ক্রিপ্টে @ মার্ক সিম্যানের উইন্ডোজ অ্যাক্সেস টোকেন পদ্ধতির ব্যবহার করতে হয়েছিল যে আমি একটি সি # অ্যাপ্লিকেশন থেকে ছদ্মবেশে চলছি।

সি # অ্যাপ্লিকেশনটি আমার ব্যবহারকারীর অ্যাকাউন্ট দিয়ে চালিত হয় এবং এটি পাওয়ার অ্যাকাউন্টের স্ক্রিপ্টটিকে পরিষেবা অ্যাকাউন্ট হিসাবে চালায়। C # থেকে পাওয়ারশেল স্ক্রিপ্টটি যেভাবে চালাচ্ছি তার একটি সীমাবদ্ধতার কারণে, পাওয়ারশেল উদাহরণটি আমার অ্যাকাউন্ট অ্যাকাউন্টের পরিবেশের ভেরিয়েবলগুলি ব্যবহার করে, যদিও এটি পরিষেবা অ্যাকাউন্ট ব্যবহারকারী হিসাবে চালিত হয়।

এই সেটআপে, পরিবেশের পরিবর্তনশীল বিকল্পগুলি আমার অ্যাকাউন্টের নাম ফিরিয়ে দেয় এবং উইন্ডোজ অ্যাক্সেস টোকেন বিকল্পটি পরিষেবার অ্যাকাউন্টটির নাম (যা আমি চাইছিলাম) ফেরত দেয় এবং লগ ইন করা ব্যবহারকারী বিকল্পটি আমার অ্যাকাউন্টের নাম ফেরত দেয়।


পরীক্ষামূলক

এছাড়াও, আপনি যদি বিকল্পগুলি নিজের সাথে তুলনা করতে চান তবে এখানে একটি স্ক্রিপ্ট রয়েছে যা আপনি অন্য ব্যবহারকারী হিসাবে স্ক্রিপ্ট চালাতে ব্যবহার করতে পারেন। একটি শংসাপত্রীয় বস্তু পেতে আপনাকে গেট-ক্রেডেনশিয়াল সেমিডলেট ব্যবহার করতে হবে এবং তারপরে এই স্ক্রিপ্টটি অন্য ব্যবহারকারী হিসাবে আর্গুমেন্ট হিসাবে চালানোর জন্য স্ক্রিপ্টটি দিয়ে চালাতে হবে, এবং শংসাপত্রের বস্তুটি আর্গুমেন্ট 2 হিসাবে।

ব্যবহার:

$cred = Get-Credential UserTo.RunAs
Run-AsUser.ps1 "whoami; pause" $cred
Run-AsUser.ps1 "[System.Security.Principal.WindowsIdentity]::GetCurrent().Name; pause" $cred

রান- 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"

ম্যাক ওএস এক্স এবং লিনাক্সের পাওয়ারশেল 6 এর [Environment]::UserNameজন্য সেরা বিকল্প, কারণ এটি ক্রস প্ল্যাটফর্মের কাজ করে। whoamiএছাড়াও এটি কাজ করে বলে মনে whoamiহচ্ছে তবে প্ল্যাটফর্মে যে সরঞ্জামটি পাওয়া যাচ্ছে তার উপর নির্ভর করে ।
ফ্লোরিয়ান ফিল্ডহাউস

Windows এ PowerShell 6 জন্য, $env:USERNAMEউৎপন্ন করে SYSTEMযখন, যদি না আমি চালানোর হিসাবে প্রশাসক [Environment]::UserName]উৎপাদনের আমার ব্যবহারকারী নাম উভয় ক্ষেত্রেই।
কেএফসনে 21

1
Get-WmiObjectপদ্ধতিটি আর pwsh এ কাজ করে না বলে মনে হচ্ছে । এমনকি সামঞ্জস্যতা মডিউল এবং Microsoft.PowerShell.Managementসেটিতে সেমিডলেট রয়েছে আমদানির চেষ্টা করেছিল । কোন ধারণা কি ঘটছে?
not2qubit

সঠিক। এটা তোলে উপর পরাজিত হয়ে যান হয়েছিল পান-CimInstance বেশ কিছুদিনের কর্মক্ষমতা কারণে ফিরে ... এবং Cim হয়েছে ক্রস সামঞ্জস্য কারণে V6 মধ্যে WMI উপর ব্যবহৃত হবে। আপনি যদি জিডব্লিউএমআই সহ একটি কমান্ড দেখতে পান তবে পরিবর্তে আপনি জিসিআইএম করতে পারেন কিনা তা পরীক্ষা করে দেখুন।
Hicsy

105

$env:username সবচেয়ে সহজ উপায়


আপনি এটিকে এটি নির্ধারণ করতে পারেন, এবং ডিরেক্টরিগুলি তৈরি করতে পারেন এবং কী নয়।
Druogans

51

আমি হোয়ামি কমান্ডটি ফেলে দিতে চাই , যা মূলত %USERDOMAIN%\%USERNAME%অন্যান্য উত্তরে প্রস্তাবিত হিসাবে কাজ করার জন্য একটি দুর্দান্ত নাম ।

Write-Host "current user:"
Write-Host $(whoami)

এটি পিএস সংস্করণ ২ এ আমার জন্য কাজ করে? আপনি কি বলছেন এটি পিএস 3 এ বাদ পড়েছে? সি: \> পাওয়ারশেল উইন্ডোজ পাওয়ারশেল কপিরাইট (সি) ২০০৯ মাইক্রোসফ্ট কর্পোরেশন। সমস্ত অধিকার সংরক্ষিত. পিএস সি: \> হোয়ামি মাইডোমাইন \
মাইউজারনেম

2
$env:USERNAMEব্যবহারকারীর দ্বারা পরিবর্তন করা যেতে পারে, কিন্তু এটি করে বোকা বানানো হবে না।
কেভিন পানকো

3
ইন্টারেক্টিভ ব্যবহারের জন্য হোয়ামি জয়ী। এটি যথেষ্ট সংক্ষিপ্ত যে এসও :-) ছাড়াই এটি কীভাবে টাইপ করব তা আমি মনে করতে পারি:
আইয়েন স্যামুয়েল ম্যাকলিন এল্ডার

ন্যানো সার্ভারে কোনও জিনিস নয়। এটি স্ক্রিপ্টগুলিতে ব্যবহার করবেন না, সঠিক জিনিসটি করুন ( [System.Security.Principal.WindowsIdentity]::GetCurrent().Name)
তবুও অন্য একজন ব্যবহারকারী

whoamiএকটি নির্বাহযোগ্য। এটিকে পাওয়ারশেল থেকে সরানো যাবে না। এটা তোলে সম্ভাব্য উইন্ডোজ থেকে সরানো যেতে পারে, কিন্তু এটা অ-ন্যানো উইন্ডোজ সার্ভার 2012 হিসাবে এখনও
jpmc26

37

[Environment]::UserNameকেবল ব্যবহারকারীর নাম ফেরত দেয়। উদাহরণস্বরূপ বব [System.Security.Principal.WindowsIdentity]::GetCurrent().Name ব্যবহারকারীর নামটি প্রদান করে, যেখানে উপযুক্ত যেখানে এটির ডোমেন দ্বারা উপসর্গ করা হয়। উদাহরণস্বরূপ SOMEWHERENICE \ বব


12

আমি $env:usernameঅতীতে ব্যবহার করেছি , তবে একজন সহকর্মী ইঙ্গিত করেছেন যে এটি পরিবেশের পরিবর্তনশীল এবং এটি ব্যবহারকারী দ্বারা পরিবর্তন করা যেতে পারে এবং যদি আপনি সত্যিকারের বর্তমান ব্যবহারকারীর নামটি পেতে চান তবে আপনার এটি বিশ্বাস করা উচিত নয়।

আমি মার্ক সিমেনের উত্তরটিকে সমর্থন করতে চাই: [সিস্টেম.সিকিউরিটি.প্রিন্সিপাল।উন্ডোসআইডেন্টিটি] :: গেটকন্টেন্ট () নাম

তবে আমাকে অনুমতি দেওয়া হচ্ছে না। মার্কের উত্তরের সাথে, আপনার যদি কেবল ব্যবহারকারীর নাম প্রয়োজন হয় তবে আপনার সিস্টেমটি পার্স করে দিতে হতে পারে, এটি ফিরে আসে hostname\usernameএবং ডোমেন অ্যাকাউন্টগুলিতে ডোমেন যোগ হওয়া মেশিনে এটি ফিরে আসবে domain\username

whoami.exeএটি উইন্ডোজের সমস্ত সংস্করণে উপস্থিত না থাকায় আমি ব্যবহার করব না এবং এটি অন্য বাইনারিকে কল করে এবং কিছু সুরক্ষা দলকে ফিট দিতে পারে।


1
যেহেতু ওপি উইন্ডোজ-পাওয়ারশেল সম্পর্কে জিজ্ঞাসা করেছিল, এটি বৈধ, তবে [Environment]::UserNameকম টাইপিং, স্বতন্ত্র $env:usernameএবং ক্রস-প্ল্যাটফর্মের জন্য: দেখুন পেস্টবিন.
com

12

এখন যে পাওয়ারশেল কোর (ওরফে ভি 6) প্রকাশিত হয়েছে এবং লোকেরা ক্রস-প্ল্যাটফর্মের স্ক্রিপ্ট লিখতে চাইতে পারে, এখানে অনেক উত্তর উইন্ডোজ ব্যতীত অন্য কিছুতে কাজ করবে না।

[Environment]::UserName আপনি যদি আপনার কোডটিতে প্ল্যাটফর্ম সনাক্তকরণ এবং বিশেষ কেসিং যুক্ত করতে না চান তবে পাওয়ারশেল কোর দ্বারা সমর্থিত সমস্ত প্ল্যাটফর্মগুলিতে বর্তমান ব্যবহারকারীর নামটি পাওয়ার সেরা উপায় বলে মনে হয়।


10

এখানে অন্যের কাজের উপর কেবল বিল্ডিং:

[String] ${stUserDomain},[String]  ${stUserAccount} = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name.split("\")

1
$username=( ( Get-WMIObject -class Win32_ComputerSystem | Select-Object -ExpandProperty username ) -split '\\' )[1]

$username

দ্বিতীয় ব্যবহারকারীর নাম শুধুমাত্র আপনি কপি করে পেস্ট করুন ডিসপ্লে শুধুমাত্র কাজের জন্য।


$ পূর্ণ নাম = পান- WMIObject -class Win32_ComputerSystem | সিলেক্ট-অবজেক্ট-এক্সপ্যানডপ্রপার্টি ইউজারনেম $ ব্যবহারকারীর নাম = $ পূর্ণ নাম ep প্রতিস্থাপন ("DOMAIN \", "") $ ব্যবহারকারীর নাম
क्লেটনটন.নিচলস

-1

আমি কোনও অ্যাড-টাইপ ভিত্তিক উদাহরণ দেখিনি । এখানে অ্যাডাপি 32.ডিল থেকে সরাসরি getUserName ব্যবহার করা হচ্ছে।

$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()

1
এই কোডটি কী করছে এবং সংক্ষিপ্ত পদ্ধতির মধ্যে কেন এটি বেশি কার্যকর হবে তা দয়া করে ব্যাখ্যা করুন।
বেনিয়ামিন হাববার্ড

@ বেনজামিনহবার্ড প্রশ্নটি সবচেয়ে সংক্ষিপ্ততম পদ্ধতির জন্য জিজ্ঞাসা করে না, এটি পাওয়ারশেল দিয়ে কীভাবে কীর্তি অর্জন করবে তা জিজ্ঞাসা করে। এটি কৌশলটির ভিন্নভাবে কাজ করে তারপরে অন্যান্য উদাহরণগুলিতে dll এর ভিতরে ফাংশনটি কল করে এবং .NET অ্যাক্সেসের জন্য অ্যাড-টাইপ পদ্ধতিটি ব্যবহার করে।
নাকল-ড্রাগার

1
যদিও এটি একটি অভিনব কোড ব্লক, আমি যদি জানতাম যে হেক এটি কী করছে। আপনি মন্তব্য দিয়ে এটি বয়ান করতে পারেন, সম্ভবত? ধন্যবাদ!
jpaugh

1
আমি প্রায় উত্সাহ দিতে চেয়েছিলাম, যেহেতু আমি প্রস্তাবটির যোগ্যতা দেখেছি। তবুও কোডটির কিছু ত্রুটি রয়েছে: এটি একটি নতুন নেমস্পেসের প্রবর্তন করে, এটি একটি ম্যাজিক ধ্রুবক ব্যবহার করে ()৪) যার মূল্য চিকিত্সার নির্ধারিত নয় (হওয়া উচিত UNLEN+1, এবং UNLENএটি 256), এটি গেটউজারনেম থেকে ফিরে আসা কোনও ত্রুটি উপেক্ষা করে (এর মাধ্যমে) এটি getLastError সংরক্ষণ করে, একটি ভাল পয়েন্ট), এটি স্ট্রিং বাফারটি পরিষ্কার করে না; এবং সম্ভবত কিছু অন্য। এবং অন্যরা যেমন বলেছে, মন্তব্যগুলি খুব খারাপভাবে অনুপস্থিত।
এন্টোইনেল

-1

আমি ব্যবহার করা সবচেয়ে সহজ: সিডি $ হোম \ ডেস্কটপ \

আপনাকে বর্তমান ব্যবহারকারী ডেস্কটপে নিয়ে যাবে

আমার ক্ষেত্রে, স্ক্রিপ্টটিকে পথ পরিবর্তন করতে সক্ষম করার জন্য আমার ব্যবহারকারীর নামটি পুনরুদ্ধার করা দরকার। C: \ ব্যবহারকারীরা \% ব্যবহারকারীর নাম%। আমি ব্যবহারকারীদের ডেস্কটপে পথ পরিবর্তন করে স্ক্রিপ্টটি শুরু করা দরকার। গেট-লোকেশন অ্যাপলেট ব্যবহার করে উপরে এবং অন্য কোথাও সহায়তা নিয়ে আমি এটি করতে সক্ষম হয়েছি।

এটি করার আরও ভাল উপায় আপনার কাছে থাকতে পারে তবে এটি আমার পক্ষে কাজ করেছে:

$ পথ = গেট-লোকেশন

সেট-অবস্থান $ পথ \ ডেস্কটপ


হোম ডিরেক্টরি ভিত্তিতে কোনও অনুমান করা কেবলমাত্র নির্দিষ্ট নির্দিষ্ট শর্তে কাজ করতে বাধ্য।
রাউল সালিনাস-মন্টেইগুডো

আপনি যদি পাওয়ারশেল টার্মিনালে কাজ করছেন এবং দ্রুত আপনি কী ব্যবহারকারী তা সন্ধান করতে চান, তবে "ls।" টাইপ করলে কৌশলটি করা উচিত। উপরের পোস্টারের মতো, ব্যতিক্রমগুলিও থাকতে পারে এবং এটি অবশ্যই স্ক্রিপ্টগুলির পক্ষে ভাল নয়, তাই এ ক্ষেত্রে এডওয়ার্ড পুরের উদাহরণটি ব্যবহার করুন।
মিঃবার্টা

-2

আপনি যদি ব্যাচ করতে অভ্যস্ত হন, আপনি কল করতে পারেন

$user=$(cmd.exe /c echo %username%)

এটি আপনার কাছে কেবল "প্রতিধ্বনি% ব্যবহারকারী নাম%" সহ একটি ব্যাচ ফাইল থাকলে আপনি কী পাবেন তা আউটপুটটি চুরি করে।


1
আমি নিম্নমানের কারণ: ক) আপনিই $(...)অতিশয়: $a = cmd.exe /c echo %username%কাজ করেন, খ) এটি বহনযোগ্য নয়, গ) এটি কীভাবে পাওয়ারশেলে করবেন সে প্রশ্নের উত্তর দেয় না, এটি ডসের ক্ষেত্রে কীভাবে করা যায় তার উত্তর দেয়, এবং এটি কোনও মানুষকে মাছ দেওয়ার চেয়ে মাছ ধরার খুঁটি দেওয়া ভাল powershell puts environment variables into $env, so %username% = $env:username
কেএফসনে

-2
  1. get-content "cm.txt"
  2. write-host "entr file name" $file = read-host get-content $file
  3. $content = get-content "cm.txt"
  4. $content = get-content "cn.txt" for each ($line in $count) {write-host $line}

$ বিষয়বস্তু = পান-সামগ্রী "সেমি। টেক্সট" ---- $ গণনা = 0 ----- পূর্বাভাস ($ গণনায় $ লাইন) ---- {$ গণনা = $ গণনা + 1} ---- লিখুন $ গণনা: -host "আপনি এই অনেক লাইন আছে"
ammy

1. $ a = $ com1, $ com2 ------ লিখন-হোস্ট "সেন্টিমিটার নাম লিখুন" ---- $ সি = রিডহস্ট ----- রাইটিং-হোস্ট $ এ [$ সি -1]। ব্যবহারকারীর নাম , লেখ হোস্ট $ A [$ সি-1] .password
ammy

$ com1 = নতুন-অবজেক্ট PSobject ----- $ com1 = $ com1 | অ্যাড-সদস্য noteproperty -name ব্যবহারকারীর নাম -value 2016
ammy

1
আপনার নিজের মন্তব্যে মন্তব্য হিসাবে কোড যুক্ত করার কোনও কারণ নেই?
aldr

1
কেন আপনি নিজের উত্তরটি সম্পাদনা করবেন না এবং কোডটি এমন মন্তব্যে ভাগ করার পরিবর্তে যুক্ত করবেন না যেখানে নুনি তা বুঝতে পারবে না?
aldr

-4

আমার ক্ষেত্রে, স্ক্রিপ্টটিকে পথ পরিবর্তন করতে সক্ষম করার জন্য আমার ব্যবহারকারীর নামটি পুনরুদ্ধার করা দরকার। c:\users\%username%\। আমি ব্যবহারকারীদের ডেস্কটপে পথ পরিবর্তন করে স্ক্রিপ্টটি শুরু করা দরকার। উপরের এবং অন্য কোথাও সহায়তায় আমি এটি করতে সক্ষম হয়েছি -লোকেশনগেট অ্যাপলেট ।

এটি করার আরও ভাল উপায় আপনার কাছে থাকতে পারে তবে এটি আমার পক্ষে কাজ করেছে:

$Path = Get-Location

Set-Location $Path\Desktop

1
স্ট্যাক ওভারফ্লোতে স্বাগতম ! এটি সমান Set-Location Desktop। ( Get-Locationকেবলমাত্র বর্তমান অবস্থানটি প্রত্যাবর্তন করে যা Set-Locationআপেক্ষিক পথের সাথে অন্তর্ভুক্ত))
jpaugh
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.