উইন্ডোজ পাওয়ারশেলের বর্তমান ব্যবহারকারীর নামটি কীভাবে পাব?
উইন্ডোজ পাওয়ারশেলের বর্তমান ব্যবহারকারীর নামটি কীভাবে পাব?
উত্তর:
আমি এটি খুঁজে পেয়েছি:
$env:UserName
এছাড়াও আছে:
$env:UserDomain
$env:ComputerName
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
$env:USERNAME
ব্যবহারকারীর দ্বারা পরিবর্তন করা যেতে পারে তবে এটি করে বোকা বানানো হবে না।
আমি ভেবেছিলাম প্রদত্ত উত্তরগুলি সংক্ষিপ্ত করে তুলনা করা মূল্যবান হবে।
(সহজ / সংক্ষিপ্ত / স্মরণীয় বিকল্প)
[Environment]::UserName
- @ থমাসব্র্যাট$env:username
- @Eoinwhoami
- @ গ্যালাকোটর(আরও নির্ভরযোগ্য বিকল্প)
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
- @ মার্কসিমন(পাওয়ারশেল ইনস্ট্যান্স ব্যবহারকারী ব্যবহারকারীর নাম বাদে)
$(Get-WMIObject -class Win32_ComputerSystem | select username).username
- এই অন্যান্য ফোরামে @ টুওনঅফ@ মারক সিম্যানের উত্তর সম্পর্কে কেভিন প্যাঙ্কোর মন্তব্য অন্য যে কোনও বিভাগের মধ্যে একটি বেছে নেওয়ার বিষয়ে আলোচনা করেছে:
[উইন্ডোজ অ্যাক্সেস টোকেন পদ্ধতির] সর্বাধিক সুরক্ষিত উত্তর, কারণ $ 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"
[Environment]::UserName
জন্য সেরা বিকল্প, কারণ এটি ক্রস প্ল্যাটফর্মের কাজ করে। whoami
এছাড়াও এটি কাজ করে বলে মনে whoami
হচ্ছে তবে প্ল্যাটফর্মে যে সরঞ্জামটি পাওয়া যাচ্ছে তার উপর নির্ভর করে ।
$env:USERNAME
উৎপন্ন করে SYSTEM
যখন, যদি না আমি চালানোর হিসাবে প্রশাসক [Environment]::UserName]
উৎপাদনের আমার ব্যবহারকারী নাম উভয় ক্ষেত্রেই।
Get-WmiObject
পদ্ধতিটি আর pwsh এ কাজ করে না বলে মনে হচ্ছে । এমনকি সামঞ্জস্যতা মডিউল এবং Microsoft.PowerShell.Management
সেটিতে সেমিডলেট রয়েছে আমদানির চেষ্টা করেছিল । কোন ধারণা কি ঘটছে?
আমি হোয়ামি কমান্ডটি ফেলে দিতে চাই , যা মূলত %USERDOMAIN%\%USERNAME%
অন্যান্য উত্তরে প্রস্তাবিত হিসাবে কাজ করার জন্য একটি দুর্দান্ত নাম ।
Write-Host "current user:"
Write-Host $(whoami)
$env:USERNAME
ব্যবহারকারীর দ্বারা পরিবর্তন করা যেতে পারে, কিন্তু এটি করে বোকা বানানো হবে না।
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
)
whoami
একটি নির্বাহযোগ্য। এটিকে পাওয়ারশেল থেকে সরানো যাবে না। এটা তোলে সম্ভাব্য উইন্ডোজ থেকে সরানো যেতে পারে, কিন্তু এটা অ-ন্যানো উইন্ডোজ সার্ভার 2012 হিসাবে এখনও
[Environment]::UserName
কেবল ব্যবহারকারীর নাম ফেরত দেয়। উদাহরণস্বরূপ বব
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
ব্যবহারকারীর নামটি প্রদান করে, যেখানে উপযুক্ত যেখানে এটির ডোমেন দ্বারা উপসর্গ করা হয়। উদাহরণস্বরূপ SOMEWHERENICE \ বব
আমি $env:username
অতীতে ব্যবহার করেছি , তবে একজন সহকর্মী ইঙ্গিত করেছেন যে এটি পরিবেশের পরিবর্তনশীল এবং এটি ব্যবহারকারী দ্বারা পরিবর্তন করা যেতে পারে এবং যদি আপনি সত্যিকারের বর্তমান ব্যবহারকারীর নামটি পেতে চান তবে আপনার এটি বিশ্বাস করা উচিত নয়।
আমি মার্ক সিমেনের উত্তরটিকে সমর্থন করতে চাই: [সিস্টেম.সিকিউরিটি.প্রিন্সিপাল।উন্ডোসআইডেন্টিটি] :: গেটকন্টেন্ট () নাম
তবে আমাকে অনুমতি দেওয়া হচ্ছে না। মার্কের উত্তরের সাথে, আপনার যদি কেবল ব্যবহারকারীর নাম প্রয়োজন হয় তবে আপনার সিস্টেমটি পার্স করে দিতে হতে পারে, এটি ফিরে আসে hostname\username
এবং ডোমেন অ্যাকাউন্টগুলিতে ডোমেন যোগ হওয়া মেশিনে এটি ফিরে আসবে domain\username
।
whoami.exe
এটি উইন্ডোজের সমস্ত সংস্করণে উপস্থিত না থাকায় আমি ব্যবহার করব না এবং এটি অন্য বাইনারিকে কল করে এবং কিছু সুরক্ষা দলকে ফিট দিতে পারে।
এখন যে পাওয়ারশেল কোর (ওরফে ভি 6) প্রকাশিত হয়েছে এবং লোকেরা ক্রস-প্ল্যাটফর্মের স্ক্রিপ্ট লিখতে চাইতে পারে, এখানে অনেক উত্তর উইন্ডোজ ব্যতীত অন্য কিছুতে কাজ করবে না।
[Environment]::UserName
আপনি যদি আপনার কোডটিতে প্ল্যাটফর্ম সনাক্তকরণ এবং বিশেষ কেসিং যুক্ত করতে না চান তবে পাওয়ারশেল কোর দ্বারা সমর্থিত সমস্ত প্ল্যাটফর্মগুলিতে বর্তমান ব্যবহারকারীর নামটি পাওয়ার সেরা উপায় বলে মনে হয়।
$username=( ( Get-WMIObject -class Win32_ComputerSystem | Select-Object -ExpandProperty username ) -split '\\' )[1]
$username
দ্বিতীয় ব্যবহারকারীর নাম শুধুমাত্র আপনি কপি করে পেস্ট করুন ডিসপ্লে শুধুমাত্র কাজের জন্য।
আমি কোনও অ্যাড-টাইপ ভিত্তিক উদাহরণ দেখিনি । এখানে অ্যাডাপি 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()
UNLEN+1
, এবং UNLEN
এটি 256), এটি গেটউজারনেম থেকে ফিরে আসা কোনও ত্রুটি উপেক্ষা করে (এর মাধ্যমে) এটি getLastError সংরক্ষণ করে, একটি ভাল পয়েন্ট), এটি স্ট্রিং বাফারটি পরিষ্কার করে না; এবং সম্ভবত কিছু অন্য। এবং অন্যরা যেমন বলেছে, মন্তব্যগুলি খুব খারাপভাবে অনুপস্থিত।
আমি ব্যবহার করা সবচেয়ে সহজ: সিডি $ হোম \ ডেস্কটপ \
আমার ক্ষেত্রে, স্ক্রিপ্টটিকে পথ পরিবর্তন করতে সক্ষম করার জন্য আমার ব্যবহারকারীর নামটি পুনরুদ্ধার করা দরকার। C: \ ব্যবহারকারীরা \% ব্যবহারকারীর নাম%। আমি ব্যবহারকারীদের ডেস্কটপে পথ পরিবর্তন করে স্ক্রিপ্টটি শুরু করা দরকার। গেট-লোকেশন অ্যাপলেট ব্যবহার করে উপরে এবং অন্য কোথাও সহায়তা নিয়ে আমি এটি করতে সক্ষম হয়েছি।
এটি করার আরও ভাল উপায় আপনার কাছে থাকতে পারে তবে এটি আমার পক্ষে কাজ করেছে:
$ পথ = গেট-লোকেশন
সেট-অবস্থান $ পথ \ ডেস্কটপ
আপনি যদি ব্যাচ করতে অভ্যস্ত হন, আপনি কল করতে পারেন
$user=$(cmd.exe /c echo %username%)
এটি আপনার কাছে কেবল "প্রতিধ্বনি% ব্যবহারকারী নাম%" সহ একটি ব্যাচ ফাইল থাকলে আপনি কী পাবেন তা আউটপুটটি চুরি করে।
$(...)
অতিশয়: $a = cmd.exe /c echo %username%
কাজ করেন, খ) এটি বহনযোগ্য নয়, গ) এটি কীভাবে পাওয়ারশেলে করবেন সে প্রশ্নের উত্তর দেয় না, এটি ডসের ক্ষেত্রে কীভাবে করা যায় তার উত্তর দেয়, এবং এটি কোনও মানুষকে মাছ দেওয়ার চেয়ে মাছ ধরার খুঁটি দেওয়া ভাল 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}
আমার ক্ষেত্রে, স্ক্রিপ্টটিকে পথ পরিবর্তন করতে সক্ষম করার জন্য আমার ব্যবহারকারীর নামটি পুনরুদ্ধার করা দরকার। c:\users\%username%\
। আমি ব্যবহারকারীদের ডেস্কটপে পথ পরিবর্তন করে স্ক্রিপ্টটি শুরু করা দরকার। উপরের এবং অন্য কোথাও সহায়তায় আমি এটি করতে সক্ষম হয়েছি -লোকেশনগেট অ্যাপলেট ।
এটি করার আরও ভাল উপায় আপনার কাছে থাকতে পারে তবে এটি আমার পক্ষে কাজ করেছে:
$Path = Get-Location
Set-Location $Path\Desktop
Set-Location Desktop
। ( Get-Location
কেবলমাত্র বর্তমান অবস্থানটি প্রত্যাবর্তন করে যা Set-Location
আপেক্ষিক পথের সাথে অন্তর্ভুক্ত))
$env:username
হ'ল সংশ্লিষ্ট পরিবেশ পরিবর্তনশীল থেকে ব্যবহারকারীর নাম পুনরুদ্ধার করা।