diff --git a/.github/osv-scanner.toml b/.github/osv-scanner.toml index ed4371f..d2aa67e 100644 --- a/.github/osv-scanner.toml +++ b/.github/osv-scanner.toml @@ -1,8 +1,9 @@ # Advisories this repository has read and settled, for OSV-Scanner. # # THE SCANNER READS THIS FILE FOR THE FILES IN THIS FOLDER ONLY. It does not carry it into -# subfolders - the scanner's own documentation for the pinned v2.6.0 says so, and it was measured on -# 2026-10-16: the same entry one folder down left the advisory in the report. That is on purpose +# subfolders - the scanner's own documentation for v2.6.0 says so, and it was measured with v2.6.0 +# on 2026-10-16 and again with the pinned v2.7.0 on 2026-10-26: the same entry one folder up from +# the list left both advisories in the report, and in this folder it filtered them. That is on purpose # here, because the canary files in osv-scanner/ must keep coming back vulnerable. The one file # .github/workflows/osv-scanner.yml scans in this folder is semgrep.installed.txt, which it writes # from what pip would install for semgrep, so every entry below is about a package semgrep brings. @@ -15,4 +16,9 @@ [[IgnoredVulns]] id = "GHSA-84m7-p3x7-pcfv" ignoreUntil = 2026-11-16 -reason = "mcp 1.29.0 is here only because semgrep requires it, and CI runs semgrep as semgrep scan. The advisory is about an MCP server over Streamable HTTP, and nothing in this repository serves MCP. The fix is mcp 1.30.0, but semgrep 1.180.0 and 1.181.0 both require mcp==1.29.0 exactly, so pip cannot install it. Remove this entry once a semgrep release allows mcp 1.30.0 or later." +reason = "mcp 1.29.0 is here only because semgrep requires it, and CI runs semgrep as semgrep scan. The advisory is about an MCP server over Streamable HTTP, and nothing in this repository serves MCP. The fix is mcp 1.30.0, but every semgrep release from 1.180.0 to 1.182.1 requires mcp==1.29.0 exactly (read on the package index on 2026-10-26), so pip cannot install it. Remove this entry once a semgrep release allows mcp 1.30.0 or later." + +[[IgnoredVulns]] +id = "GHSA-xcq7-p3pf-p88h" +ignoreUntil = 2026-11-16 +reason = "opentelemetry-api 1.37.0 is here only because semgrep requires opentelemetry-api~=1.37.0, which excludes every release from 1.38 up. The advisory is a denial of service through a slow regular expression in TraceState.from_header, reached when server instrumentation passes an incoming tracestate header to the propagator. CI runs semgrep as a one-off command line scan with metrics off (.github/workflows/security.yml, the semgrep scan step), so it serves no HTTP and receives no such header. The fix is opentelemetry-api 1.45.1, which pip cannot install next to the pinned semgrep. Remove this entry once a semgrep release allows opentelemetry-api 1.45.1 or later." diff --git a/.github/osv-scanner/Dockerfile b/.github/osv-scanner/Dockerfile index ccb9475..d61fa52 100644 --- a/.github/osv-scanner/Dockerfile +++ b/.github/osv-scanner/Dockerfile @@ -11,7 +11,9 @@ # the `docker` entry in .github/dependabot.yml proposes the next release of the scanner here, # tag and digest together, after the same seven days of cooldown as everything else. # -# v2.6.0 rather than v2.7.0, which was the newest release on 2026-10-14 but two days old - the -# cooldown above applied to the first pin as well. The digest is the multi-architecture index, -# read from ghcr.io the same day. The image's entry point is the scanner itself. -FROM ghcr.io/google/osv-scanner:v2.6.0@sha256:afd838850ac1a0fcc15ff4a041dc9ba11123c3f0d2666217a5f0fcf9222b55fa +# v2.7.0 is the newest release on 2026-10-26, published on 2026-10-12, so it is past the cooldown +# above. The first pin was v2.6.0 because v2.7.0 was two days old on 2026-10-14 and the cooldown +# applied to that pin as well. The digest is the multi-architecture index, read from ghcr.io on +# 2026-10-26, and the same read on v2.6.0 returned the digest that was pinned here before, which +# is how the reading was checked. The image's entry point is the scanner itself. +FROM ghcr.io/google/osv-scanner:v2.7.0@sha256:4f3b7e2c64b9d38a5febc5a7e4a3dfef1d1362f726dea7a2ef4762b46469fcd0 diff --git a/.github/requirements-semgrep.txt b/.github/requirements-semgrep.txt index 32359a9..e0a708d 100644 --- a/.github/requirements-semgrep.txt +++ b/.github/requirements-semgrep.txt @@ -12,30 +12,41 @@ # release turning a green branch red on a commit that touched nothing teaches everybody to # ignore the check. # -# THE GATE'S NUMBERS ARE MEASURED WITH THE VERSION BELOW. Measured again on 2026-10-14, when the -# version moved from 1.178.0 to 1.180.0, the newest stable release on the package index that day, -# with the pull request that brought snapshots to the window. That pull request's own Semgrep run, -# on the merge of commit c8ea3cb into main with `--config p/default`: semgrep ran 374 rules over -# 399 files and reported zero findings, and the gate read zero errors at level error and 419 rules. -# The two rule counts are one run read two ways - 374 is semgrep's own summary, 419 the timing -# list in the report, which is what the gate counts. The run on the commit before, d39889d, gave -# the same numbers. Before them the numbers here were from 1.177.0 on 2026-09-22 (131 rules, 301 -# files), and 1.178.0 was never measured. Moving this line means measuring again rather than -# assuming the report will look the same. +# THE GATE'S NUMBERS ARE MEASURED WITH THE VERSION BELOW. Measured again on 2026-10-26, when the +# version moved from 1.180.0 to 1.181.0. The run is the Semgrep job of Dependabot's own pull request +# for that bump (run 40335089268, on the merge of its branch into main with `--config p/default`): +# the gate read zero blocking findings, zero scan errors, 680 files and 424 rules, and semgrep's own +# summary said it loaded 1074 code rules, ran 379 of them and found nothing. The two rule counts +# are one run read two ways - 379 is semgrep's own summary, 424 the timing list in the report, +# which is what the gate counts. For 1.180.0 on 2026-10-14 the same pair was 374 and 419, over 399 +# files. Before that the numbers here were from 1.177.0 on 2026-09-22 (131 rules, 301 files), and +# 1.178.0 was never measured. Moving this line means measuring again rather than assuming the +# report will look the same. # -# 399 OF 743 FILES, AND THAT IS NOT A FAULT. Semgrep's own default ignore patterns exclude -# tests/, which is 336 of this repository's files, one picture is skipped for being over 1 MB, and -# the seven other pictures are not among the 399 either - that last part is the arithmetic of the -# count, not a line semgrep prints. So a healthy run of this tree reads src/, site/, .github/, -# packaging/ and the root - about four hundred files - and a collapse to a handful is the shape of -# a scan that ran somewhere else. The gate prints the number on every run for exactly that reason. +# WHY 1.181.0 AND NOT THE NEWEST. 1.182.0 was uploaded on 2026-10-20 and 1.182.1 on 2026-10-22, +# both inside the seven days of cooldown .github/dependabot.yml asks for, and 1.181.0 (uploaded on +# 2026-10-14) is the release whose run is measured above. Choosing a newer one would mean pinning a +# version nobody has measured here. It would also not change the entries in osv-scanner.toml, because +# on 2026-10-26 the package index showed every release from 1.180.0 to 1.182.1 requiring the same +# mcp==1.29.0 and opentelemetry-api~=1.37.0. +# +# 680 OF 1081 FILES, AND THAT IS NOT A FAULT. Semgrep's own default ignore patterns exclude +# tests/, which is 393 of this repository's files on main at 845c8a4, and one picture is skipped +# for being over 1 MB. That leaves 688 and the scan read 680, so eight files are neither tests nor +# the oversized picture - the other pictures are what is left, but that is the arithmetic of the +# count and not a line semgrep prints. The same eight were left over on 2026-10-14, when the scan +# read 399 of 407 files outside tests/. The growth since then is 281 files added outside tests/, +# of which 221 are the language pages and strings in site/. So a healthy run of this tree reads +# src/, site/, .github/, packaging/ and the root - about seven hundred files today - and a collapse +# to a handful is the shape of a scan that ran somewhere else. The gate prints the number on every +# run for exactly that reason. # # Licence, read on 2026-09-22 from that version's own metadata rather than recalled, and read again -# on 2026-10-14 from 1.180.0's, which says the same. The +# on 2026-10-26 from 1.181.0's, which says the same. The # package index reports `license_expression` as LGPL-2.1-or-later, with the older `license` # field null and no licence classifier - which is the modern shape and worth saying, because a # reader checking the field that used to hold this would find nothing and could conclude the # licence was unstated. It analyses the source tree in CI and is never linked into anything this # project ships, so it creates no distribution obligation - see THIRD-PARTY-NOTICES.md for what # does. -semgrep==1.180.0 +semgrep==1.181.0 diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 3dd5be9..c805710 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -87,7 +87,7 @@ jobs: persist-credentials: false - name: Initialise CodeQL - uses: github/codeql-action/init@24c54180a607b1449ed407dd24f251e4e9147c8d # v4.38.3 + uses: github/codeql-action/init@9b3254085494b55a0f7c4c2b3d2d52cc712ce370 # v4.39.1 with: languages: ${{ matrix.language }} # Nothing is compiled. build.yml already builds this product on a Windows runner on the @@ -97,6 +97,6 @@ jobs: queries: security-extended - name: Analyse - uses: github/codeql-action/analyze@24c54180a607b1449ed407dd24f251e4e9147c8d # v4.38.3 + uses: github/codeql-action/analyze@9b3254085494b55a0f7c4c2b3d2d52cc712ce370 # v4.39.1 with: category: /language:${{ matrix.language }} diff --git a/.github/workflows/osv-scanner.yml b/.github/workflows/osv-scanner.yml index 5a50fbe..92d6254 100644 --- a/.github/workflows/osv-scanner.yml +++ b/.github/workflows/osv-scanner.yml @@ -70,7 +70,7 @@ jobs: # The Python the Semgrep job uses. pip's answer depends on it - starlette, for one, asks for # a different minimum from Python 3.14 on. - - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 + - uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0 with: python-version: '3.14' @@ -199,7 +199,7 @@ jobs: # Its own category, so these alerts never replace CodeQL's and CodeQL's never replace these. # An upload with no results is what closes an alert that a merged fix made obsolete. - - uses: github/codeql-action/upload-sarif@24c54180a607b1449ed407dd24f251e4e9147c8d # v4.38.3 + - uses: github/codeql-action/upload-sarif@9b3254085494b55a0f7c4c2b3d2d52cc712ce370 # v4.39.1 with: sarif_file: ${{ runner.temp }}/osv/osv.sarif category: osv-scanner diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml index e751969..262b077 100644 --- a/.github/workflows/security.yml +++ b/.github/workflows/security.yml @@ -57,7 +57,7 @@ jobs: # step inherits. The scanner reads this tree, including this file. persist-credentials: false - - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 + - uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0 with: python-version: '3.14' @@ -133,7 +133,7 @@ jobs: comment-summary-in-pr: never fail-on-severity: low - - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 + - uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0 with: python-version: '3.14' diff --git a/Directory.Build.props b/Directory.Build.props index 265e7bb..b2682e7 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -205,7 +205,7 @@ dependency on Roslyn, recorded in ADR-15. Nothing that ships carries it. --> - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/THIRD-PARTY-NOTICES.md b/THIRD-PARTY-NOTICES.md index 9ab1ff7..f95265a 100644 --- a/THIRD-PARTY-NOTICES.md +++ b/THIRD-PARTY-NOTICES.md @@ -122,13 +122,13 @@ list should be able to tell at a glance which side of the line each one falls on | Package | Licence | What it does | |---|---|---| -| Microsoft.Windows.CsWin32 0.3.298 | MIT | Generates the P/Invoke declarations at build time. Marked `PrivateAssets="all"`, so the generator itself does not ship - the code it generates is compiled into ours | -| Meziantou.Analyzer 3.0.138 | MIT, (c) Gérald Barré | Extra analyser rules | -| xunit 2.9.3, xunit.runner.visualstudio 3.1.4 | Apache-2.0 | Test framework | -| Microsoft.NET.Test.Sdk 17.14.1 | MIT | Test host | +| Microsoft.Windows.CsWin32 0.3.363 | MIT | Generates the P/Invoke declarations at build time. Marked `PrivateAssets="all"`, so the generator itself does not ship - the code it generates is compiled into ours | +| Meziantou.Analyzer 3.0.313 | MIT, (c) Gérald Barré | Extra analyser rules | +| xunit.v3.mtp-off 4.0.2, xunit.runner.visualstudio 4.0.1 | Apache-2.0 | Test framework | +| Microsoft.NET.Test.Sdk 18.11.0 | MIT | Test host | | coverlet.collector 6.0.4 | MIT | Coverage collection | -| CsCheck 4.7.0 | Apache-2.0 | Property-based testing | -| Microsoft.Windows.SDK.Win32Metadata 70.0.11-preview | Windows SDK licence terms | The machine-readable description of the Win32 API that CsWin32 reads to generate from. Arrives as its dependency rather than being asked for | +| CsCheck 4.9.1 | Apache-2.0 | Property-based testing | +| Microsoft.Windows.SDK.Win32Metadata 71.0.30-preview | Windows SDK licence terms | The machine-readable description of the Win32 API that CsWin32 reads to generate from. Arrives as its dependency rather than being asked for | | Microsoft.Windows.WDK.Win32Metadata 0.13.25-experimental | Windows SDK licence terms | The same thing for the driver-facing half of the API | | Microsoft.Windows.SDK.Win32Docs 0.1.42-alpha | Windows SDK licence terms | The documentation text CsWin32 copies into the generated declarations, so that hovering a generated method shows what Microsoft says about it | diff --git a/site/assets/style.css b/site/assets/style.css index 5457dd1..2da7fc3 100644 --- a/site/assets/style.css +++ b/site/assets/style.css @@ -879,6 +879,17 @@ html:lang(vi) { --lh-body: 1.7; --lh-tight: 1.3; } */ html:lang(ko) { word-break: keep-all; } +/* + Japanese has no spaces, so by default a line may break between any two characters, and at 375 px + the headlines split inside words (measured on the home page: the verb for "search" and the word + for "preview" were each cut after their first character). auto-phrase breaks between phrases instead. It is supported by Chrome and Edge from 119 and not + by Firefox, and Safari has it only in its preview (MDN compatibility data, read 2026-10-26). A + browser without it drops the declaration and keeps the default, so for them nothing changes. It + is limited to Japanese because that is the language it was measured on: Chrome would also apply it + to Korean, which already breaks at its spaces through the rule above. +*/ +html:lang(ja) { word-break: auto-phrase; } + @media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } } diff --git a/site/i18n/ar.json b/site/i18n/ar.json new file mode 100644 index 0000000..99777dd --- /dev/null +++ b/site/i18n/ar.json @@ -0,0 +1,95 @@ +{ + "_translated_from": "1867e30d6665", + "_note": "The site's chrome, and the sentences beside the tables the generator builds out of the program. Every language file carries exactly these keys - a missing one fails the build rather than falling back, because a page half in one language looks finished.", + + "chrome.skip": "انتقل إلى المحتوى", + "chrome.nav": "الموقع", + "chrome.language": "اللغة", + + "chrome.footer.product": "المنتج", + "chrome.footer.guides": "الأدلة", + "chrome.footer.project": "المشروع", + "chrome.footer.source": "الكود المصدري على GitHub", + "chrome.footer.releases": "الإصدارات", + "chrome.footer.issues": "متتبع المشكلات", + "chrome.footer.security": "الإبلاغ عن مشكلة أمنية", + "chrome.footer.support": "ادعم المشروع", + + "chrome.legal.licence": "Copyright (C) 2026 DonislawDev. صدر بموجب رخصة جنو العمومية (GNU General Public License)، الإصدار 3. بُني بسير عمل يساعد فيه الذكاء الاصطناعي.", + "chrome.legal.trademark": "{{product}} لا ارتباط له بشركة Microsoft، ولم تؤيده ولم ترعه. وWindows علامة تجارية لمجموعة شركات Microsoft، ويُستخدم الاسم هنا فقط لبيان ما تديره الأداة.", + "chrome.legal.privacy": "لا يضع هذا الموقع أي ملفات تعريف ارتباط، ولا يشغّل أي سكربتات، ولا يحمّل شيئًا من أي مكان آخر.", + + "table.head.code": "الرمز", + "table.head.meaning": "المعنى", + "table.head.switch": "الخيار", + "table.head.what": "ما يفعله", + "table.head.where": "أين يعمل", + "table.head.field": "الحقل", + "table.head.asks": "يسأل عن", + "table.head.values": "القيم", + + "exit.ok": "تم، ووصل كل شيء إلى حيث كان ذاهبًا.", + "exit.runtime": "فشلت الأداة: لم تستطع فعل ما طُلب، لسبب يتعلق بالأداة لا بالخطة.", + "exit.usage": "كان سطر الأوامر خاطئًا. والأمر الذي يُكتب بخطأ يُقترح عليه ما قصدته غالبًا.", + "exit.incomplete": "كانت الخطة سليمة، وعملت، وشيء فيها لم يصل إلى حيث كان ذاهبًا: رفض المدير، أو لم تملك الجلسة الصلاحيات عليه.", + "exit.interrupted": "أوقف شخص التشغيل بيده. رمز غير صفري حتى لو وصلت كل الخطوات، حتى لا يعامل أي غلاف برمجي التشغيل المقطوع على أنه نظيف.", + "exit.differences": "جرت مقارنة ووجدت أن التكوين انحرف: عنصر أُضيف أو أُزيل، أو عنصر مضبوط بشكل مختلف. وحالة التشغيل وحدها ليست انحرافًا. وذلك فقط مع --exit-code، لأن الانحراف هو ما صُنعت هذه الأداة لإيجاده، وإيجاده ليس فشلًا.", + + "switch.query": "ضيّق القائمة بلغة الاستعلام.", + "switch.signatures": "اقرأ من وقّع كل ملف تنفيذي وهل يثق به Windows. يستغرق ذلك عدة ثوانٍ على جهاز كامل، لذا هو معطّل ما لم يُطلب، والاستعلام عن التوقيعات يشغّله من تلقاء نفسه.", + "switch.memory": "اقرأ ما تستخدمه عملية كل عنصر يعمل. معطّل افتراضيًا لأنه قياس وليس إعدادًا: فهو يختلف بعد ثانية.", + "switch.required-by": "اقرأ العناصر التي تتعطل إن أُوقف عنصر ما، يُسأل Windows عنها مباشرة بدل استنتاجها مما يعلنه كل شيء. نداء واحد لكل عنصر، لذا هو معطّل ما لم يُطلب. وshow وsnapshot create يقرآنه في كل مرة.", + "switch.follow-network": "دع الأداة تصل إلى خارج هذا الجهاز أصلًا: مسار تشغيل يقع على مشاركة شخص آخر، وشهادة لا يحملها هذا الجهاز أصلًا. معطّل افتراضيًا للأمان: فمشاركة واحدة لا يمكن الوصول إليها تكلّف إحدى وعشرين ثانية وتُصادَق باسم من شغّلها، وجلب شهادة اتصال بطرف ثالث في منتصف قائمة عادية. وبدونه يُفحص التوقيع مقابل ما هو موجود هنا، والنتيجة التي ربما سببها عدم النظر تُبلَّغ على أنها غير مقروءة لا على أنها حكم.", + "switch.force": "في kill، أنهِ العملية فورًا دون أن تسأل بلطف، فتعرض المعاينة خطوة واحدة بدل اثنتين. وفي snapshot create، استبدل لقطة موجودة بالفعل، ولا يُستبدل ملف ليس لقطة أبدًا.", + "switch.restart": "في kill، أعد العنصر بعد ذهاب العملية، مع كل ما كان يشاركها.", + "switch.stop": "في start-type، ومع disabled وحده، أوقف العنصر في الخطة نفسها بعد كتابة الإعداد. فنوع بدء التشغيل يغيّر الإقلاع التالي ولا يغيّر شيئًا الآن، لذا فبدونه يظل عنصر يعمل ومضبوط على disabled يعمل.", + "switch.full": "في show، اطبع أيضًا الحقول الفارغة فعلًا. والحقل الذي لم يستطع أحد قراءته يُطبع في الحالتين.", + "switch.components": "في license، حوّل الإشعار إلى كل مكوّن داخل هذا الملف التنفيذي مع إصداره وترخيصه ومصدره. وهي المجموعة نفسها التي تحملها قائمة المواد المنشورة بجانب التنزيل، لأن الاثنتين تُولَّدان من سجل واحد.", + "switch.json": "المستند نفسه، مقروءًا للآلة، على الإخراج القياسي.", + "switch.note": "ما أُخذت اللقطة من أجله، محفوظًا داخل الملف.", + "switch.exit-code": "انتهِ بالرمز 5 عندما يختلف التكوين: عنصر أُضيف أو أُزيل، أو عنصر مضبوط بشكل مختلف. وحالة التشغيل وحدها لا تُحتسب. معطّل افتراضيًا، حتى لا يتعثر سكربت يريد طباعة الفروق فقط حين يجد بعضها.", + "switch.live": "قارن الملف بهذا الجهاز كما هو الآن، بدل مقارنته بملف ثانٍ.", + "switch.timing": "كم استغرق كل جزء من القراءة، على الخطأ القياسي.", + "switch.dry-run": "اطبع الخطة ولا تغيّر شيئًا. هي الخطة نفسها التي يشغّلها التنفيذ: لا يوجد مسار برمجي ثانٍ للتنفيذ الفعلي.", + "switch.dependents": "ضع الخدمات التي ستتعطل في الخطة خطوات قائمة بذاتها.", + "switch.timeout": "كم يمكن لخطوة واحدة أن تمضي دون تقدم قبل أن يُتخلى عنها، ويُعاد العدّ كلما أبلغت الخدمة عن تقدم. ستون ثانية ما لم تقل غير ذلك. والخدمة التي تواصل الإبلاغ عن تقدم تبقى مراقبة ما دام ذلك لازمًا. وانتهاء المهلة هو نهاية المراقبة لا فشل، ويقول التقرير أين تُرك العنصر.", + + "field.name": "اسم الخدمة، الذي يعرّفها به Windows", + "field.display": "الاسم المعروض، كما يكتبه هذا Windows", + "field.description": "ما يقوله العنصر عن نفسه", + "field.type": "أي نوع من العناصر هو", + "field.peruser": "هل هو من العائلات الخاصة بكل مستخدم التي ينسخ Windows منها نسخة لكل جلسة", + "field.status": "ما الذي يفعله الآن", + "field.start": "ما الذي يفعله المدير به عند الإقلاع التالي", + "field.account": "الحساب الذي يعمل به، كما يكتبه المدير", + "field.pid": "العملية التي يعمل فيها", + "field.trigger": "شرط يبدؤه أو يوقفه", + "field.path": "سطر الأوامر الذي يشغّله المدير", + "field.file": "هل الملف الذي يشغّله موجود على القرص", + "field.signed": "رأي Windows في توقيع الملف، دون فحص الإلغاء", + "field.publisher": "من وقّع الملف، ولا يثبت ذلك إلا بتوقيع موثوق", + "field.privilege": "امتياز يطلبه العنصر", + "field.dependson": "ما يحتاجه هذا العنصر", + "field.requiredby": "ما الذي يتعطل إن توقف هذا", + "field.sidtype": "نوع SID الخدمة", + "field.sddl": "security descriptor، نصًا", + "field.memory": "ما تستخدمه عمليته", + "field.mismatch": "تكوين وحالة لا يتفقان", + + "field.open.name": "نص", + "field.open.display": "نص", + "field.open.description": "نص", + "field.open.account": "نص، مثل localsystem", + "field.open.pid": "رقم: 1234 أو >1000 أو 100-200", + "field.open.path": "نص", + "field.open.publisher": "نص", + "field.open.privilege": "نص، مثل SeDebugPrivilege", + "field.open.dependson": "اسم خدمة", + "field.open.requiredby": "اسم خدمة", + "field.open.sddl": "نص", + "field.open.memory": "حجم مع وحدة: 500MB أو >1GB أو 100MB-1GB", + + "reserved.any": "توجد قيمة، أيًا كانت", + "reserved.none": "لا توجد قيمة فعلًا: العنصر لا يملك واحدة", + "reserved.unreadable": "لم تستطع الأداة قراءة هذا الحقل، أو لم تقرأه، وهذا سؤال لا يستطيع services.msc حتى طرحه" +} diff --git a/site/i18n/hi.json b/site/i18n/hi.json new file mode 100644 index 0000000..5a93edc --- /dev/null +++ b/site/i18n/hi.json @@ -0,0 +1,95 @@ +{ + "_translated_from": "1867e30d6665", + "_note": "The site's chrome, and the sentences beside the tables the generator builds out of the program. Every language file carries exactly these keys - a missing one fails the build rather than falling back, because a page half in one language looks finished.", + + "chrome.skip": "सामग्री पर जाएँ", + "chrome.nav": "साइट", + "chrome.language": "भाषा", + + "chrome.footer.product": "उत्पाद", + "chrome.footer.guides": "गाइड", + "chrome.footer.project": "प्रोजेक्ट", + "chrome.footer.source": "GitHub पर सोर्स", + "chrome.footer.releases": "रिलीज़", + "chrome.footer.issues": "इश्यू ट्रैकर", + "chrome.footer.security": "सुरक्षा समस्या की रिपोर्ट करना", + "chrome.footer.support": "प्रोजेक्ट का समर्थन करें", + + "chrome.legal.licence": "Copyright (C) 2026 DonislawDev. GNU जनरल पब्लिक लाइसेंस, संस्करण 3 के तहत जारी। AI-सहायता प्राप्त वर्कफ़्लो से बनाया गया।", + "chrome.legal.trademark": "{{product}} का Microsoft से कोई संबंध नहीं है, न Microsoft ने इसका समर्थन किया है और न इसे प्रायोजित किया है। Windows, Microsoft समूह की कंपनियों का ट्रेडमार्क है, और यह नाम यहाँ केवल यह बताने के लिए इस्तेमाल हुआ है कि टूल किसे प्रबंधित करता है।", + "chrome.legal.privacy": "यह साइट कोई कुकी सेट नहीं करती, कोई स्क्रिप्ट नहीं चलाती और कहीं और से कुछ लोड नहीं करती।", + + "table.head.code": "कोड", + "table.head.meaning": "अर्थ", + "table.head.switch": "विकल्प", + "table.head.what": "यह क्या करता है", + "table.head.where": "यह कहाँ काम करता है", + "table.head.field": "फ़ील्ड", + "table.head.asks": "किसके बारे में पूछता है", + "table.head.values": "मान", + + "exit.ok": "हो गया, और सब कुछ वहाँ पहुँचा जहाँ उसे जाना था।", + "exit.runtime": "टूल विफल हुआ: जो माँगा गया वह नहीं कर सका, किसी ऐसे कारण से जो योजना के बारे में नहीं बल्कि टूल के बारे में है।", + "exit.usage": "कमांड लाइन गलत थी। गलत टाइप किए गए कमांड को वह कमांड सुझाया जाता है जो आपका शायद मतलब था।", + "exit.incomplete": "योजना सही थी, वह चली, और उसमें कुछ वहाँ नहीं पहुँचा जहाँ उसे जाना था: प्रबंधक ने मना कर दिया, या सत्र के पास उसके अधिकार नहीं थे।", + "exit.interrupted": "किसी ने रन को हाथ से रोक दिया। शून्य से अलग, तब भी जब हर चरण पहुँच चुका हो, ताकि कोई रैपर बीच में रोके गए रन को साफ़ न माने।", + "exit.differences": "एक तुलना चली और उसने पाया कि कॉन्फ़िगरेशन ड्रिफ्ट हुआ: कोई प्रविष्टि जुड़ी या हटी, या किसी का सेटअप अलग है। सिर्फ़ चलने की स्थिति ड्रिफ्ट नहीं है। केवल --exit-code के साथ, क्योंकि ड्रिफ्ट ढूँढना ही इस टूल का काम है, और उसे ढूँढना विफलता नहीं है।", + + "switch.query": "क्वेरी भाषा से सूची को सीमित करें।", + "switch.signatures": "पढ़ें कि हर निष्पादन योग्य फ़ाइल पर किसने हस्ताक्षर किए और Windows उस पर भरोसा करता है या नहीं। पूरी मशीन पर इसमें कई सेकंड लगते हैं, इसलिए माँगे बिना यह बंद रहता है, और हस्ताक्षरों के बारे में क्वेरी इसे अपने आप चालू कर देती है।", + "switch.memory": "पढ़ें कि हर चल रही प्रविष्टि की प्रक्रिया क्या इस्तेमाल कर रही है। यह डिफ़ॉल्ट रूप से बंद है क्योंकि यह सेटिंग नहीं, एक माप है: एक सेकंड बाद यह अलग होता है।", + "switch.required-by": "पढ़ें कि किसी एक को रोकने पर कौन सी प्रविष्टियाँ टूटती हैं, यह Windows से सीधे पूछा जाता है, इस पर आधारित नहीं कि सब कुछ खुद क्या घोषित करता है। हर प्रविष्टि के लिए एक कॉल, इसलिए माँगे बिना बंद। show और snapshot create इसे हर बार पढ़ते हैं।", + "switch.follow-network": "टूल को इस मशीन से बाहर पहुँचने दें: किसी और के शेयर पर रहने वाला लॉन्च पथ, और ऐसा प्रमाणपत्र जो इस मशीन के पास पहले से नहीं है। सुरक्षा के लिए यह डिफ़ॉल्ट रूप से बंद है: एक पहुँच से बाहर शेयर की कीमत इक्कीस सेकंड है और वह उसी खाते के रूप में प्रमाणीकृत होता है जिसने इसे चलाया, और प्रमाणपत्र लाना एक सामान्य सूची के बीच में किसी तीसरे पक्ष से कनेक्शन है। इसके बिना हस्ताक्षर की जाँच उसके विरुद्ध होती है जो यहाँ है, और ऐसा नतीजा जो न देखने की वजह से हुआ हो सकता है उसे फ़ैसले के रूप में नहीं, बिना पढ़े के रूप में रिपोर्ट किया जाता है।", + "switch.force": "kill पर, प्रक्रिया को विनम्रता से कहे बिना तुरंत खत्म करें, तब पूर्वावलोकन में दो के बजाय एक चरण दिखता है। snapshot create पर, पहले से मौजूद स्नैपशॉट को बदल दें, और जो फ़ाइल स्नैपशॉट नहीं है उसे कभी नहीं बदला जाता।", + "switch.restart": "kill पर, प्रक्रिया के चले जाने के बाद प्रविष्टि को वापस ले आएँ, उस सबके साथ जो उसे साझा करता था।", + "switch.stop": "start-type पर, और सिर्फ़ disabled के साथ, सेटिंग लिखे जाने के बाद उसी योजना में प्रविष्टि को रोक दें। स्टार्टअप प्रकार अगले बूट को बदलता है, अभी कुछ नहीं, इसलिए इसके बिना disabled पर सेट चल रही प्रविष्टि चलती रहती है।", + "switch.full": "show पर, वे फ़ील्ड भी छापें जो सचमुच खाली हैं। जिस फ़ील्ड को कोई पढ़ नहीं सका वह दोनों हाल में छापा जाता है।", + "switch.components": "license पर, नोटिस को इस निष्पादन योग्य फ़ाइल के अंदर के हर घटक में बदल दें, उसके संस्करण, उसके लाइसेंस और उसके स्रोत के साथ। वही सेट जो डाउनलोड के बगल में प्रकाशित सामग्री-सूची में है, क्योंकि दोनों एक ही रजिस्टर से बनते हैं।", + "switch.json": "वही दस्तावेज़, मशीन-पठनीय, स्टैंडर्ड आउटपुट पर।", + "switch.note": "स्नैपशॉट किस लिए लिया गया था, फ़ाइल के अंदर रखा जाता है।", + "switch.exit-code": "कॉन्फ़िगरेशन अलग होने पर कोड 5 के साथ खत्म करें: कोई प्रविष्टि जुड़ी या हटी, या किसी का सेटअप अलग है। सिर्फ़ चलने की स्थिति नहीं गिनी जाती। डिफ़ॉल्ट रूप से बंद, ताकि वह स्क्रिप्ट जो सिर्फ़ अंतर छपवाना चाहती है, कुछ अंतर मिलने से बाधित न हो।", + "switch.live": "फ़ाइल की तुलना इस मशीन से करें जैसी वह अभी है, दूसरी फ़ाइल से करने के बजाय।", + "switch.timing": "पढ़ने के हर हिस्से में कितना समय लगा, स्टैंडर्ड एरर पर।", + "switch.dry-run": "योजना छापें और कुछ न बदलें। यह वही योजना है जो निष्पादन चलाता है: असली काम के लिए कोई दूसरा कोड पथ नहीं है।", + "switch.dependents": "जो सेवाएँ टूटतीं उन्हें योजना में अलग चरणों के रूप में रखें।", + "switch.timeout": "एक चरण बिना प्रगति के कितनी देर तक चल सकता है, उसके बाद उसे छोड़ दिया जाता है, और सेवा हर बार प्रगति बताती है तो गिनती फिर से शुरू होती है। जब तक आप कुछ और न कहें, साठ सेकंड। जो सेवा प्रगति बताती रहती है उस पर उतनी देर नज़र रखी जाती है जितनी लगे। समय खत्म होना निगरानी का अंत है, विफलता नहीं, और रिपोर्ट बताती है कि प्रविष्टि कहाँ छोड़ी गई।", + + "field.name": "सेवा का नाम, जिससे Windows उसे पहचानता है", + "field.display": "प्रदर्शन नाम, जैसा यह Windows उसे लिखता है", + "field.description": "प्रविष्टि अपने बारे में क्या कहती है", + "field.type": "यह किस तरह की प्रविष्टि है", + "field.peruser": "क्या यह उन प्रति-उपयोगकर्ता परिवारों में से एक है जिनकी Windows हर सत्र के लिए एक प्रति बनाता है", + "field.status": "यह अभी क्या कर रही है", + "field.start": "प्रबंधक अगले बूट पर इसके साथ क्या करता है", + "field.account": "वह खाता जिसके रूप में यह चलती है, जैसा प्रबंधक उसे लिखता है", + "field.pid": "वह प्रक्रिया जिसमें यह चल रही है", + "field.trigger": "एक शर्त जो इसे शुरू या बंद करती है", + "field.path": "वह कमांड लाइन जिसे प्रबंधक लॉन्च करता है", + "field.file": "क्या वह फ़ाइल जो यह चलाती है डिस्क पर है", + "field.signed": "फ़ाइल के हस्ताक्षर के बारे में Windows क्या सोचता है, निरस्तीकरण जाँचे बिना", + "field.publisher": "फ़ाइल पर किसने हस्ताक्षर किए, यह सिर्फ़ भरोसेमंद हस्ताक्षर से साबित होता है", + "field.privilege": "वह विशेषाधिकार जो प्रविष्टि माँगती है", + "field.dependson": "इसे क्या चाहिए", + "field.requiredby": "इसके रुकने पर क्या टूटता है", + "field.sidtype": "सेवा SID का प्रकार", + "field.sddl": "security descriptor, पाठ के रूप में", + "field.memory": "इसकी प्रक्रिया क्या इस्तेमाल कर रही है", + "field.mismatch": "कॉन्फ़िगरेशन और स्थिति जो आपस में मेल नहीं खातीं", + + "field.open.name": "पाठ", + "field.open.display": "पाठ", + "field.open.description": "पाठ", + "field.open.account": "पाठ, जैसे localsystem", + "field.open.pid": "एक संख्या: 1234, >1000, 100-200", + "field.open.path": "पाठ", + "field.open.publisher": "पाठ", + "field.open.privilege": "पाठ, जैसे SeDebugPrivilege", + "field.open.dependson": "एक सेवा का नाम", + "field.open.requiredby": "एक सेवा का नाम", + "field.open.sddl": "पाठ", + "field.open.memory": "इकाई के साथ एक आकार: 500MB, >1GB, 100MB-1GB", + + "reserved.any": "कोई मान है, चाहे जो भी हो", + "reserved.none": "सचमुच कोई मान नहीं है: प्रविष्टि के पास कोई नहीं है", + "reserved.unreadable": "टूल इस फ़ील्ड को पढ़ नहीं सका, या इसे पढ़ा नहीं है, जो ऐसा सवाल है जिसे services.msc पूछ भी नहीं सकता" +} diff --git a/site/i18n/th.json b/site/i18n/th.json new file mode 100644 index 0000000..9d58128 --- /dev/null +++ b/site/i18n/th.json @@ -0,0 +1,95 @@ +{ + "_translated_from": "1867e30d6665", + "_note": "The site's chrome, and the sentences beside the tables the generator builds out of the program. Every language file carries exactly these keys - a missing one fails the build rather than falling back, because a page half in one language looks finished.", + + "chrome.skip": "ข้ามไปที่เนื้อหา", + "chrome.nav": "เว็บไซต์", + "chrome.language": "ภาษา", + + "chrome.footer.product": "ผลิตภัณฑ์", + "chrome.footer.guides": "คู่มือ", + "chrome.footer.project": "โครงการ", + "chrome.footer.source": "ซอร์สบน GitHub", + "chrome.footer.releases": "รีลีส", + "chrome.footer.issues": "ตัวติดตามปัญหา", + "chrome.footer.security": "รายงานปัญหาความปลอดภัย", + "chrome.footer.support": "สนับสนุนโครงการ", + + "chrome.legal.licence": "Copyright (C) 2026 DonislawDev เผยแพร่ภายใต้ GNU General Public License เวอร์ชัน 3 สร้างด้วยขั้นตอนการทำงานที่มี AI ช่วย", + "chrome.legal.trademark": "{{product}} ไม่มีส่วนเกี่ยวข้อง ไม่ได้รับการรับรองหรือสนับสนุนโดย Microsoft Windows เป็นเครื่องหมายการค้าของกลุ่มบริษัท Microsoft และชื่อนี้ใช้ที่นี่เพียงเพื่อบอกว่าเครื่องมือจัดการอะไร", + "chrome.legal.privacy": "เว็บไซต์นี้ไม่ตั้งค่าคุกกี้ ไม่รันสคริปต์ และไม่โหลดอะไรจากที่อื่น", + + "table.head.code": "รหัส", + "table.head.meaning": "ความหมาย", + "table.head.switch": "ตัวเลือก", + "table.head.what": "ทำอะไร", + "table.head.where": "ใช้ได้ที่ไหน", + "table.head.field": "ฟิลด์", + "table.head.asks": "ถามเกี่ยวกับ", + "table.head.values": "ค่า", + + "exit.ok": "เสร็จแล้ว และทุกอย่างไปถึงที่หมาย", + "exit.runtime": "เครื่องมือล้มเหลว ทำสิ่งที่ถูกขอไม่ได้ ด้วยเหตุผลที่เกี่ยวกับตัวเครื่องมือไม่ใช่เกี่ยวกับแผน", + "exit.usage": "บรรทัดคำสั่งผิด คำสั่งที่พิมพ์ผิดจะได้รับคำแนะนำคำสั่งที่คุณน่าจะหมายถึง", + "exit.incomplete": "แผนดี รันแล้ว แต่บางอย่างในนั้นไปไม่ถึงที่หมาย ตัวจัดการปฏิเสธ หรือเซสชันไม่มีสิทธิ์", + "exit.interrupted": "มีคนหยุดการรันด้วยมือ ไม่เป็นศูนย์แม้ทุกขั้นตอนจะไปถึงที่หมายแล้ว เพื่อให้ wrapper ไม่ถือว่าการรันที่ถูกขัดจังหวะเป็นการรันที่สะอาด", + "exit.differences": "การเปรียบเทียบรันแล้วพบว่าการกำหนดค่าดริฟต์ มีรายการที่ถูกเพิ่มหรือลบ หรือรายการหนึ่งตั้งค่าต่างไป สถานะการทำงานอย่างเดียวไม่ใช่ดริฟต์ เฉพาะเมื่อใช้ --exit-code เพราะดริฟต์คือสิ่งที่เครื่องมือนี้มีไว้หา และการพบมันไม่ใช่ความล้มเหลว", + + "switch.query": "จำกัดรายชื่อให้แคบลงด้วยภาษาคิวรี", + "switch.signatures": "อ่านว่าใครลงลายเซ็นไฟล์ปฏิบัติการแต่ละไฟล์และ Windows เชื่อถือหรือไม่ ใช้เวลาหลายวินาทีทั้งเครื่อง จึงปิดไว้เว้นแต่จะขอ และคิวรีเกี่ยวกับลายเซ็นจะเปิดมันเอง", + "switch.memory": "อ่านว่ากระบวนการของแต่ละรายการที่กำลังทำงานใช้อะไรอยู่ ปิดไว้เป็นค่าเริ่มต้นเพราะเป็นการวัดไม่ใช่การตั้งค่า อีกวินาทีเดียวก็ต่างไปแล้ว", + "switch.required-by": "อ่านว่ารายการไหนจะเสียหายถ้าหยุดรายการหนึ่ง ถาม Windows โดยตรงแทนการสรุปจากสิ่งที่ทุกอย่างประกาศไว้ ต้องเรียกหนึ่งครั้งต่อรายการ จึงปิดไว้เว้นแต่จะขอ show และ snapshot create อ่านมันทุกครั้ง", + "switch.follow-network": "ให้เครื่องมือเอื้อมออกนอกเครื่องนี้ได้เลย พาธการเปิดใช้งานที่อยู่บนโฟลเดอร์แชร์ของคนอื่น และใบรับรองที่เครื่องนี้ยังไม่มี ปิดไว้เป็นค่าเริ่มต้นเพื่อความปลอดภัย โฟลเดอร์แชร์ที่เข้าไม่ถึงหนึ่งแห่งใช้เวลา 21 วินาทีและยืนยันตัวตนเป็นคนที่รัน และการดึงใบรับรองคือการเชื่อมต่อกับบุคคลที่สามกลางการแสดงรายชื่อปกติ ถ้าไม่มีมัน ลายเซ็นจะถูกตรวจกับสิ่งที่มีอยู่ที่นี่ และผลที่อาจเกิดจากการไม่ได้ดูจะถูกรายงานว่าไม่ได้อ่าน ไม่ใช่เป็นคำตัดสิน", + "switch.force": "บน kill คือจบกระบวนการทันทีโดยไม่ขอดีๆ ตัวอย่างจะแสดงหนึ่งขั้นตอนแทนที่จะเป็นสอง บน snapshot create คือแทนที่สแนปช็อตที่มีอยู่แล้ว ไฟล์ที่ไม่ใช่สแนปช็อตจะไม่ถูกแทนที่เลย", + "switch.restart": "บน kill คือนำรายการกลับมาเมื่อกระบวนการหายไปแล้ว พร้อมทุกอย่างที่ใช้กระบวนการร่วมกัน", + "switch.stop": "บน start-type และใช้ได้เฉพาะคู่กับ disabled คือหยุดรายการในแผนเดียวกันเมื่อเขียนการตั้งค่าแล้ว ประเภทการเริ่มต้นมีผลกับการบูตครั้งถัดไปและไม่มีผลตอนนี้ ถ้าไม่มีตัวเลือกนี้ รายการที่กำลังทำงานซึ่งตั้งเป็น disabled จะทำงานต่อไป", + "switch.full": "บน show คือพิมพ์ฟิลด์ที่ว่างจริงๆ ด้วย ฟิลด์ที่ไม่มีใครอ่านได้จะถูกพิมพ์เสมอ", + "switch.components": "บน license คือเปลี่ยนประกาศให้เป็นทุกคอมโพเนนต์ในไฟล์ปฏิบัติการนี้พร้อมเวอร์ชัน สัญญาอนุญาต และแหล่งที่มา ชุดเดียวกับที่รายการส่วนประกอบซึ่งเผยแพร่ข้างการดาวน์โหลดมี เพราะทั้งสองสร้างจากทะเบียนเดียวกัน", + "switch.json": "เอกสารเดียวกัน ในรูปแบบที่เครื่องอ่านได้ ที่ standard output", + "switch.note": "สแนปช็อตนี้สร้างเพื่ออะไร เก็บไว้ภายในไฟล์", + "switch.exit-code": "จบด้วยรหัส 5 เมื่อการกำหนดค่าต่างกัน มีรายการที่ถูกเพิ่มหรือลบ หรือรายการหนึ่งตั้งค่าต่างไป สถานะการทำงานอย่างเดียวไม่นับ ปิดไว้เป็นค่าเริ่มต้น เพื่อให้สคริปต์ที่ต้องการแค่พิมพ์ความแตกต่างไม่สะดุดเพราะพบความแตกต่าง", + "switch.live": "เปรียบเทียบไฟล์กับเครื่องนี้ในสภาพปัจจุบัน แทนที่จะเทียบกับไฟล์ที่สอง", + "switch.timing": "การอ่านแต่ละส่วนใช้เวลานานเท่าไร ที่ standard error", + "switch.dry-run": "พิมพ์แผนและไม่เปลี่ยนอะไร เป็นแผนเดียวกับที่การรันจริงทำ ไม่มีเส้นทางโค้ดที่สองสำหรับของจริง", + "switch.dependents": "ใส่บริการที่จะเสียหายลงในแผนเป็นขั้นตอนของตัวเอง", + "switch.timeout": "หนึ่งขั้นตอนอยู่ได้นานเท่าไรโดยไม่มีความคืบหน้าก่อนจะเลิกรอ นับใหม่ทุกครั้งที่บริการรายงานความคืบหน้า 60 วินาทีถ้าคุณไม่ระบุ บริการที่รายงานความคืบหน้าต่อเนื่องจะถูกเฝ้าดูตราบเท่าที่ต้องใช้ การหมดเวลาคือการสิ้นสุดการเฝ้าดู ไม่ใช่ความล้มเหลว และรายงานจะบอกว่ารายการถูกทิ้งไว้ที่ไหน", + + "field.name": "ชื่อบริการ ชื่อที่ Windows ใช้ระบุมัน", + "field.display": "ชื่อที่แสดง ตามที่ Windows เครื่องนี้สะกด", + "field.description": "สิ่งที่รายการบอกเกี่ยวกับตัวเอง", + "field.type": "รายการนี้เป็นชนิดไหน", + "field.peruser": "ใช่หรือไม่ที่เป็นหนึ่งในตระกูลต่อผู้ใช้ซึ่ง Windows สร้างสำเนาต่อเซสชัน", + "field.status": "ตอนนี้กำลังทำอะไรอยู่", + "field.start": "ตัวจัดการทำอะไรกับมันตอนบูตครั้งถัดไป", + "field.account": "บัญชีที่มันรัน ตามที่ตัวจัดการสะกด", + "field.pid": "กระบวนการที่มันรันอยู่", + "field.trigger": "เงื่อนไขที่เริ่มหรือหยุดมัน", + "field.path": "บรรทัดคำสั่งที่ตัวจัดการเรียกใช้", + "field.file": "ไฟล์ที่มันรันอยู่บนดิสก์หรือไม่", + "field.signed": "Windows คิดอย่างไรกับลายเซ็นของไฟล์ โดยไม่ตรวจการเพิกถอน", + "field.publisher": "ใครลงลายเซ็นไฟล์ พิสูจน์ได้ด้วยลายเซ็นที่เชื่อถือได้เท่านั้น", + "field.privilege": "สิทธิพิเศษที่รายการขอ", + "field.dependson": "สิ่งที่รายการนี้ต้องการ", + "field.requiredby": "สิ่งที่เสียหายถ้ารายการนี้หยุด", + "field.sidtype": "ประเภท SID ของบริการ", + "field.sddl": "security descriptor ในรูปแบบข้อความ", + "field.memory": "สิ่งที่กระบวนการของมันใช้อยู่", + "field.mismatch": "การกำหนดค่าและสถานะที่ขัดแย้งกัน", + + "field.open.name": "ข้อความ", + "field.open.display": "ข้อความ", + "field.open.description": "ข้อความ", + "field.open.account": "ข้อความ เช่น localsystem", + "field.open.pid": "ตัวเลข: 1234, >1000, 100-200", + "field.open.path": "ข้อความ", + "field.open.publisher": "ข้อความ", + "field.open.privilege": "ข้อความ เช่น SeDebugPrivilege", + "field.open.dependson": "ชื่อบริการ", + "field.open.requiredby": "ชื่อบริการ", + "field.open.sddl": "ข้อความ", + "field.open.memory": "ขนาดพร้อมหน่วย: 500MB, >1GB, 100MB-1GB", + + "reserved.any": "มีค่า ไม่ว่าค่าอะไรก็ตาม", + "reserved.none": "ไม่มีค่าจริงๆ รายการนั้นไม่มีค่า", + "reserved.unreadable": "เครื่องมืออ่านฟิลด์นี้ไม่ได้ หรือยังไม่ได้อ่าน ซึ่งเป็นคำถามที่ services.msc ถามไม่ได้ด้วยซ้ำ" +} diff --git a/site/pages/404/ar.html b/site/pages/404/ar.html new file mode 100644 index 0000000..013134b --- /dev/null +++ b/site/pages/404/ar.html @@ -0,0 +1,30 @@ + + + + + +
+
+ 404 +

هذه الصفحة غير موجودة هنا

+

العنوان لا يطابق أي شيء في هذا الموقع. ولم يُحذف شيء لكي يحدث ذلك: العناوين هنا لا تتغير، لأن صفحة منقولة ستكسر كل رابط أشار إليها يومًا.

+ +
+
+ +
+
+

ما جاء إليه الناس عادةً

+
+

تنزيل

ملفان تنفيذيان قائمان بذاتهما، أو برنامج تثبيت.

+

لغة الاستعلام

كل حقل وقيمة يمكنك البحث بهما.

+

مرجع CLI

كل خيار وكل رمز خروج.

+

اللقطات والانحراف

ما الذي تغيّر على هذا الجهاز منذ أمس.

+

الأسئلة والحدود

بما في ذلك ما ترفضه الأداة بحكم التصميم.

+

الكود المصدري

كل شيء على GitHub بموجب GPL-3.0.

+
+
+
diff --git a/site/pages/404/hi.html b/site/pages/404/hi.html new file mode 100644 index 0000000..27d51e8 --- /dev/null +++ b/site/pages/404/hi.html @@ -0,0 +1,30 @@ + + + + + +
+
+ 404 +

वह पृष्ठ यहाँ नहीं है

+

यह पता इस साइट पर किसी भी चीज़ से मेल नहीं खाता। ऐसा होने के लिए कुछ भी हटाया नहीं गया। यहाँ पते बदलते नहीं, क्योंकि स्थानांतरित किया गया पृष्ठ हर उस लिंक को तोड़ देगा जो कभी उसकी ओर इशारा करता था।

+ +
+
+ +
+
+

लोग आमतौर पर किसलिए आते थे

+
+

डाउनलोड

दो अपने-आप में पूर्ण निष्पादन योग्य फ़ाइलें, या एक इंस्टॉलर।

+

क्वेरी भाषा

हर फ़ील्ड और मान जिस पर आप खोज सकते हैं।

+

CLI संदर्भ

हर विकल्प और हर एग्ज़िट कोड।

+

स्नैपशॉट और ड्रिफ्ट

कल से इस मशीन पर क्या बदला।

+

सवाल और सीमाएँ

इसमें वह भी जो टूल डिज़ाइन से मना करता है।

+

सोर्स

सब कुछ GPL-3.0 के तहत GitHub पर है।

+
+
+
diff --git a/site/pages/404/th.html b/site/pages/404/th.html new file mode 100644 index 0000000..9e3b668 --- /dev/null +++ b/site/pages/404/th.html @@ -0,0 +1,30 @@ + + + + + +
+
+ 404 +

ไม่มีหน้านั้นที่นี่

+

ที่อยู่นี้ไม่ตรงกับอะไรในเว็บไซต์นี้ ไม่มีอะไรถูกลบเพื่อให้เป็นเช่นนั้น ที่อยู่ที่นี่ไม่เปลี่ยน เพราะหน้าที่ย้ายจะทำให้ทุกลิงก์ที่เคยชี้ไปที่มันเสีย

+ +
+
+ +
+
+

สิ่งที่คนมักมาหา

+
+

ดาวน์โหลด

ไฟล์ปฏิบัติการแบบครบในตัวสองไฟล์ หรือตัวติดตั้ง

+

ภาษาคิวรี

ทุกฟิลด์และค่าที่คุณค้นหาได้

+

เอกสารอ้างอิง CLI

ทุกตัวเลือกและทุกรหัสออก

+

สแนปช็อตและดริฟต์

อะไรเปลี่ยนบนเครื่องนี้ตั้งแต่เมื่อวาน

+

คำถามและข้อจำกัด

รวมถึงสิ่งที่เครื่องมือปฏิเสธโดยการออกแบบ

+

ซอร์ส

ทุกอย่างอยู่บน GitHub ภายใต้ GPL-3.0

+
+
+
diff --git a/site/pages/audit-windows-services/ar.html b/site/pages/audit-windows-services/ar.html new file mode 100644 index 0000000..07d845b --- /dev/null +++ b/site/pages/audit-windows-services/ar.html @@ -0,0 +1,64 @@ + + + + + +
+
+ دليل +

تدقيق خدمات Windows

+

التدقيق ليس قائمة بما على الجهاز. هو الفرق بين ما على الجهاز وما كان يُفترض أن يكون عليه، ولا شيء في Windows الأصلي يسجّل النصف الثاني.

+
+
+ +
+
+

ثلاثة أسئلة، وما يجيب عنها

+
+
+

ما الذي تغيّر منذ بُني هذا الجهاز؟

+

لقطة تؤخذ عند النشر، ومقارنة مع الجهاز الليلة. ويُبلَّغ عن التكوين منفصلًا عمّا بدأ أو توقف فحسب، فلا يضيع نوع بدء التشغيل الوحيد الذي غيّره أحدهم تحت أربعين خدمة تعمل مصادفةً.

+

bws snapshot diff baseline.json --live

+
+
+

لماذا تختلف بيئة التجهيز عن بيئة الإنتاج؟

+

خذ لقطة على كل منهما وقارن الملفين، في أي مكان ودون حضور أي من الجهازين. والملفان يحملان اسم الجهاز والحساب الذي أخذهما.

+

bws snapshot diff staging.json production.json

+
+
+

ما الموجود هنا وما لا ينبغي أن يكون؟

+

استعلامات تجد الأشكال التي تستحق النظر: خدمة اختفى ملفها التنفيذي، أو غير موقّعة، أو تعمل رغم تعطيلها، أو تطلب صلاحيات تصحيح الأخطاء.

+

file:missing, signed:no, mismatch:running

+
+
+
+
+ +
+
+

الشكل الليلي

+
# يوم يدخل الجهاز الخدمة
+bws snapshot create C:\baselines\web01.json --note "after the build"
+
+# كل ليلة، من مهمة مجدولة
+bws snapshot diff C:\baselines\web01.json --live --exit-code --json > C:\logs\drift.json
+#   0 - لا انحراف في التكوين
+#   5 - انحرف التكوين، ويقول drift.json ما الذي حدث
+#   3 - عمل ولم يستطع قراءة كل شيء، فالجواب جزئي
+

الرمز 5 هو ما يجعل هذا تدقيقًا لا تقريرًا لا يقرؤه أحد: تبقى المهمة صامتة حتى ينحرف الجهاز، وفي الليلة التي ينحرف فيها يُنبَّه أحدهم.

+

خذ خط الأساس من جلسة مرفوعة الصلاحيات. فبدون صلاحيات المسؤول يسرد المدير عناصر أقل ويرفض أكثر مما يسرده. واللقطة تسجّل هل كان الحساب الذي أخذها مسؤولًا، فتستطيع المقارنة قول ذلك بدل الإبلاغ عن عناصر محذوفة لم يحذفها أحد، لكن خط الأساس الناقص نصف الجهاز يظل خط أساس ناقصًا نصف الجهاز.

+
+
+ +
+
+

قيمة اللقطة دليلًا

+
    +
  • هي JSON بحقل واحد في كل سطر، فتدخل مستودعًا ويقرؤها git diff. ومدقق لا يملك هذه الأداة يستطيع قراءة الملف، ونظام التحكم في الإصدارات يجيب أصلًا عن متى.
  • +
  • تحمل ما لم يعرضه snap-in قط: مسار التشغيل ووسائطه، وقيمة التجزئة للملف وموقّعه، والتبعيات في الاتجاهين، والمشغّلات، والامتيازات المطلوبة، ونوع SID، وكذلك security descriptor.
  • +
  • تقول ما لم تستطع قراءته. الحقل الذي لم تملك هذه الجلسة صلاحيته يُسجَّل على أنه لم يُقرأ، وليس فارغًا أبدًا، فتستطيع مقارنة لاحقة أن تقول لم تتم مقارنته بدل أن تعدّه بصمت غير متغيّر.
  • +
  • هي وصف للجهاز كله. فاحفظها وفق ذلك: تُكتب بأي أذونات يحملها مجلدها أصلًا، والأداة لا تضيّق شيئًا.
  • +
+ كيف تعمل اللقطات والمقارنات +
+
diff --git a/site/pages/audit-windows-services/hi.html b/site/pages/audit-windows-services/hi.html new file mode 100644 index 0000000..f432b8c --- /dev/null +++ b/site/pages/audit-windows-services/hi.html @@ -0,0 +1,64 @@ + + + + + +
+
+ गाइड +

Windows सेवाओं का ऑडिट

+

ऑडिट इस बात की सूची नहीं है कि मशीन पर क्या है। वह मशीन पर जो है और जो होना चाहिए था उसके बीच का अंतर है, और स्टॉक Windows पर कुछ भी दूसरे हिस्से को दर्ज नहीं करता।

+
+
+ +
+
+

तीन सवाल, और उनके जवाब देने वाली चीज़ें

+
+
+

इस मशीन के बनने के बाद क्या बदला?

+

डिप्लॉयमेंट पर लिया गया स्नैपशॉट, और आज रात मशीन के विरुद्ध एक diff। कॉन्फ़िगरेशन को उससे अलग बताया जाता है जो सिर्फ़ शुरू या बंद हुआ, इसलिए जो एक स्टार्टअप प्रकार किसी ने बदला वह उन चालीस सेवाओं के नीचे नहीं दबता जो संयोग से चल रही हैं।

+

bws snapshot diff baseline.json --live

+
+
+

स्टेजिंग प्रोडक्शन से अलग क्यों है?

+

हर एक पर एक स्नैपशॉट लें और दोनों फ़ाइलों की तुलना करें, कहीं भी, किसी भी मशीन के मौजूद हुए बिना। फ़ाइलें मशीन का नाम और उन्हें लेने वाला खाता साथ रखती हैं।

+

bws snapshot diff staging.json production.json

+
+
+

यहाँ ऐसा क्या है जो नहीं होना चाहिए?

+

ऐसी क्वेरी जो देखने लायक आकृतियाँ खोजती हैं: ऐसी सेवा जिसकी बाइनरी गायब है, जो हस्ताक्षरित नहीं है, जो Disabled होने पर भी चल रही है, जो डीबग अधिकार माँग रही है।

+

file:missing, signed:no, mismatch:running

+
+
+
+
+ +
+
+

रात की व्यवस्था

+
# जिस दिन मशीन सेवा में जाती है
+bws snapshot create C:\baselines\web01.json --note "after the build"
+
+# हर रात, शेड्यूल किए गए टास्क से
+bws snapshot diff C:\baselines\web01.json --live --exit-code --json > C:\logs\drift.json
+#   0 - कोई कॉन्फ़िगरेशन ड्रिफ्ट नहीं
+#   5 - कॉन्फ़िगरेशन ड्रिफ्ट हुआ, और drift.json बताता है कि क्या
+#   3 - यह चला और सब कुछ नहीं पढ़ सका, इसलिए जवाब आंशिक है
+

एग्ज़िट कोड 5 ही इसे ऑडिट बनाता है, ऐसी रिपोर्ट नहीं जिसे कोई नहीं पढ़ता: टास्क तब तक चुप रहता है जब तक मशीन ड्रिफ्ट नहीं करती, और जिस रात वह करती है, किसी को अलर्ट भेजा जाता है।

+

बेसलाइन उन्नत अधिकारों वाले सत्र से लें। व्यवस्थापक अधिकारों के बिना प्रबंधक कम प्रविष्टियाँ सूचीबद्ध करता है और जो सूचीबद्ध करता है उसमें से ज़्यादा को मना करता है। स्नैपशॉट दर्ज करता है कि उसे लेने वाला खाता व्यवस्थापक था या नहीं, ताकि तुलना यह कह सके, ऐसी प्रविष्टियाँ हटाई हुई बताने के बजाय जिन्हें किसी ने हटाया नहीं। पर आधी मशीन के बिना बेसलाइन फिर भी आधी मशीन के बिना बेसलाइन है।

+
+
+ +
+
+

स्नैपशॉट सबूत के तौर पर कितना मूल्यवान है

+
    +
  • यह JSON है जिसमें हर पंक्ति में एक फ़ील्ड है, इसलिए यह रिपॉज़िटरी में रखा जा सकता है और git diff इसे पढ़ लेता है। जिस ऑडिटर के पास यह टूल नहीं है वह भी फ़ाइल पढ़ सकता है, और एक वर्ज़न कंट्रोल सिस्टम पहले से कब का जवाब देता है।
  • +
  • इसमें वह है जो snap-in ने कभी नहीं दिखाया: लॉन्च पथ और आर्ग्युमेंट, फ़ाइल का हैश और हस्ताक्षरकर्ता, दोनों दिशाओं की निर्भरताएँ, ट्रिगर, ज़रूरी विशेषाधिकार, SID प्रकार और security descriptor।
  • +
  • यह बताता है कि वह क्या नहीं पढ़ सका। जिस फ़ील्ड के अधिकार इस सत्र के पास नहीं थे वह पढ़ा नहीं गया के रूप में दर्ज होता है, खाली कभी नहीं, ताकि बाद की तुलना चुपचाप उसे अपरिवर्तित कहने के बजाय तुलना नहीं की गई कह सके।
  • +
  • यह पूरी मशीन का वर्णन है। इसे उसी हिसाब से रखें: यह उन्हीं अनुमतियों के साथ लिखा जाता है जो उसकी डायरेक्टरी में पहले से हैं, और टूल कुछ भी सीमित नहीं करता।
  • +
+ स्नैपशॉट और diff कैसे काम करते हैं +
+
diff --git a/site/pages/audit-windows-services/th.html b/site/pages/audit-windows-services/th.html new file mode 100644 index 0000000..338dca6 --- /dev/null +++ b/site/pages/audit-windows-services/th.html @@ -0,0 +1,64 @@ + + + + + +
+
+ คู่มือ +

การตรวจสอบบริการ Windows

+

การตรวจสอบไม่ใช่รายการสิ่งที่อยู่บนเครื่อง แต่คือความต่างระหว่างสิ่งที่อยู่บนเครื่องกับสิ่งที่ควรเป็น และไม่มีอะไรบน Windows แบบปกติบันทึกครึ่งหลัง

+
+
+ +
+
+

สามคำถาม และอะไรตอบมัน

+
+
+

อะไรเปลี่ยนตั้งแต่สร้างเครื่องนี้

+

สแนปช็อตที่สร้างตอนติดตั้งใช้งาน และ diff กับเครื่องในคืนนี้ การกำหนดค่ารายงานแยกจากสิ่งที่แค่เริ่มหรือหยุด ประเภทการเริ่มต้นหนึ่งตัวที่ใครสักคนเปลี่ยนจึงไม่จมอยู่ใต้บริการสี่สิบตัวที่บังเอิญทำงานอยู่

+

bws snapshot diff baseline.json --live

+
+
+

ทำไมสเตจจิงต่างจากโปรดักชัน

+

สร้างสแนปช็อตบนแต่ละเครื่องแล้ว diff ไฟล์ทั้งสอง ที่ไหนก็ได้ โดยไม่ต้องมีเครื่องไหนอยู่ ไฟล์มีชื่อเครื่องและบัญชีที่สร้างมัน

+

bws snapshot diff staging.json production.json

+
+
+

มีอะไรอยู่ที่นี่ที่ไม่ควรมี

+

คิวรีที่หารูปแบบที่ควรดู: บริการที่ไฟล์ปฏิบัติการหายไป บริการที่ไม่มีลายเซ็น บริการที่ทำงานทั้งที่ปิดใช้งาน บริการที่ขอสิทธิ์ดีบัก

+

file:missing, signed:no, mismatch:running

+
+
+
+
+ +
+
+

รูปแบบรายคืน

+
# วันที่เครื่องเข้าสู่การใช้งาน
+bws snapshot create C:\baselines\web01.json --note "after the build"
+
+# ทุกคืน จากงานตามกำหนดเวลา
+bws snapshot diff C:\baselines\web01.json --live --exit-code --json > C:\logs\drift.json
+#   0 - ไม่มีดริฟต์ของการกำหนดค่า
+#   5 - การกำหนดค่าดริฟต์ และ drift.json บอกว่าอะไร
+#   3 - รันแล้วแต่อ่านไม่ได้ทั้งหมด คำตอบจึงไม่ครบ
+

รหัสออก 5 คือสิ่งที่ทำให้นี่เป็นการตรวจสอบ ไม่ใช่รายงานที่ไม่มีใครอ่าน งานเงียบจนกว่าเครื่องจะดริฟต์ และคืนที่มันดริฟต์ จะมีคนถูกแจ้ง

+

สร้างเส้นฐานจากเซสชันที่ยกระดับสิทธิ์ เมื่อไม่มีสิทธิ์ผู้ดูแลระบบ ตัวจัดการแสดงรายการน้อยลงและปฏิเสธรายการที่แสดงมากขึ้น สแนปช็อตบันทึกว่าบัญชีที่สร้างมันเป็นผู้ดูแลระบบหรือไม่ การเปรียบเทียบจึงบอกเรื่องนี้ได้ แทนที่จะรายงานรายการว่าถูกลบทั้งที่ไม่มีใครลบ แต่เส้นฐานที่ขาดไปครึ่งเครื่องก็ยังเป็นเส้นฐานที่ขาดไปครึ่งเครื่อง

+
+
+ +
+
+

สแนปช็อตมีค่าเป็นหลักฐานแค่ไหน

+
    +
  • เป็น JSON ที่มีหนึ่งฟิลด์ต่อบรรทัด เก็บในรีโพซิทอรีได้และ git diff อ่านได้ ผู้ตรวจสอบที่ไม่มีเครื่องมือนี้ก็ยังอ่านไฟล์ได้ และระบบควบคุมเวอร์ชันตอบ เมื่อไร อยู่แล้ว
  • +
  • มีสิ่งที่สแนปอินไม่เคยแสดง: พาธการเปิดใช้งานและอาร์กิวเมนต์ แฮชและผู้ลงลายเซ็นของไฟล์ การพึ่งพาทั้งสองทาง ทริกเกอร์ สิทธิพิเศษที่ต้องใช้ ประเภท SID และ security descriptor
  • +
  • บอกสิ่งที่อ่านไม่ได้ ฟิลด์ที่เซสชันนี้ไม่มีสิทธิ์จะถูกบันทึกว่าไม่ได้อ่าน ไม่เคยเป็นค่าว่าง การเปรียบเทียบภายหลังจึงพูดได้ว่า not compared แทนที่จะเรียกมันว่าไม่เปลี่ยนเงียบๆ
  • +
  • เป็นคำอธิบายของทั้งเครื่อง เก็บมันให้เหมาะสม: มันถูกเขียนด้วยสิทธิ์ที่ไดเรกทอรีมีอยู่แล้ว และเครื่องมือไม่จำกัดอะไรให้แคบลง
  • +
+ สแนปช็อตและ diff ทำงานอย่างไร +
+
diff --git a/site/pages/cli-reference/ar.html b/site/pages/cli-reference/ar.html new file mode 100644 index 0000000..9a656c0 --- /dev/null +++ b/site/pages/cli-reference/ar.html @@ -0,0 +1,192 @@ + + + + + + + +
+
+ مرجع +

مرجع سطر الأوامر

+

كل أمر وكل خيار وكل رمز خروج في bws، الإصدار {{version}}. والأمر bws --help هو المرجع المعتمد وهو أطول، وهذه الصفحة هي السطح نفسه مرتبًا ليُقرأ.

+
+
+ +
+
+

الأوامر

+

أحد عشر أمرًا. snapshot اسم ويأخذ بعده كلمة. وtool اسم أيضًا، وحده يسرد الأدوات.

+
bws list [--query TEXT] [--signatures] [--memory] [--required-by] [--follow-network] [--json] [--timing]
+bws show NAME [--full] [--follow-network] [--json] [--timing]
+bws stop|start|restart NAME [--dry-run] [--dependents] [--timeout SECONDS] [--json] [--timing]
+bws kill NAME [--force] [--restart] [--dry-run] [--dependents] [--timeout SECONDS] [--json] [--timing]
+bws start-type NAME automatic|delayed|manual|disabled [--stop] [--dry-run] [--json] [--timing]
+bws snapshot create [FILE] [--note TEXT] [--follow-network] [--force] [--json] [--timing]
+bws snapshot diff EARLIER LATER [--exit-code] [--json] [--timing]
+bws snapshot diff EARLIER --live [--exit-code] [--json] [--timing]
+bws history [NAME] [--json] [--timing]
+bws tool
+bws tool fix
+bws tool fix NAME [--dry-run] [--timeout SECONDS] [--json] [--timing]
+bws license [--components]
+bws --help
+bws --version
+

الأمر الذي يُكتب بخطأ يُقترح عليه ما قصدته غالبًا، وينتهي التشغيل بالرمز 2 بدل أن يفعل شيئًا قريبًا مما طلبت.

+
$ bws lst
+There is no command lst. Did you mean list?
+
+
+ +
+
+

ما يفعله كل أمر

+
+
+

list وshow

+

list هو الجهاز كله، مضيَّقًا بالخيار --query. وshow عنصر واحد مع كل ما هو معروف عنه: التوقيع والامتيازات، وكذلك security descriptor والذاكرة، وكلها تُقرأ في كل مرة، لأن ذلك يكلّف نحو ستين ميلي ثانية على عنصر واحد بينما يكلّف ثانية على الجهاز كله. والحقول الفارغة فعلًا تُترك ما لم تمرر --full. أما الحقل الذي لم يستطع أحد قراءته فيُطبع في الحالتين، لأن تركه كان سيبدو جوابًا.

+
+
+

stop وstart وrestart

+

كل منها يبني خطة وينفّذها. و--dry-run يطبع الخطة ولا يغيّر شيئًا، و--dependents يضع فيها الخدمات التي ستتعطل خطوات قائمة بذاتها، و--timeout يحدد كم تستطيع خطوة أن تمضي دون تقدم. وتُرفض برامج التشغيل ولا تُجرَّب، لأن إيقاف برنامج تشغيل في النواة كثيرًا ما لا يمكن التراجع عنه دون إعادة تشغيل.

+
+
+

kill: لخدمة لا تتوقف

+

يطلب من الخدمة أن تتوقف وينهي العملية الواقفة خلفها فقط إذا لم ينجح ذلك، فالعنصر الذي يتوقف من تلقاء نفسه لا يُنهى أبدًا. وإنهاء عملية يأخذ معه كل خدمة أخرى تعيش فيها، سواء توقفت قبل ذلك أم لا، وتسمّيها المعاينة وتسمّي العملية برقمها. و--force يتخطى الخطوة المهذبة وحينها تعرض المعاينة خطوة واحدة بدل اثنتين. و--restart يعيد كل شيء بعد ذلك.

+

يكتب Windows هذه الفكرة بشكل مختلف. الخيار --force في Stop-Service يعني «حتى لو كان شيء يعتمد عليها»، وهذا ما يفعله --dependents هنا. ولهذا فهو أمر قائم بذاته وليس خيارًا في stop.

+
+
+

start-type: إعداد وليس حركة

+

يحدد ما سيفعله المدير بعنصر عند الإقلاع التالي، ومن دون --stop لا يحرّك شيئًا: العنصر الذي يعمل يظل يعمل، والذي توقف يبقى متوقفًا، وتقول الخطة ذلك. وdisabled هو الذي يستحق التوقف عنده، لأنه يمنع المدير من بدء العنصر أصلًا، بما في ذلك عند الطلب لصالح شيء آخر يحتاج إليه. وdelayed تلقائي يبدأ بعد العناصر التلقائية الأخرى بقليل، وهو الكلمة التي يسأل عنها start:delayed في الاستعلام، ويرفضه Windows لعنصر في مجموعة ترتيب تحميل، وهذا تقوله الخطة قبل أن يحدث أي شيء. وكل من الأربعة يكتب هل يبدأ العنصر متأخرًا، كما يفعل sc.exe. و--stop، بجانب disabled وحده، يوقف العنصر في الخطة نفسها بعد كتابة الإعداد.

+
+
+

snapshot create وsnapshot diff

+

create يقرأ التوقيعات وقيم التجزئة دائمًا، لأن اللقطة تُحفظ وتُقارن لاحقًا، واللقطة الخالية منها تُقارن بلقطة فيها كأن الجهاز تغيّر. وdiff يقول ما تغيّر بالانتقال من الملف الأول إلى الثاني، أو من ملف إلى هذا الجهاز بالخيار --live. وفي صفحة اللقطات الصيغة والتعليل.

+
+
+

history: من غيّره، من سجل System

+

تغييرات نوع بدء التشغيل وعمليات التثبيت من سجل System، الأحدث أولًا، مع الحساب الذي سجّله Windows. ويقول السطر الأول إلى أي مدى يمتد السجل إلى الوراء وهل مُسح، لأن التاريخ لا يطول أكثر من السجل. ومع اسم تكون التغييرات في نوع بدء تشغيل تلك الخدمة، أما عمليات التثبيت فتُسرد دون اسم فقط، لأن Windows يسجّل التثبيت تحت الاسم المعروض لا اسم الخدمة أبدًا. ويُسمّى الحساب حيث يستطيع هذا الجهاز تسميته بنفسه ويُعرض بمعرّف SID خلاف ذلك، وتأتي أنواع بدء التشغيل بالكلمات التي كتبها Windows.

+
+
+

tool: إجابات جاهزة عن المشكلات الشائعة

+

الأدوات نفسها التي تعرضها النافذة في تبويب Tools. الأمر bws tool يسردها وbws tool fix يسرد الإصلاحات السريعة: printer وsound وindexing وsearch، وكل منها إعادة تشغيل خدمة Windows واحدة مع ما يعتمد عليها، اختيرت لأن صفحات استكشاف الأخطاء الرسمية من Microsoft تقترحها. والأمر bws tool fix printer هو بالضبط bws restart Spooler --dependents: الخطة نفسها والمخرجات نفسها ورموز الخروج نفسها، ومثل كل أمر هنا يغيّر شيئًا فهو لا يسأل أولًا، لذا فإن --dry-run هو طريقة النظر قبل أن يعمل.

+
+
+

license: ما بداخل الملف الذي نزّلته

+

لا يقرأ شيئًا إطلاقًا، لا مدير الخدمات ولا القرص ولا الشبكة، ويجيب من سجل مُجمَّع داخل الملف التنفيذي. و--components يحوّل الإشعار إلى كل مكوّن مع إصداره وترخيصه ومصدره. وهي المجموعة نفسها التي تحملها قائمة المواد المنشورة بجانب التنزيل، لأن الاثنتين تُولَّدان من سجل واحد، وهذا سبب أهميتها: البرنامج ملف واحد قائم بذاته، فلا يوجد بجانبه شيء ليقرأه الماسح.

+
+
+
+
+ +
+
+

أمثلة

+

فُحصت الخطط أدناه بالخيار --dry-run مقابل البرنامج الذي تصفه هذه الصفحة. والأمر الذي يغيّر شيئًا لا يسأل أولًا، لذا فإن --dry-run هو طريقة النظر قبل أن يعمل. وSpooler يقوم مقام أي خدمة، فضع اسم خدمتك مكانه.

+
+

ابحث واقرأ

+
bws list                                       كل خدمة وبرنامج تشغيل على هذا الجهاز
+bws list --query "start:auto !status:running"  ما يجب أن يعمل ولا يعمل
+bws list --query "status:running" --memory     ما تستخدمه عملية كل عنصر يعمل
+bws show Spooler                               كل ما هو معروف عن عنصر واحد
+bws show Spooler --full                        وكذلك الحقول الفارغة فعلًا
+

انظر أولًا، ثم غيّر

+
bws restart Spooler --dry-run                الخطة، ولا شيء غيرها
+bws restart Spooler --dependents             أعد تشغيلها مع ما يعتمد عليها
+bws stop Spooler --dependents --timeout 120  اسمح بدقيقتين لكل خطوة دون تقدم
+bws start-type WSearch delayed --dry-run     ابدأها بعد العناصر التلقائية الأخرى بقليل
+bws start-type Spooler disabled --stop       عطّلها وأوقفها في خطة واحدة
+

خدمة لا تتوقف

+
bws kill Spooler --dry-run          العملية، وكل خدمة تعيش فيها
+bws kill Spooler --restart          أنهِ العملية فقط إذا فشل الإيقاف، ثم أعد كل شيء
+bws kill Spooler --force --dry-run  خطوة واحدة بدل اثنتين: تُنهى العملية فورًا
+

اللقطات والانحراف

+
bws snapshot create before.json --note "before the patch"  جمّد الجهاز، مع ملاحظة تُحفظ بداخله
+bws snapshot diff before.json after.json                   ملفان: يومان، أو جهازان
+bws snapshot diff before.json --live                       الملف مقابل هذا الجهاز كما هو الآن
+bws snapshot diff before.json --live --exit-code           الأمر نفسه، وينتهي بالرمز 5 إذا انحرف التكوين
+

من غيّره

+
bws history          كل تغيير في نوع بدء التشغيل وكل تثبيت يحتفظ به سجل System
+bws history Spooler  تغييرات نوع بدء تشغيل خدمة واحدة
+bws history --json   الشيء نفسه مستندًا، مع السجل والتغييرات
+

إصلاحات سريعة

+
bws tool                      الأدوات الموجودة
+bws tool fix                  الإصلاحات السريعة، والخدمة خلف كل واحد
+bws tool fix sound --dry-run  خطة إعادة تشغيل خدمتي الصوت
+bws tool fix printer          أعد تشغيل Print Spooler مع ما يعتمد عليها
+

ما بداخل الملف

+
bws license --components  كل مكوّن وإصداره وترخيصه ومصدره
+bws --version             إصدار هذا الملف التنفيذي
+

في سكربت PowerShell

+
# العناصر التي يجب أن تعمل ولا تعمل، ككائنات
+bws list --query "start:auto !status:running" --json | ConvertFrom-Json | Select-Object serviceName, displayName, status
+
+# الملفات غير الموقّعة، في جدول بيانات
+bws list --query "signed:no" --json | ConvertFrom-Json | Select-Object serviceName, binaryPath | Export-Csv unsigned.csv -NoTypeInformation
+
+# ما تحتاجه خدمة واحدة
+(bws show Spooler --json | ConvertFrom-Json).dependsOn
+
+# فحص ليلي يتفرع بحسب رمز الخروج
+bws snapshot diff C:\baselines\web01.json --live --exit-code > $null
+switch ($LASTEXITCODE) {
+  0 { 'no configuration drift' }
+  5 { 'the configuration drifted' }
+  default { "no clean answer, exit code $LASTEXITCODE" }
+}
+

في cmd وملف دفعي

+
rem أمر ثانٍ فقط إذا لم ينتهِ الأول نظيفًا
+bws restart Spooler || echo the restart did not end cleanly
+
+rem في ملف دفعي مفعّل فيه التوسع المتأخر يحتاج الرمز ! إلى علامة ^
+bws list --query "start:auto ^!status:running"
+
+
+
+ +
+
+

الخيارات

+

{{switch_count}} منها. والعمود الثالث هو الأوامر التي ينتمي إليها كل خيار: فالخيار الممرَّر إلى أمر لا فائدة له فيه خطأ ومعه تلك القائمة، وليس خيارًا يُتجاهل بصمت.

+ {{table:switches}} +
+
+ +
+
+

رموز الخروج

+

{{exit_code_count}} نهايات، وكل واحدة منها شيء مختلف يفعله السكربت. تذهب البيانات إلى الإخراج القياسي وكل ما عداها إلى الخطأ القياسي، فيعمل bws list --json | jq ولا يصل تحذير إلى JSON أبدًا.

+

كل مستند JSON هو ASCII عادي: الحرف الخارج عنه يُكتب هروبًا من ستة محارف يعيده كل قارئ JSON إلى الحرف، فالأمر bws list --json > file.json ينتج UTF-8 صالحًا و| ConvertFrom-Json يقرؤه صحيحًا أيًا كانت صفحة الرموز المضبوطة للطرفية. وفي النص الذي يقرؤه الشخص يُعرض المحرف الذي كان سيحرّك الطرفية بدل أن يُطبع، أي علامة جدولة أو فاصل سطر أو متتالية هروب أو تجاوز للاتجاه، برقم رمزه، <U+001B>.

+

الرمز -- ينهي الخيارات، فتستطيع تسمية خدمة يبدأ اسمها بشرطة: bws show -- -odd. وأسطر الأوامر التي تسلّمها لك الأداة مكتوبة لبيئة PowerShell: الاسم الذي فيه مسافة يوضع بين علامتي اقتباس مزدوجتين، ويقرؤها cmd بالطريقة نفسها، والاسم الذي كان PowerShell سيوسّعه داخلها، مثل MSSQL$SQLEXPRESS، يوضع بين علامتي اقتباس مفردتين.

+ {{table:exit-codes}} +

الضغط على Ctrl+C له ثلاثة مستويات، وكل مستوى يقول كم يكلّف التالي. الأول يتوقف عن المضي قدمًا ويعيد مع ذلك ما أُخذ، والثاني يترك الأمور كما هي ويطبع التقرير مع ذلك، والثالث ينهي العملية. والتشغيل الذي يوقفه شخص بيده ينتهي بالرمز 4 حتى لو وصلت كل الخطوات.

+

إغلاق نافذة وحدة التحكم يُحتسب كأول Ctrl+C. يمهل Windows البرنامج خمس ثوانٍ بعد ذلك، وفيها يتوقف هذا البرنامج عن المضي قدمًا ويعيد ما أوقفه. أما تسجيل الخروج والإيقاف فينهيانه دون أي تحذير يمكنه التصرف بناءً عليه، وقد تفعل ذلك أيضًا جلسة بعيدة انقطعت.

+
+
+ +
+
+

في مهمة مجدولة

+

الشكل الذي بُنيت هذه الأداة له: جمّد الجهاز وهو سليم معروف، ثم اسأل كل ليلة هل ما زال كذلك.

+
# يوم يدخل الجهاز الخدمة
+bws snapshot create C:\baselines\web01.json --note "after the build"
+
+# كل ليلة، من مهمة مجدولة
+bws snapshot diff C:\baselines\web01.json --live --exit-code --json > C:\logs\drift.json
+#   0 - لا انحراف في التكوين
+#   5 - انحرف التكوين، ويقول drift.json ما الذي حدث
+#   3 - عمل ولم يستطع قراءة كل شيء، فالجواب جزئي
+

النافذة هي النصف الآخر من المحرك نفسه: {{archive_window}} يحملها، وصفحة التنزيل تقول ما هو كل أرشيف.

+
+
+ +
+
+

وسيط النافذة

+

BetterWindowsServices.exe يأخذ وسيطًا واحدًا مخصصًا لشخص: --catalogue يفتح ورقة للمطوّر تعرض كل مكوّن في النافذة في كل حالة، ولا يقرأ شيئًا من جهازك. والوسيط الثاني، --carry، هو الطريقة التي تسلّم بها نافذة ما كانت تعرضه إلى نسختها التي تعيد تشغيلها بصفة مسؤول. لا أحد يكتبه، وأي شيء فيه لم تكن تلك النافذة لتكتبه يُرفض.

+
+
diff --git a/site/pages/cli-reference/hi.html b/site/pages/cli-reference/hi.html new file mode 100644 index 0000000..3d9da98 --- /dev/null +++ b/site/pages/cli-reference/hi.html @@ -0,0 +1,193 @@ + + + + + + + +
+
+ संदर्भ +

कमांड लाइन संदर्भ

+

bws का हर कमांड, हर विकल्प और हर एग्ज़िट कोड, संस्करण {{version}}। bws --help आधिकारिक है और लंबा है। यह पृष्ठ वही सतह है, जिसे पढ़ने लायक ढंग से सजाया गया है।

+
+
+ +
+
+

कमांड

+

ग्यारह कमांड। snapshot एक संज्ञा है और उसके बाद एक शब्द लेता है। tool भी संज्ञा है, और अकेला होने पर वह टूल की सूची देता है।

+
bws list [--query TEXT] [--signatures] [--memory] [--required-by] [--follow-network] [--json] [--timing]
+bws show NAME [--full] [--follow-network] [--json] [--timing]
+bws stop|start|restart NAME [--dry-run] [--dependents] [--timeout SECONDS] [--json] [--timing]
+bws kill NAME [--force] [--restart] [--dry-run] [--dependents] [--timeout SECONDS] [--json] [--timing]
+bws start-type NAME automatic|delayed|manual|disabled [--stop] [--dry-run] [--json] [--timing]
+bws snapshot create [FILE] [--note TEXT] [--follow-network] [--force] [--json] [--timing]
+bws snapshot diff EARLIER LATER [--exit-code] [--json] [--timing]
+bws snapshot diff EARLIER --live [--exit-code] [--json] [--timing]
+bws history [NAME] [--json] [--timing]
+bws tool
+bws tool fix
+bws tool fix NAME [--dry-run] [--timeout SECONDS] [--json] [--timing]
+bws license [--components]
+bws --help
+bws --version
+

गलत टाइप किए गए कमांड को वह कमांड सुझाया जाता है जो आपका शायद मतलब था, और रन कोड 2 के साथ खत्म होता है, आपके माँगे हुए के आसपास कुछ करने के बजाय।

+
$ bws lst
+There is no command lst. Did you mean list?
+
+
+ +
+
+

हर कमांड क्या करता है

+
+
+

list और show

+

list पूरी मशीन है, जिसे --query से सीमित किया जाता है। show एक प्रविष्टि है और उसके बारे में जो कुछ पता है वह सब: हस्ताक्षर, विशेषाधिकार, security descriptor और मेमोरी, सब हर बार पढ़े जाते हैं, क्योंकि एक प्रविष्टि पर इसकी लागत लगभग साठ मिलीसेकंड है जबकि पूरी मशीन पर एक सेकंड। जो फ़ील्ड सचमुच खाली हैं उन्हें तब तक छोड़ दिया जाता है जब तक आप --full न दें। जिस फ़ील्ड को कोई पढ़ नहीं सका वह हर हाल में छापा जाता है, क्योंकि उसे छोड़ देना जवाब जैसा दिखता।

+
+
+

stop, start और restart

+

हर एक योजना बनाता है और उसे पूरा करता है। --dry-run योजना छापता है और कुछ नहीं बदलता, --dependents उन सेवाओं को, जो टूटतीं, अलग चरणों के रूप में उसमें रख देता है, और --timeout बताता है कि एक चरण बिना प्रगति के कितनी देर तक चल सकता है। ड्राइवरों को आज़माया नहीं जाता, मना कर दिया जाता है, क्योंकि कर्नेल ड्राइवर रोकना अक्सर रीस्टार्ट के बिना वापस नहीं किया जा सकता।

+
+
+

kill: उस सेवा के लिए जो रुकती नहीं

+

यह सेवा से रुकने को कहता है और उसके पीछे की प्रक्रिया को तभी खत्म करता है जब वह काम न करे, इसलिए जो प्रविष्टि अपने आप रुक जाती है उसे कभी खत्म नहीं किया जाता। प्रक्रिया खत्म करने से उसमें रहने वाली हर दूसरी सेवा भी साथ जाती है, चाहे वे पहले रुकी हों या नहीं, और पूर्वावलोकन उनके नाम बताता है और प्रक्रिया को नंबर से नाम देता है। --force विनम्र चरण छोड़ देता है और तब पूर्वावलोकन में दो के बजाय एक चरण दिखता है। --restart बाद में सब कुछ वापस ले आता है।

+

Windows इस विचार को अलग ढंग से लिखता है। Stop-Service पर --force का मतलब है “भले ही कुछ उस पर निर्भर हो”, जो यहाँ --dependents करता है। इसीलिए यह अपना अलग कमांड है, stop पर कोई विकल्प नहीं।

+
+
+

start-type: एक सेटिंग, कोई चाल नहीं

+

यह बताता है कि प्रबंधक अगले बूट पर किसी प्रविष्टि के साथ क्या करेगा, और --stop के बिना यह कुछ भी नहीं हिलाता: जो प्रविष्टि चल रही है वह चलती रहती है, जो रुकी है वह रुकी रहती है, और योजना यही कहती है। disabled वह है जिस पर ठहरना ज़रूरी है, क्योंकि यह प्रबंधक को प्रविष्टि शुरू करने से ही रोक देता है, उस स्थिति में भी जब किसी और चीज़ को उसकी माँग पर ज़रूरत हो। delayed ऑटोमैटिक है, जो बाकी ऑटोमैटिक प्रविष्टियों से थोड़ी देर बाद शुरू होता है, यही वह शब्द है जिसके बारे में क्वेरी में start:delayed पूछता है, और Windows इसे लोड ऑर्डर ग्रुप वाली प्रविष्टि के लिए मना कर देता है, जो योजना कुछ होने से पहले ही बता देती है। चारों में से हर एक यह भी लिखता है कि प्रविष्टि देर से शुरू होती है या नहीं, जैसा sc.exe करता है। --stop, सिर्फ़ disabled के साथ, सेटिंग लिखे जाने के बाद उसी योजना में प्रविष्टि को रोक देता है।

+
+
+

snapshot create और snapshot diff

+

create हमेशा हस्ताक्षर और हैश पढ़ता है, क्योंकि स्नैपशॉट रखा जाता है और बाद में तुलना की जाती है, और उनके बिना बना स्नैपशॉट उनके साथ वाले से तुलना में ऐसा दिखाता मानो मशीन बदल गई हो। diff बताता है कि पहली फ़ाइल से दूसरी तक जाने में क्या बदला, या --live के साथ किसी फ़ाइल से इस मशीन तक। स्नैपशॉट पृष्ठ में प्रारूप और उसके पीछे का तर्क है।

+
+
+

history: किसने बदला, System लॉग से

+

स्टार्टअप प्रकार के बदलाव और इंस्टॉलेशन System लॉग से, सबसे नए पहले, उस खाते के साथ जो Windows ने दर्ज किया। पहली पंक्ति बताती है कि लॉग कितना पीछे तक जाता है और क्या उसे साफ़ किया गया था, क्योंकि इतिहास उतना ही लंबा होता है जितना लॉग। नाम देने पर वह उसी सेवा के स्टार्टअप प्रकार के बदलाव हैं। इंस्टॉलेशन सिर्फ़ बिना नाम के सूचीबद्ध होते हैं, क्योंकि Windows इंस्टॉलेशन को प्रदर्शन नाम के तहत दर्ज करता है, सेवा के नाम के तहत कभी नहीं। खाते का नाम वहाँ बताया जाता है जहाँ यह मशीन उसे अपने आप बता सकती है, और वरना उसका SID दिखाया जाता है, और स्टार्टअप प्रकार उन्हीं शब्दों में आते हैं जो Windows ने लिखे।

+
+
+

tool: आम समस्याओं के तैयार जवाब

+

वही टूल जो विंडो अपने Tools टैब पर दिखाती है। bws tool उनकी सूची देता है और bws tool fix त्वरित समाधानों की सूची देता है: printer, sound, indexing और search, हर एक एक Windows सेवा का रीस्टार्ट, उस पर निर्भर चीज़ों के साथ, जिसे इसलिए चुना गया कि Microsoft के अपने समस्या-निवारण पृष्ठ उसे सुझाते हैं। bws tool fix printer ठीक bws restart Spooler --dependents है: वही योजना, वही आउटपुट और वही एग्ज़िट कोड, और यहाँ के हर उस कमांड की तरह जो कुछ बदलता है, यह पहले पूछता नहीं, इसलिए चलने से पहले देखने का तरीका --dry-run है।

+
+
+

license: आपकी डाउनलोड की फ़ाइल के अंदर क्या है

+

यह कुछ भी नहीं पढ़ता, न सेवा प्रबंधक, न डिस्क, न नेटवर्क, और निष्पादन योग्य फ़ाइल में संकलित रजिस्टर से जवाब देता है। --components नोटिस को हर घटक में बदल देता है, उसके संस्करण, उसके लाइसेंस और उसके स्रोत के साथ। वही सेट जो डाउनलोड के बगल में प्रकाशित सामग्री-सूची में है, क्योंकि दोनों एक ही रजिस्टर से बनते हैं, और इसके होने की वजह यही है: प्रोग्राम एक अपने-आप में पूर्ण फ़ाइल है, इसलिए उसके बगल में स्कैनर के पढ़ने लायक कुछ नहीं है।

+
+
+
+
+ +
+
+

उदाहरण

+

नीचे की योजनाओं को उस प्रोग्राम के विरुद्ध --dry-run से जाँचा गया जिसका यह पृष्ठ वर्णन करता है। जो कमांड कुछ बदलता है वह पहले पूछता नहीं, इसलिए चलने से पहले देखने का तरीका --dry-run है। Spooler किसी भी सेवा की जगह है, उसकी जगह अपनी सेवा का नाम रखें।

+
+

खोजें और पढ़ें

+
bws list                                       इस मशीन की हर सेवा और ड्राइवर
+bws list --query "start:auto !status:running"  जो चालू होना चाहिए और नहीं है
+bws list --query "status:running" --memory     हर चल रही प्रविष्टि की प्रक्रिया क्या इस्तेमाल कर रही है
+bws show Spooler                               एक प्रविष्टि के बारे में जो कुछ पता है
+bws show Spooler --full                        वे फ़ील्ड भी जो सचमुच खाली हैं
+

पहले देखें, फिर बदलें

+
bws restart Spooler --dry-run                योजना, और कुछ नहीं
+bws restart Spooler --dependents             इसे उन चीज़ों के साथ रीस्टार्ट करें जो इस पर निर्भर हैं
+bws stop Spooler --dependents --timeout 120  बिना प्रगति के हर चरण के लिए दो मिनट दें
+bws start-type WSearch delayed --dry-run     इसे बाकी ऑटोमैटिक प्रविष्टियों से थोड़ी देर बाद शुरू करें
+bws start-type Spooler disabled --stop       एक ही योजना में इसे disable करें और रोकें
+

ऐसी सेवा जो रुकती नहीं

+
bws kill Spooler --dry-run          प्रक्रिया, और उसमें रहने वाली हर सेवा
+bws kill Spooler --restart          प्रक्रिया तभी खत्म करें जब रोकना विफल हो, फिर सब कुछ वापस ले आएँ
+bws kill Spooler --force --dry-run  दो के बजाय एक चरण: प्रक्रिया तुरंत खत्म
+

स्नैपशॉट और ड्रिफ्ट

+
bws snapshot create before.json --note "before the patch"  मशीन को फ़्रीज़ करें, एक नोट के साथ जो अंदर रहता है
+bws snapshot diff before.json after.json                   दो फ़ाइलें: दो दिन, या दो मशीनें
+bws snapshot diff before.json --live                       फ़ाइल की तुलना इस मशीन से, जैसी वह अभी है
+bws snapshot diff before.json --live --exit-code           वही, कॉन्फ़िगरेशन ड्रिफ्ट होने पर 5 के साथ खत्म
+

किसने बदला

+
bws history          हर स्टार्टअप प्रकार का बदलाव और इंस्टॉलेशन जो System लॉग में है
+bws history Spooler  एक सेवा के स्टार्टअप प्रकार के बदलाव
+bws history --json   वही दस्तावेज़ के रूप में, लॉग और बदलावों के साथ
+

त्वरित समाधान

+
bws tool                      जो टूल हैं
+bws tool fix                  त्वरित समाधान, और हर एक के पीछे की सेवा
+bws tool fix sound --dry-run  दोनों ऑडियो सेवाओं के रीस्टार्ट की योजना
+bws tool fix printer          Print Spooler को उस पर निर्भर चीज़ों के साथ रीस्टार्ट करें
+

फ़ाइल के अंदर क्या है

+
bws license --components  हर घटक, उसका संस्करण, उसका लाइसेंस और वह कहाँ से आया
+bws --version             इस निष्पादन योग्य फ़ाइल का संस्करण
+

PowerShell स्क्रिप्ट में

+
# जो प्रविष्टियाँ चालू होनी चाहिए और नहीं हैं, ऑब्जेक्ट के रूप में
+bws list --query "start:auto !status:running" --json | ConvertFrom-Json | Select-Object serviceName, displayName, status
+
+# बिना हस्ताक्षर वाली फ़ाइलें, स्प्रेडशीट में
+bws list --query "signed:no" --json | ConvertFrom-Json | Select-Object serviceName, binaryPath | Export-Csv unsigned.csv -NoTypeInformation
+
+# एक सेवा को क्या चाहिए
+(bws show Spooler --json | ConvertFrom-Json).dependsOn
+
+# एक रात्रिकालीन जाँच जो एग्ज़िट कोड पर शाखा बनाती है
+bws snapshot diff C:\baselines\web01.json --live --exit-code > $null
+switch ($LASTEXITCODE) {
+  0 { 'no configuration drift' }
+  5 { 'the configuration drifted' }
+  default { "no clean answer, exit code $LASTEXITCODE" }
+}
+

cmd और बैच फ़ाइल में

+
rem दूसरा कमांड तभी जब पहला साफ़-सुथरा खत्म न हुआ हो
+bws restart Spooler || echo the restart did not end cleanly
+
+rem डिले एक्सपैंशन चालू वाली बैच फ़ाइल में ! को कैरेट चाहिए
+bws list --query "start:auto ^!status:running"
+
+
+
+ +
+
+

विकल्प

+

{{switch_count}} विकल्प। तीसरा कॉलम वे कमांड हैं जिनसे हर एक जुड़ा है। जिस कमांड को किसी विकल्प की ज़रूरत नहीं, उसे दिया गया विकल्प उस सूची के साथ एक त्रुटि है, चुपचाप अनदेखा किया गया फ़्लैग नहीं।

+ {{table:switches}} +
+
+ +
+
+

एग्ज़िट कोड

+

{{exit_code_count}} अंत, और हर एक किसी स्क्रिप्ट के लिए एक अलग काम है। डेटा स्टैंडर्ड आउटपुट में जाता है और बाकी सब स्टैंडर्ड एरर में, इसलिए bws list --json | jq काम करता है और कोई चेतावनी आपके JSON में कभी नहीं आती।

+

हर JSON दस्तावेज़ सादा ASCII है: उसके बाहर का अक्षर छह वर्णों के एस्केप के रूप में लिखा जाता है जिसे हर JSON रीडर वापस अक्षर में बदल देता है, इसलिए bws list --json > file.json वैध UTF-8 है और | ConvertFrom-Json उसे सही पढ़ता है, कंसोल का कोड पेज चाहे जो हो। जिस पाठ को व्यक्ति पढ़ता है उसमें ऐसा वर्ण जो छपने के बजाय टर्मिनल को हिला देता, यानी टैब, पंक्ति विराम, एस्केप सीक्वेंस या दिशा ओवरराइड, अपने कोड पॉइंट के रूप में दिखाया जाता है, <U+001B>।

+

-- विकल्पों को खत्म कर देता है, इसलिए जिस सेवा का नाम डैश से शुरू होता है उसे भी नाम दिया जा सकता है: bws show -- -odd। टूल जो कमांड लाइनें आपको थमाता है वे PowerShell के लिए लिखी होती हैं: रिक्त स्थान वाला नाम दोहरे उद्धरण चिह्नों में जाता है, जिसे cmd भी उसी तरह पढ़ता है, और ऐसा नाम जिसे PowerShell उनके अंदर विस्तारित कर देता, जैसे MSSQL$SQLEXPRESS, एकल उद्धरण चिह्नों में जाता है।

+ {{table:exit-codes}} +

Ctrl+C के तीन स्तर हैं, और हर एक बताता है कि अगला क्या कीमत लेगा। पहला आगे बढ़ना रोकता है और जो लिया गया था उसे फिर भी वापस रखता है, दूसरा चीज़ों को जैसी हैं वैसी छोड़ देता है और फिर भी रिपोर्ट छापता है, तीसरा प्रक्रिया को खत्म कर देता है। हाथ से रोका गया रन 4 के साथ खत्म होता है, भले ही हर चरण पहुँच चुका हो।

+

कंसोल विंडो बंद करना पहले Ctrl+C में गिना जाता है। इसके बाद Windows प्रोग्राम को पाँच सेकंड देता है, और उनमें यह आगे बढ़ना रोक देता है और जो बंद किया था उसे वापस रख देता है। साइन आउट और शटडाउन इसे ऐसी किसी चेतावनी के बिना खत्म कर देते हैं जिस पर यह कुछ कर सके, और टूटा हुआ रिमोट सत्र भी कर सकता है।

+
+
+ +
+
+

शेड्यूल किए गए टास्क में

+

वह रूप जिसके लिए यह टूल बनाया गया था: मशीन को तब फ़्रीज़ करें जब वह ठीक हो, फिर हर रात पूछें कि क्या वह अब भी ठीक है।

+
# जिस दिन मशीन सेवा में जाती है
+bws snapshot create C:\baselines\web01.json --note "after the build"
+
+# हर रात, शेड्यूल किए गए टास्क से
+bws snapshot diff C:\baselines\web01.json --live --exit-code --json > C:\logs\drift.json
+#   0 - कोई कॉन्फ़िगरेशन ड्रिफ्ट नहीं
+#   5 - कॉन्फ़िगरेशन ड्रिफ्ट हुआ, और drift.json बताता है कि क्या
+#   3 - यह चला और सब कुछ नहीं पढ़ सका, इसलिए जवाब आंशिक है
+

विंडो उसी इंजन का दूसरा आधा हिस्सा है: {{archive_window}} उसे रखता है, और डाउनलोड पृष्ठ बताता है कि हर आर्काइव क्या है।

+
+
+ +
+
+

विंडो का आर्ग्युमेंट

+

BetterWindowsServices.exe एक आर्ग्युमेंट लेता है जो किसी व्यक्ति के लिए है: --catalogue एक डेवलपर की शीट खोलता है जो विंडो के हर घटक को हर स्थिति में दिखाती है, और आपकी मशीन से कुछ नहीं पढ़ती। दूसरा, --carry, वह तरीका है जिससे कोई विंडो जो दिखा रही थी उसे अपनी उस प्रति को सौंपती है जिसे वह व्यवस्थापक के रूप में रीस्टार्ट करती है। इसे कोई टाइप नहीं करता, और उसमें जो कुछ उस विंडो ने नहीं लिखा हो सकता उसे मना कर दिया जाता है।

+
+
diff --git a/site/pages/cli-reference/th.html b/site/pages/cli-reference/th.html new file mode 100644 index 0000000..35498cf --- /dev/null +++ b/site/pages/cli-reference/th.html @@ -0,0 +1,193 @@ + + + + + + + +
+
+ อ้างอิง +

เอกสารอ้างอิงบรรทัดคำสั่ง

+

ทุกคำสั่ง ทุกตัวเลือก และทุกรหัสออกของ bws เวอร์ชัน {{version}} bws --help เป็นฉบับที่เชื่อถือได้และยาวกว่า หน้านี้คือพื้นผิวเดียวกันที่จัดไว้ให้อ่าน

+
+
+ +
+
+

คำสั่ง

+

11 คำสั่ง snapshot เป็นคำนามและต้องมีคำตามหลัง tool เป็นคำนามเช่นกัน และเมื่อใช้เดี่ยวๆ จะแสดงรายการเครื่องมือ

+
bws list [--query TEXT] [--signatures] [--memory] [--required-by] [--follow-network] [--json] [--timing]
+bws show NAME [--full] [--follow-network] [--json] [--timing]
+bws stop|start|restart NAME [--dry-run] [--dependents] [--timeout SECONDS] [--json] [--timing]
+bws kill NAME [--force] [--restart] [--dry-run] [--dependents] [--timeout SECONDS] [--json] [--timing]
+bws start-type NAME automatic|delayed|manual|disabled [--stop] [--dry-run] [--json] [--timing]
+bws snapshot create [FILE] [--note TEXT] [--follow-network] [--force] [--json] [--timing]
+bws snapshot diff EARLIER LATER [--exit-code] [--json] [--timing]
+bws snapshot diff EARLIER --live [--exit-code] [--json] [--timing]
+bws history [NAME] [--json] [--timing]
+bws tool
+bws tool fix
+bws tool fix NAME [--dry-run] [--timeout SECONDS] [--json] [--timing]
+bws license [--components]
+bws --help
+bws --version
+

คำสั่งที่พิมพ์ผิดจะได้รับคำแนะนำคำสั่งที่คุณน่าจะหมายถึง และการรันจบด้วยรหัส 2 แทนที่จะทำสิ่งที่ใกล้เคียงกับที่คุณขอ

+
$ bws lst
+There is no command lst. Did you mean list?
+
+
+ +
+
+

แต่ละคำสั่งทำอะไร

+
+
+

list และ show

+

list คือทั้งเครื่อง จำกัดให้แคบลงด้วย --query show คือหนึ่งรายการพร้อมทุกอย่างที่รู้เกี่ยวกับมัน ลายเซ็น สิทธิพิเศษ security descriptor และหน่วยความจำ อ่านทั้งหมดทุกครั้ง เพราะกับหนึ่งรายการมันใช้ประมาณ 60 มิลลิวินาที ขณะที่กับทั้งเครื่องใช้ 1 วินาที ฟิลด์ที่ว่างจริงๆ จะถูกละไว้ เว้นแต่คุณส่ง --full ฟิลด์ที่ไม่มีใครอ่านได้จะถูกพิมพ์เสมอ เพราะการละไว้จะดูเหมือนเป็นคำตอบ

+
+
+

stop, start และ restart

+

แต่ละคำสั่งสร้างแผนและทำตามแผนนั้น --dry-run พิมพ์แผนและไม่เปลี่ยนอะไร --dependents ใส่บริการที่จะเสียหายลงไปเป็นขั้นตอนของตัวเอง และ --timeout บอกว่าหนึ่งขั้นตอนอยู่ได้นานเท่าไรโดยไม่มีความคืบหน้า ไดรเวอร์ถูกปฏิเสธแทนที่จะลอง เพราะการหยุดไดรเวอร์เคอร์เนลมักย้อนกลับไม่ได้ถ้าไม่รีสตาร์ต

+
+
+

kill: สำหรับบริการที่หยุดไม่ลง

+

มันขอให้บริการหยุด และจบกระบวนการที่อยู่เบื้องหลัง เฉพาะเมื่อวิธีนั้นไม่ได้ผล รายการที่หยุดเองได้จึงไม่เคยถูกจบ การจบกระบวนการพาทุกบริการอื่นที่อยู่ในกระบวนการนั้นไปด้วย ไม่ว่าพวกมันจะหยุดก่อนหรือไม่ และตัวอย่างจะบอกชื่อพวกมันและระบุกระบวนการด้วยหมายเลข --force ข้ามขั้นตอนที่สุภาพ และตัวอย่างจะแสดงหนึ่งขั้นตอนแทนที่จะเป็นสอง --restart นำทุกอย่างกลับมาหลังจากนั้น

+

Windows สะกดความคิดนี้ต่างออกไป --force บน Stop-Service หมายถึง “แม้ว่าจะมีบางอย่างขึ้นอยู่กับมัน” ซึ่งคือสิ่งที่ --dependents ทำที่นี่ นั่นคือเหตุผลที่นี่เป็นคำสั่งของตัวเองแทนที่จะเป็นตัวเลือกของ stop

+
+
+

start-type: เป็นการตั้งค่า ไม่ใช่การเคลื่อนไหว

+

มันบอกว่าตัวจัดการจะทำอะไรกับรายการตอนบูตครั้งถัดไป และถ้าไม่มี --stop มันไม่ขยับอะไรเลย รายการที่กำลังทำงานก็ทำงานต่อ รายการที่หยุดอยู่ก็หยุดต่อ และแผนบอกไว้อย่างนั้น disabled คืออันที่ควรหยุดคิด เพราะมันทำให้ตัวจัดการไม่เริ่มรายการเลย รวมถึงเริ่มตามความต้องการให้สิ่งอื่นที่ต้องใช้มัน delayed คืออัตโนมัติที่เริ่มช้ากว่ารายการอัตโนมัติอื่นเล็กน้อย เป็นคำที่ start:delayed ถามถึงในคิวรี และ Windows ปฏิเสธมันสำหรับรายการในกลุ่มลำดับการโหลด ซึ่งแผนบอกก่อนจะมีอะไรเกิดขึ้น ทั้งสี่แบบเขียนว่ารายการเริ่มช้าหรือไม่ เหมือนที่ sc.exe ทำ --stop ซึ่งใช้ได้เฉพาะคู่กับ disabled จะหยุดรายการในแผนเดียวกันเมื่อเขียนการตั้งค่าแล้ว

+
+
+

snapshot create และ snapshot diff

+

create อ่านลายเซ็นและแฮชเสมอ เพราะสแนปช็อตถูกเก็บไว้และเปรียบเทียบทีหลัง และสแนปช็อตที่ไม่มีมันเมื่อเทียบกับอันที่มีจะดูเหมือนเครื่องเปลี่ยนไป diff บอกว่าอะไรเปลี่ยนจากไฟล์แรกไปไฟล์ที่สอง หรือจากไฟล์ไปเครื่องนี้ด้วย --live หน้าสแนปช็อตมีรูปแบบและเหตุผล

+
+
+

history: ใครเปลี่ยน จาก System log

+

การเปลี่ยนประเภทการเริ่มต้นและการติดตั้งจาก System log ใหม่สุดก่อน พร้อมบัญชีที่ Windows บันทึกไว้ บรรทัดแรกบอกว่า log ย้อนไปไกลแค่ไหนและเคยถูกล้างหรือไม่ เพราะประวัติยาวเท่า log เท่านั้น เมื่อมีชื่อ จะเป็นการเปลี่ยนประเภทการเริ่มต้นของบริการนั้น การติดตั้งแสดงเฉพาะเมื่อไม่มีชื่อ เพราะ Windows บันทึกการติดตั้งภายใต้ชื่อที่แสดงและไม่เคยเป็นชื่อบริการ บัญชีแสดงเป็นชื่อเมื่อเครื่องนี้ระบุชื่อได้เอง และแสดงเป็น SID ในกรณีอื่น และประเภทการเริ่มต้นมาเป็นคำที่ Windows เขียน

+
+
+

tool: คำตอบสำเร็จรูปสำหรับปัญหาที่พบบ่อย

+

เครื่องมือเดียวกับที่หน้าต่างแสดงในแท็บ Tools bws tool แสดงรายการ และ bws tool fix แสดงการแก้ด่วน: printer, sound, indexing และ search แต่ละตัวคือการรีสตาร์ตบริการ Windows หนึ่งตัวพร้อมสิ่งที่ขึ้นอยู่กับมัน เลือกเพราะหน้าแก้ปัญหาของ Microsoft เองแนะนำ bws tool fix printer ก็คือ bws restart Spooler --dependents ทุกประการ แผนเดียวกัน ผลลัพธ์เดียวกัน และรหัสออกเดียวกัน และเหมือนทุกคำสั่งที่นี่ที่เปลี่ยนอะไรสักอย่าง มันไม่ถามก่อน ดังนั้น --dry-run คือทางที่จะดูก่อนรัน

+
+
+

license: อะไรอยู่ในไฟล์ที่คุณดาวน์โหลด

+

มันไม่อ่านอะไรเลย ไม่อ่านตัวจัดการบริการ ไม่อ่านดิสก์ ไม่อ่านเครือข่าย และตอบจากทะเบียนที่คอมไพล์อยู่ในไฟล์ปฏิบัติการ --components เปลี่ยนประกาศให้เป็นทุกคอมโพเนนต์พร้อมเวอร์ชัน สัญญาอนุญาต และแหล่งที่มา ชุดเดียวกับที่รายการส่วนประกอบซึ่งเผยแพร่ข้างการดาวน์โหลดมี เพราะทั้งสองสร้างจากทะเบียนเดียวกัน และเป็นเหตุผลที่มีมันไว้ดี โปรแกรมเป็นไฟล์ครบในตัวไฟล์เดียว จึงไม่มีอะไรข้างๆ ให้เครื่องสแกนอ่าน

+
+
+
+
+ +
+
+

ตัวอย่าง

+

แผนด้านล่างถูกตรวจด้วย --dry-run กับโปรแกรมที่หน้านี้อธิบาย คำสั่งที่เปลี่ยนอะไรสักอย่างไม่ถามก่อน ดังนั้น --dry-run คือทางที่จะดูก่อนรัน Spooler แทนบริการใดก็ได้ ใส่ชื่อของคุณแทนที่

+
+

ค้นหาและอ่าน

+
bws list                                       ทุกบริการและไดรเวอร์บนเครื่องนี้
+bws list --query "start:auto !status:running"  อะไรที่ควรทำงานแต่ไม่ได้ทำงาน
+bws list --query "status:running" --memory     กระบวนการของแต่ละรายการที่กำลังทำงานใช้อะไรอยู่
+bws show Spooler                               ทุกอย่างที่รู้เกี่ยวกับหนึ่งรายการ
+bws show Spooler --full                        รวมถึงฟิลด์ที่ว่างจริงๆ
+

ดูก่อน แล้วค่อยเปลี่ยน

+
bws restart Spooler --dry-run                แผน และไม่มีอะไรอีก
+bws restart Spooler --dependents             รีสตาร์ตมันพร้อมสิ่งที่ขึ้นอยู่กับมัน
+bws stop Spooler --dependents --timeout 120  ให้เวลาสองนาทีต่อขั้นตอนโดยไม่มีความคืบหน้า
+bws start-type WSearch delayed --dry-run     เริ่มมันช้ากว่ารายการอัตโนมัติอื่นเล็กน้อย
+bws start-type Spooler disabled --stop       ปิดใช้งานและหยุดมันในแผนเดียว
+

บริการที่หยุดไม่ลง

+
bws kill Spooler --dry-run          กระบวนการ และทุกบริการที่อยู่ในนั้น
+bws kill Spooler --restart          จบกระบวนการเฉพาะเมื่อการหยุดล้มเหลว แล้วนำทุกอย่างกลับมา
+bws kill Spooler --force --dry-run  หนึ่งขั้นตอนแทนที่จะเป็นสอง: จบกระบวนการทันที
+

สแนปช็อตและดริฟต์

+
bws snapshot create before.json --note "before the patch"  บันทึกสถานะเครื่อง พร้อมหมายเหตุที่เก็บไว้ข้างใน
+bws snapshot diff before.json after.json                   สองไฟล์ ห่างกันสองวัน หรือสองเครื่อง
+bws snapshot diff before.json --live                       ไฟล์เทียบกับเครื่องนี้ในสภาพตอนนี้
+bws snapshot diff before.json --live --exit-code           เหมือนกัน แต่จบด้วย 5 เมื่อการกำหนดค่าดริฟต์
+

ใครเปลี่ยน

+
bws history          ทุกการเปลี่ยนประเภทการเริ่มต้นและการติดตั้งที่ System log เก็บไว้
+bws history Spooler  การเปลี่ยนประเภทการเริ่มต้นของบริการหนึ่งตัว
+bws history --json   เหมือนกันแต่เป็นเอกสาร พร้อม log และการเปลี่ยนแปลง
+

การแก้ด่วน

+
bws tool                      เครื่องมือที่มี
+bws tool fix                  การแก้ด่วน และบริการที่อยู่เบื้องหลังแต่ละตัว
+bws tool fix sound --dry-run  แผนการรีสตาร์ตบริการเสียงสองตัว
+bws tool fix printer          รีสตาร์ต Print Spooler พร้อมสิ่งที่ขึ้นอยู่กับมัน
+

อะไรอยู่ในไฟล์

+
bws license --components  ทุกคอมโพเนนต์ เวอร์ชัน สัญญาอนุญาต และแหล่งที่มา
+bws --version             เวอร์ชันของไฟล์ปฏิบัติการนี้
+

ในสคริปต์ PowerShell

+
# รายการที่ควรทำงานแต่ไม่ได้ทำงาน ในรูปแบบอ็อบเจกต์
+bws list --query "start:auto !status:running" --json | ConvertFrom-Json | Select-Object serviceName, displayName, status
+
+# ไฟล์ที่ไม่มีลายเซ็น ลงสเปรดชีต
+bws list --query "signed:no" --json | ConvertFrom-Json | Select-Object serviceName, binaryPath | Export-Csv unsigned.csv -NoTypeInformation
+
+# สิ่งที่บริการหนึ่งต้องใช้
+(bws show Spooler --json | ConvertFrom-Json).dependsOn
+
+# การตรวจตอนกลางคืนที่แตกสาขาตามรหัสออก
+bws snapshot diff C:\baselines\web01.json --live --exit-code > $null
+switch ($LASTEXITCODE) {
+  0 { 'no configuration drift' }
+  5 { 'the configuration drifted' }
+  default { "no clean answer, exit code $LASTEXITCODE" }
+}
+

ใน cmd และไฟล์แบตช์

+
rem คำสั่งที่สองเฉพาะเมื่อคำสั่งแรกไม่จบอย่างสะอาด
+bws restart Spooler || echo the restart did not end cleanly
+
+rem ในไฟล์แบตช์ที่เปิด delayed expansion ไว้ ! ต้องมี caret
+bws list --query "start:auto ^!status:running"
+
+
+
+ +
+
+

ตัวเลือก

+

{{switch_count}} ตัว คอลัมน์ที่สามคือคำสั่งที่แต่ละตัวเป็นของ ตัวเลือกที่ส่งให้คำสั่งที่ไม่ได้ใช้มันคือข้อผิดพลาดที่มีรายการนั้นอยู่ข้างใน แทนที่จะเป็นแฟล็กที่ถูกเมินเงียบๆ

+ {{table:switches}} +
+
+ +
+
+

รหัสออก

+

{{exit_code_count}} แบบของการจบ และทุกแบบเป็นสิ่งที่สคริปต์ต้องทำต่างกัน ข้อมูลไปที่ standard output และอย่างอื่นทั้งหมดไปที่ standard error ดังนั้น bws list --json | jq ใช้ได้ และคำเตือนจะไม่ปนเข้ามาใน JSON ของคุณ

+

ทุกเอกสาร JSON เป็น ASCII ล้วน ตัวอักษรนอกนั้นถูกเขียนเป็นอีสเคปหกตัวอักษรที่ตัวอ่าน JSON ทุกตัวแปลงกลับเป็นตัวอักษร ดังนั้น bws list --json > file.json เป็น UTF-8 ที่ถูกต้อง และ | ConvertFrom-Json อ่านถูกต้องไม่ว่าคอนโซลตั้งโค้ดเพจไว้เท่าไร ในข้อความที่คนอ่าน ตัวอักษรที่จะเลื่อนเทอร์มินัลแทนที่จะพิมพ์ เช่น แท็บ การขึ้นบรรทัดใหม่ ลำดับอีสเคป การกลับทิศทาง จะแสดงเป็นโค้ดพอยต์ของมัน <U+001B>

+

-- จบตัวเลือก ดังนั้นบริการที่ชื่อขึ้นต้นด้วยขีดก็ยังระบุชื่อได้: bws show -- -odd บรรทัดคำสั่งที่เครื่องมือส่งให้คุณเขียนไว้สำหรับ PowerShell ชื่อที่มีช่องว่างอยู่ในเครื่องหมายคำพูดคู่ ซึ่ง cmd อ่านแบบเดียวกัน และชื่อที่ PowerShell จะขยายภายในนั้น เช่น MSSQL$SQLEXPRESS อยู่ในเครื่องหมายคำพูดเดี่ยว

+ {{table:exit-codes}} +

Ctrl+C มีสามระดับ แต่ละระดับบอกว่าระดับถัดไปมีราคาเท่าไร ระดับแรกหยุดไม่ไปข้างหน้าและยังคงนำสิ่งที่เอาไปกลับคืน ระดับสองปล่อยสิ่งต่างๆ ไว้ตามที่เป็นและยังพิมพ์รายงาน ระดับสามจบกระบวนการ การรันที่หยุดด้วยมือจบด้วย 4 แม้ทุกขั้นตอนจะไปถึงที่หมายแล้ว

+

การปิดหน้าต่างคอนโซลนับเป็น Ctrl+C ครั้งแรก หลังจากนั้น Windows ให้โปรแกรมห้าวินาที และในช่วงนั้นโปรแกรมนี้หยุดไม่ไปข้างหน้าและนำสิ่งที่มันปิดไปกลับคืน การออกจากระบบและการปิดเครื่องจบมันโดยไม่มีคำเตือนที่มันตอบสนองได้ และเซสชันระยะไกลที่หลุดอาจเป็นเช่นนั้นด้วย

+
+
+ +
+
+

ในงานตามกำหนดเวลา

+

รูปแบบที่เครื่องมือนี้สร้างมาเพื่อ: บันทึกสถานะเครื่องเมื่อรู้ว่าดี แล้วถามทุกคืนว่ายังดีอยู่ไหม

+
# วันที่เครื่องเข้าสู่การใช้งาน
+bws snapshot create C:\baselines\web01.json --note "after the build"
+
+# ทุกคืน จากงานตามกำหนดเวลา
+bws snapshot diff C:\baselines\web01.json --live --exit-code --json > C:\logs\drift.json
+#   0 - ไม่มีดริฟต์ของการกำหนดค่า
+#   5 - การกำหนดค่าดริฟต์ และ drift.json บอกว่าอะไร
+#   3 - รันแล้วแต่อ่านไม่ได้ทั้งหมด คำตอบจึงไม่ครบ
+

หน้าต่างคืออีกครึ่งของเอนจินเดียวกัน: {{archive_window}} บรรจุมันไว้ และหน้าดาวน์โหลดบอกว่าแต่ละไฟล์บีบอัดคืออะไร

+
+
+ +
+
+

อาร์กิวเมนต์ของหน้าต่าง

+

BetterWindowsServices.exe รับหนึ่งอาร์กิวเมนต์ที่ตั้งใจให้คนใช้: --catalogue เปิดชีตของนักพัฒนาที่แสดงทุกคอมโพเนนต์ของหน้าต่างในทุกสถานะ และไม่อ่านอะไรจากเครื่องของคุณ อีกอันคือ --carry เป็นวิธีที่หน้าต่างส่งสิ่งที่กำลังแสดงอยู่ให้สำเนาของตัวเองที่รีสตาร์ตเป็นผู้ดูแลระบบ ไม่มีใครพิมพ์มัน และสิ่งใดในนั้นที่หน้าต่างนั้นเขียนไม่ได้จะถูกปฏิเสธ

+
+
diff --git a/site/pages/download/ar.html b/site/pages/download/ar.html new file mode 100644 index 0000000..fd32037 --- /dev/null +++ b/site/pages/download/ar.html @@ -0,0 +1,86 @@ + + + + + +
+
+ تنزيل +

فك الضغط وشغّل، أو ثبّت

+

الإصدار {{version}}. الأرشيفات لا تحتاج إلى برنامج تثبيت ولا تكتب شيئًا في السجل، والاطلاع لا يحتاج إلى صلاحيات المسؤول. أما برنامج التثبيت الموقّع فيضع البرنامجين على الجهاز كله بدلًا من ذلك. مجاني ومفتوح المصدر بموجب GPL-3.0.

+ +
+
+ +
+
+

ما الموجود في الإصدار

+
+ + + + + + + +
الملفما هو
{{archive_window}}النافذة: BetterWindowsServices.exe، ملف تنفيذي واحد قائم بذاته يحمل وقت تشغيل .NET الخاص به بداخله
{{archive_cli}}سطر الأوامر: bws.exe، ملف تنفيذي واحد قائم بذاته، للسكربتات والمهام المجدولة وCI
{{archive_installer}}برنامج التثبيت: البرنامجان معًا في Program Files لكل حساب على الجهاز، والنافذة في قائمة Start والأمر bws في PATH الخاص بالجهاز
+
+

خذ أحدهما أو كليهما: هما عميلان للمحرك نفسه ولا يحتاج أحدهما إلى الآخر. وعلى الخادم يكون سطر الأوامر الأصغر بين الاثنين ويفعل كل ما تفعله النافذة.

+

يحمل برنامج التثبيت ما في الأرشيفين تمامًا. ويُثبَّت بصمت بالأمر msiexec /i {{archive_installer}} /qn، وإصدار أحدث يُثبَّت فوق الأقدم، وهو لا يغلق شيئًا يعمل، فأغلق النافذة وأي bws يعمل قبل الترقية، لأن نسخة تُترك تعمل قد تتوقف بخطأ. والإزالة من Settings, Apps تحذف البرنامجين وإدخال قائمة Start وإدخال PATH، وتترك ملفاتك الخاصة.

+

الملفات التنفيذية موقّعة بتوقيع Authenticode، فيذكر Windows اسم الناشر بدل أن يحذّر من ناشر مجهول.

+
+
+ +
+
+

المتطلبات

+
    +
  • Windows 10 الإصدار 1809 أو أحدث، أو Windows Server 2019 أو أحدث. 64 بت فقط: العملية ذات 32 بت تقرأ مسارات ومفاتيح سجل مُعاد توجيهها، وهذا سيعطي إجابات خاطئة بصمت.
  • +
  • لا حاجة إلى تثبيت .NET. يحمل الملفان التنفيذيان وقت تشغيل .NET الخاص بهما.
  • +
  • صلاحيات المسؤول لتغيير أي شيء. القراءة والبحث واللقطات والمقارنات تعمل بدونها، مع ظهور عناصر أقل وإعلان الأداة ذلك في الأعلى بدل التظاهر بأن القائمة هي الجهاز كله.
  • +
+

تحتفظ النافذة بملف واحد خاص بها، هو التخطيط الذي تركت عليه القائمة، تحت %APPDATA%\BetterWindowsServices. وتذهب اللقطة إلى حيث تطلب من bws snapshot create وضعها، وإلى المجلد الحالي إن لم تطلب.

+

البرنامج يتحدث الإنجليزية. تقرأ النافذة ملف لغة، هو languages\gui.<code>.json، يوضع بجانبها ويُختار بلغة Windows، دون أي إعداد. فالترجمة إذن مساهمة يمكن إضافتها دون إعادة بناء، ويشرح CONTRIBUTING.md كيف.

+
+
+ +
+
+

برامج مكافحة الفيروسات وEDR

+

هذه الأداة تفعل ما يفعله المسؤول بالخدمات، وبعض ذلك هو ما تراقبه برامج الأمان.

+

تستطيع الأداة إيقاف الخدمات وبدءها، وإنهاء العملية الواقفة خلف إحداها، وهي تقرأ security descriptor والامتيازات المطلوبة لكل خدمة. وبرنامج EDR الذي ينبّه إلى عملية تُنهي svchost.exe يؤدي عمله، والإيقاف القسري هنا قد يبدو كذلك تمامًا.

+

وما لا تفعله، لتتحقق من الادعاء بنفسك: لا تحقن شيئًا في أي عملية، ولا تضغط ولا تشوّش شيئًا، ولا تثبّت خدمة ولا برنامج تشغيل ولا تترك شيئًا يعمل، ولا تفتح أي اتصال بالشبكة. وهي مفتوحة المصدر بموجب GPL-3.0 ويمكنك بناء الملفين التنفيذيين بنفسك.

+

إن كانت سياستك تحتاج إلى استثناء، فاستثنِ الملفين التنفيذيين كملفين لا كمجلد. والشيء الوحيد الجدير بالعناية نفسها التي تُعطى للأداة هو ملف اللقطة: فهو يصف الجهاز كله.

+
+
+ +
+
+

البناء من المصدر

+

.NET 10 SDK، على Windows.

+
git clone {{repo}}
+cd BetterWindowsServices
+dotnet build BetterWindowsServices.slnx -c Release
+dotnet test BetterWindowsServices.slnx -c Release
+

بعض الاختبارات تقرأ مدير التحكم بالخدمات الحقيقي في الجهاز الذي تعمل عليه وتقارن ما تقوله هذه الأداة بما يقوله sc.exe. وهي للقراءة فقط. والملفان التنفيذيان ذوا الملف الواحد اللذان تحملهما الإصدارات ناتجان عن أمري النشر هذين، وكل منهما ملف واحد وبداخله وقت التشغيل:

+
dotnet publish src/Bws.Cli/Bws.Cli.csproj -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true
+dotnet publish src/Bws.Gui/Bws.Gui.csproj -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true
+

يظهران باسمي bws.exe وBetterWindowsServices.exe تحت bin/Release/.../win-x64/publish/ في كل مشروع. أما ملفات .pdb بجانبهما فهي رموز لتصحيح الأخطاء، ولا يحتاج التشغيل إليها.

+
+
+ +
+
+

كلفة التشغيل

+

قيس على جهاز واحد فيه 810 خدمات. ستختلف أرقامك، فعدد الخدمات والقرص والمعالج كلها تؤثر فيها.

+
+

نحو ربع ثانية

ليقرأ bws list الجهاز كله.

+

نحو ثمانية أعشار الثانية

من بدء تشغيل النافذة إلى ظهور القائمة على الشاشة.

+

نحو 100 MB

للنافذة، نصفها إطار عمل واجهة المستخدم في Windows، قبل أن يعمل أي من كود هذه الأداة.

+

نحو 16 MB

لسطر الأوامر على الجهاز نفسه.

+
+
+
diff --git a/site/pages/download/hi.html b/site/pages/download/hi.html new file mode 100644 index 0000000..b30f78f --- /dev/null +++ b/site/pages/download/hi.html @@ -0,0 +1,86 @@ + + + + + +
+
+ डाउनलोड +

अनज़िप करके चलाएँ, या इंस्टॉल करें

+

संस्करण {{version}}। आर्काइव को इंस्टॉलर नहीं चाहिए और वे रजिस्ट्री में कुछ नहीं लिखते, और देखने के लिए व्यवस्थापक अधिकार नहीं चाहिए। इसके बजाय एक हस्ताक्षरित इंस्टॉलर दोनों प्रोग्राम पूरी मशीन पर लगा देता है। GPL-3.0 के तहत मुफ़्त और ओपन सोर्स।

+ +
+
+ +
+
+

रिलीज़ में क्या है

+
+ + + + + + + +
फ़ाइलयह क्या है
{{archive_window}}विंडो: BetterWindowsServices.exe, एक अपने-आप में पूर्ण निष्पादन योग्य फ़ाइल जिसके अंदर उसका अपना .NET रनटाइम है
{{archive_cli}}कमांड लाइन: bws.exe, एक अपने-आप में पूर्ण निष्पादन योग्य फ़ाइल, स्क्रिप्ट, शेड्यूल किए गए टास्क और CI के लिए
{{archive_installer}}इंस्टॉलर: दोनों प्रोग्राम Program Files में, मशीन के हर खाते के लिए, विंडो Start मेनू में और bws मशीन के PATH में
+
+

एक लें या दोनों। ये एक ही इंजन के दो क्लाइंट हैं और किसी को दूसरे की ज़रूरत नहीं। सर्वर पर कमांड लाइन दोनों में छोटी है और वह सब करती है जो विंडो करती है।

+

इंस्टॉलर में ठीक वही है जो दोनों आर्काइव में है। यह msiexec /i {{archive_installer}} /qn से चुपचाप इंस्टॉल होता है, नया संस्करण पुराने के ऊपर इंस्टॉल हो जाता है, और यह चल रही किसी चीज़ को बंद नहीं करता, इसलिए अपग्रेड से पहले विंडो और चल रहे किसी भी bws को बंद कर दें, क्योंकि चलती छोड़ी गई प्रति त्रुटि के साथ रुक सकती है। Settings, Apps से अनइंस्टॉल करने पर प्रोग्राम, Start मेनू की प्रविष्टि और PATH की प्रविष्टि हट जाती हैं, और आपकी अपनी फ़ाइलें वैसी ही रहती हैं।

+

निष्पादन योग्य फ़ाइलों पर Authenticode हस्ताक्षर है, इसलिए Windows अज्ञात प्रकाशक की चेतावनी देने के बजाय प्रकाशक का नाम बताता है।

+
+
+ +
+
+

आवश्यकताएँ

+
    +
  • Windows 10 संस्करण 1809 या बाद का, या Windows Server 2019 या बाद का। सिर्फ़ 64-बिट। 32-बिट प्रक्रिया पुनर्निर्देशित पथ और रजिस्ट्री कुंजियाँ पढ़ती है, जिनसे चुपचाप गलत नतीजे निकलते।
  • +
  • .NET इंस्टॉल करने की ज़रूरत नहीं। दोनों निष्पादन योग्य फ़ाइलें अपना .NET रनटाइम साथ रखती हैं।
  • +
  • कुछ भी बदलने के लिए व्यवस्थापक अधिकार चाहिए। पढ़ना, खोजना, स्नैपशॉट और diff इनके बिना भी चलते हैं, कम प्रविष्टियाँ दिखती हैं और टूल सबसे ऊपर यह बता देता है, यह दिखावा करने के बजाय कि सूची पूरी मशीन की है।
  • +
+

विंडो अपनी एक फ़ाइल रखती है, यानी वह लेआउट जिसमें आपने सूची छोड़ी थी, %APPDATA%\BetterWindowsServices के अंतर्गत। स्नैपशॉट वहाँ जाता है जहाँ आप bws snapshot create को रखने को कहें, और न कहें तो वर्तमान डायरेक्टरी में।

+

प्रोग्राम अंग्रेज़ी में बोलता है। विंडो एक भाषा फ़ाइल पढ़ती है, languages\gui.<code>.json, जो उसके बगल में रखी होती है और Windows की भाषा से चुनी जाती है, बिना किसी सेटिंग के। इसलिए अनुवाद एक ऐसा योगदान है जिसे बिना दोबारा बिल्ड किए जोड़ा जा सकता है। CONTRIBUTING.md बताता है कैसे।

+
+
+ +
+
+

एंटीवायरस और EDR

+

यह टूल वही करता है जो एक व्यवस्थापक सेवाओं के साथ करता है, और उसमें से कुछ वही है जिस पर सुरक्षा सॉफ़्टवेयर नज़र रखता है।

+

यह सेवाएँ रोकता और शुरू करता है, किसी सेवा के पीछे की प्रक्रिया खत्म कर सकता है, और हर सेवा का security descriptor और ज़रूरी विशेषाधिकार पढ़ता है। जो EDR svchost.exe को खत्म करने वाली प्रक्रिया को चिह्नित करता है वह अपना काम कर रहा है, और यहाँ ज़बरदस्ती रोकना ठीक वैसा ही दिख सकता है।

+

यह जो नहीं करता, ताकि आप दावे को जाँच सकें: यह किसी प्रक्रिया में कुछ इंजेक्ट नहीं करता, कुछ पैक या ऑब्फ़स्केट नहीं करता, कोई सेवा या ड्राइवर इंस्टॉल नहीं करता और कुछ चलता नहीं छोड़ता, और कोई नेटवर्क कनेक्शन नहीं खोलता। यह GPL-3.0 के तहत ओपन सोर्स है और आप दोनों निष्पादन योग्य फ़ाइलें खुद बना सकते हैं।

+

यदि आपकी नीति को अपवाद चाहिए, तो फ़ोल्डर के बजाय दोनों निष्पादन योग्य फ़ाइलों को फ़ाइल के रूप में अपवाद बनाएँ। जिस एक चीज़ को टूल जितनी ही सावधानी से संभालना चाहिए वह स्नैपशॉट फ़ाइल है: वह पूरी मशीन का वर्णन करती है।

+
+
+ +
+
+

सोर्स से बिल्ड करना

+

.NET 10 SDK, Windows पर।

+
git clone {{repo}}
+cd BetterWindowsServices
+dotnet build BetterWindowsServices.slnx -c Release
+dotnet test BetterWindowsServices.slnx -c Release
+

कुछ टेस्ट उस मशीन का असली सेवा नियंत्रण प्रबंधक पढ़ते हैं जिस पर वे चलते हैं और इस टूल की बात की तुलना sc.exe की बात से करते हैं। वे केवल-पढ़ने वाले हैं। रिलीज़ में जो एकल-फ़ाइल निष्पादन योग्य फ़ाइलें हैं वे ये दो पब्लिश हैं, हर एक एक फ़ाइल जिसके अंदर रनटाइम है:

+
dotnet publish src/Bws.Cli/Bws.Cli.csproj -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true
+dotnet publish src/Bws.Gui/Bws.Gui.csproj -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true
+

ये bws.exe और BetterWindowsServices.exe के रूप में हर प्रोजेक्ट के bin/Release/.../win-x64/publish/ के अंतर्गत बनती हैं। उनके बगल की .pdb फ़ाइलें डीबगिंग सिंबल हैं, और चलने के लिए उनकी किसी को ज़रूरत नहीं।

+
+
+ +
+
+

इसे चलाने की लागत

+

810 सेवाओं वाली एक मशीन पर मापा गया। आपके आँकड़े अलग होंगे, क्योंकि सेवाओं की संख्या, डिस्क और प्रोसेसर तीनों इन्हें बदलते हैं।

+
+

लगभग चौथाई सेकंड

bws list को पूरी मशीन पढ़ने में।

+

लगभग 0.8 सेकंड

विंडो शुरू करने से लेकर सूची के स्क्रीन पर आने तक।

+

लगभग 100 MB

विंडो के लिए, जिसमें से आधा Windows यूज़र इंटरफ़ेस फ़्रेमवर्क है, इस टूल का अपना कोई कोड चलने से पहले।

+

लगभग 16 MB

उसी मशीन पर कमांड लाइन के लिए।

+
+
+
diff --git a/site/pages/download/th.html b/site/pages/download/th.html new file mode 100644 index 0000000..2e76f6c --- /dev/null +++ b/site/pages/download/th.html @@ -0,0 +1,86 @@ + + + + + +
+
+ ดาวน์โหลด +

แตกไฟล์แล้วรัน หรือติดตั้ง

+

เวอร์ชัน {{version}} ไฟล์ที่บีบอัดไม่ต้องใช้ตัวติดตั้งและไม่เขียนอะไรลงรีจิสทรี และการดูข้อมูลไม่ต้องใช้สิทธิ์ผู้ดูแลระบบ ตัวติดตั้งที่ลงลายเซ็นจะติดตั้งทั้งสองโปรแกรมให้ทั้งเครื่องแทน ฟรีและโอเพนซอร์สภายใต้ GPL-3.0

+ +
+
+ +
+
+

มีอะไรอยู่ในรีลีส

+
+ + + + + + + +
ไฟล์คืออะไร
{{archive_window}}หน้าต่าง: BetterWindowsServices.exe ไฟล์ปฏิบัติการแบบครบในตัวหนึ่งไฟล์ที่มีรันไทม์ .NET ของตัวเองอยู่ข้างใน
{{archive_cli}}บรรทัดคำสั่ง: bws.exe ไฟล์ปฏิบัติการแบบครบในตัวหนึ่งไฟล์ สำหรับสคริปต์ งานตามกำหนดเวลา และ CI
{{archive_installer}}ตัวติดตั้ง: ทั้งสองโปรแกรมใน Program Files สำหรับทุกบัญชีในเครื่อง หน้าต่างอยู่ในเมนูเริ่ม และ bws อยู่ใน PATH ของเครื่อง
+
+

เลือกหนึ่งหรือทั้งสองอย่างก็ได้ ทั้งสองเป็นไคลเอนต์ของเอนจินเดียวกันและไม่ต้องพึ่งอีกตัว บนเซิร์ฟเวอร์ บรรทัดคำสั่งเป็นตัวที่เล็กกว่าและทำได้ทุกอย่างที่หน้าต่างทำ

+

ตัวติดตั้งมีเนื้อหาเท่ากับที่ไฟล์บีบอัดสองไฟล์มีทุกประการ ติดตั้งแบบเงียบด้วย msiexec /i {{archive_installer}} /qn เวอร์ชันใหม่ติดตั้งทับเวอร์ชันเก่าได้ และมันไม่ปิดอะไรที่กำลังทำงานอยู่ ดังนั้นให้ปิดหน้าต่างและ bws ที่กำลังรันอยู่ก่อนอัปเกรด เพราะสำเนาที่ค้างไว้อาจหยุดพร้อมข้อผิดพลาด การถอนการติดตั้งจาก Settings, Apps จะลบโปรแกรม รายการในเมนูเริ่ม และรายการ PATH และไม่แตะไฟล์ของคุณเอง

+

ไฟล์ปฏิบัติการมีลายเซ็น Authenticode ดังนั้น Windows จะแสดงชื่อผู้เผยแพร่ แทนที่จะเตือนว่าเป็นผู้เผยแพร่ที่ไม่รู้จัก

+
+
+ +
+
+

ข้อกำหนด

+
    +
  • Windows 10 เวอร์ชัน 1809 ขึ้นไป หรือ Windows Server 2019 ขึ้นไป 64 บิตเท่านั้น กระบวนการ 32 บิตอ่านพาธและคีย์รีจิสทรีที่ถูกเปลี่ยนเส้นทาง ซึ่งจะให้คำตอบผิดโดยไม่มีเสียงเตือน
  • +
  • ไม่ต้องติดตั้ง .NET ไฟล์ปฏิบัติการทั้งสองมีรันไทม์ .NET ของตัวเอง
  • +
  • ต้องใช้สิทธิ์ผู้ดูแลระบบเพื่อเปลี่ยนแปลงอะไรก็ตาม การอ่าน ค้นหา สแนปช็อต และ diff ทำงานได้โดยไม่ต้องมี แต่จะเห็นรายการน้อยลง และเครื่องมือจะบอกไว้ที่ด้านบนแทนที่จะแสร้งว่ารายชื่อคือทั้งเครื่อง
  • +
+

หน้าต่างเก็บไฟล์ของตัวเองไว้ไฟล์เดียว คือเลย์เอาต์ที่คุณทิ้งรายชื่อไว้ ใต้ %APPDATA%\BetterWindowsServices สแนปช็อตไปอยู่ที่ที่คุณบอก bws snapshot create ให้วาง และไปอยู่ในไดเรกทอรีปัจจุบันเมื่อคุณไม่ได้บอก

+

โปรแกรมใช้ภาษาอังกฤษ หน้าต่างอ่านไฟล์ภาษา languages\gui.<code>.json ที่วางไว้ข้างๆ และเลือกตามภาษาของ Windows โดยไม่มีสวิตช์ การแปลจึงเป็นการมีส่วนร่วมที่เพิ่มได้โดยไม่ต้องสร้างใหม่ CONTRIBUTING.md บอกวิธี

+
+
+ +
+
+

แอนตี้ไวรัสและ EDR

+

เครื่องมือนี้ทำสิ่งที่ผู้ดูแลระบบทำกับบริการ และส่วนหนึ่งคือสิ่งที่ซอฟต์แวร์ความปลอดภัยเฝ้าดู

+

มันหยุดและเริ่มบริการ จบกระบวนการที่อยู่เบื้องหลังบริการได้ และอ่าน security descriptor กับสิทธิพิเศษที่ต้องใช้ของทุกบริการ EDR ที่แจ้งเตือนกระบวนการที่จบ svchost.exe กำลังทำหน้าที่ของมัน และการบังคับหยุดที่นี่อาจดูเหมือนกันทุกประการ

+

สิ่งที่มันไม่ทำ เพื่อให้คุณตรวจสอบคำกล่าวนี้ได้: มันไม่ฉีดอะไรเข้ากระบวนการใดๆ ไม่แพ็กหรือทำให้โค้ดอ่านยาก ไม่ติดตั้งบริการหรือไดรเวอร์ ไม่ทิ้งอะไรไว้ทำงานอยู่ และไม่เปิดการเชื่อมต่อเครือข่าย มันเป็นโอเพนซอร์สภายใต้ GPL-3.0 และคุณสร้างไฟล์ปฏิบัติการทั้งสองเองได้

+

ถ้านโยบายของคุณต้องการข้อยกเว้น ให้ยกเว้นไฟล์ปฏิบัติการสองไฟล์นี้ตามไฟล์แทนที่จะยกเว้นทั้งโฟลเดอร์ สิ่งเดียวที่ควรดูแลด้วยความระมัดระวังเท่ากับตัวเครื่องมือเองคือไฟล์สแนปช็อต: มันอธิบายทั้งเครื่อง

+
+
+ +
+
+

สร้างจากซอร์ส

+

.NET 10 SDK บน Windows

+
git clone {{repo}}
+cd BetterWindowsServices
+dotnet build BetterWindowsServices.slnx -c Release
+dotnet test BetterWindowsServices.slnx -c Release
+

บางการทดสอบอ่าน service control manager จริงของเครื่องที่รันอยู่ และเปรียบเทียบสิ่งที่เครื่องมือนี้บอกกับสิ่งที่ sc.exe บอก การทดสอบเหล่านั้นอ่านอย่างเดียว ไฟล์ปฏิบัติการไฟล์เดียวที่รีลีสบรรจุมาจากการ publish สองครั้งนี้ ครั้งละหนึ่งไฟล์ที่มีรันไทม์อยู่ข้างใน:

+
dotnet publish src/Bws.Cli/Bws.Cli.csproj -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true
+dotnet publish src/Bws.Gui/Bws.Gui.csproj -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true
+

ไฟล์เหล่านี้อยู่ที่ bws.exe และ BetterWindowsServices.exe ใต้ bin/Release/.../win-x64/publish/ ของแต่ละโปรเจกต์ ไฟล์ .pdb ข้างๆ คือสัญลักษณ์สำหรับดีบัก และไม่มีอะไรต้องใช้มันเพื่อรัน

+
+
+ +
+
+

ต้องใช้ทรัพยากรเท่าไร

+

วัดบนเครื่องเดียวที่มี 810 บริการ ตัวเลขของคุณจะต่างออกไป จำนวนบริการ ดิสก์ และโปรเซสเซอร์ล้วนทำให้ตัวเลขเปลี่ยน

+
+

ประมาณหนึ่งในสี่วินาที

สำหรับ bws list ที่จะอ่านทั้งเครื่อง

+

ประมาณแปดในสิบวินาที

ตั้งแต่เริ่มหน้าต่างจนรายชื่อขึ้นหน้าจอ

+

ประมาณ 100 MB

สำหรับหน้าต่าง ครึ่งหนึ่งเป็นเฟรมเวิร์กส่วนติดต่อผู้ใช้ของ Windows ก่อนที่โค้ดของเครื่องมือนี้เองจะรัน

+

ประมาณ 16 MB

สำหรับบรรทัดคำสั่งบนเครื่องเดียวกัน

+
+
+
diff --git a/site/pages/faq/ar.html b/site/pages/faq/ar.html new file mode 100644 index 0000000..33c3b92 --- /dev/null +++ b/site/pages/faq/ar.html @@ -0,0 +1,78 @@ + + + + + +
+
+ أسئلة +

أسئلة، وحدود

+

الأداة التي تفشل بصمت في تغطية شيء أسوأ من أداة تقول ما لا تستطيع فعله. والحدود موجودة في هذه الصفحة أيضًا، في مجموعتين: ما ترفضه بحكم التصميم، وما يفعله Windows وتبلّغ عنه الأداة كما هو.

+
+
+ +
+
+
+
+

ما الفرق بينها وبين sc.exe أو Get-Service أو services.msc؟

+

الأمران sc query وGet-Service يخبرانك بما يعمل. وservices.msc يتيح لك تغييره، صفًا واحدًا في كل مرة، دون طريقة لطرح سؤال ودون سجل بعد ذلك. أما هذه الأداة فتطرح السؤال (start:auto !status:running)، وتريك الخطة قبل أن تتصرف، وتحتفظ بلقطة يمكنك مقارنتها بعد أسبوع. وحيثما اختلفت مع sc.exe بشأن خدمة فذلك خلل، فجزء من مجموعة الاختبارات يشغّل الاثنين ويقارن بينهما عنصرًا عنصرًا. المقارنة الأطول هنا.

+
+
+

هل يحتاج إلى الإنترنت؟

+

أبدًا. لا قياس عن بُعد، ولا تحقق من التحديثات، ولا إبلاغ عن الأعطال، ولا حساب، ولا عميل لأي شيء. والمرة الوحيدة التي يمكن أن يلمس فيها شبكة هي حين تمرر --follow-network: عندها قد ينظر في مسار تشغيل على مشاركة جهاز آخر، ويدع Windows يجلب شهادة لا يحملها هذا الجهاز أصلًا. وهو معطّل افتراضيًا، والتعليمات تذكر السبب. أما زرا GitHub وDonate في النافذة والصفحة الموجودة في قائمة Help فكلٌّ منها يسلّم عنوانًا ثابتًا واحدًا إلى متصفحك عند الضغط عليه، والمتصفح هو الذي يتصل.

+
+
+

هل يحتاج إلى صلاحيات المسؤول؟

+

للاطلاع، لا. وللتغيير، نعم. بدونها يعرض المدير عناصر أقل ويرفض أكثر، وكلا النصفين يقولان ذلك في الأعلى بدل التظاهر بأن القائمة هي الجهاز كله. وتعرض النافذة Restart as admin. وهي لا ترفع صلاحياتها بنفسها أبدًا.

+
+
+

هل هو مجاني؟ وهل يمكنني استخدامه في العمل؟

+

نعم للاثنين. GPL-3.0، دون أي شروط خفية. واللقطة التي تأخذها هي ملفك.

+
+
+

هل سيعطّل خادمي؟

+

ليس من تلقاء نفسه. لا يتغير شيء دون خطة رأيتها، وتُرفض برامج التشغيل، والخطة التي ستوقف شيئًا يحتاجه الجهاز تقول ذلك. وما لا يستطيع حمايتك منه هو تنفيذ خطة لم تقرأها. وقائمة الخدمات التي يحتاجها الجهاز قائمة أولية من سبع: مكوّنا RPC ومشغّل DCOM، ومدير الحسابات، وعزل المفاتيح، ومدير الجلسات، والتوصيل والتشغيل. وسطح المكتب البعيد ليس فيها، فإن كنت تعمل عبر جلسة بعيدة فاقرأ الخطة.

+
+
+

هل هذا منتج من Microsoft؟

+

لا. {{product}} مشروع مستقل مفتوح المصدر ولا ارتباط له بشركة Microsoft، ولم تؤيده ولم ترعه. Windows علامة تجارية لمجموعة شركات Microsoft.

+
+
+

هل البرنامج بلغتي؟

+

لا: البرنامج يتحدث الإنجليزية، ولهذا تُرجم هذا الموقع. تقرأ النافذة ملف لغة، هو languages\gui.<code>.json، يوضع بجانب الملف التنفيذي، وتختاره بلغة Windows دون أي إعداد، فالترجمة مساهمة يمكن إضافتها دون إعادة بناء البرنامج. وأسماء الخدمات في القائمة هي ما يقوله Windows لديك، أي باللغة التي أُعدّ بها Windows.

+
+
+

لماذا النافذة داكنة بينما Windows لدي فاتح؟

+

هي داكنة وتبقى داكنة أيًا كان إعداد Windows، بما في ذلك سمة التباين العالي. وهذا مفحوص وليس مفترضًا: تحتفظ بألوانها الخاصة وتبقى مقروءة، ولا تتبع ذلك الإعداد.

+
+
+
+
+ +
+
+

بحكم التصميم

+
    +
  • الجهاز المحلي فقط. الإدارة عن بُعد ليست في هذا الإصدار. ولمقارنة جهازين خذ لقطة على كل منهما وقارن الملفين.
  • +
  • Windows فقط، و64 بت فقط، Windows 10 الإصدار 1809 أو Windows Server 2019 وما بعدهما.
  • +
  • العمليات على برامج التشغيل تُرفض ولا تُجرَّب، لأن إيقاف برنامج تشغيل في النواة كثيرًا ما لا يمكن التراجع عنه دون إعادة تشغيل.
  • +
  • الأداة لا ترفع صلاحياتها بنفسها. حين يرفض المدير تقول ذلك وتنتهي برمز الخروج 3. وتعرض النافذة أن تعيد تشغيل نفسها بصفة مسؤول، ولا تفعل غير ذلك.
  • +
  • إلغاء الشهادات لا يُفحص. سيحتاج ذلك إلى الوصول إلى الشبكة، وهذه الأداة لا تفعل ذلك أبدًا. فمعنى Trusted أن السلسلة كانت صالحة على هذا الجهاز، لا أن أحدًا لم يلغِ الشهادة منذ ذلك الحين.
  • +
  • تفك النافذة جزءًا من إطار عمل واجهة المستخدم في Windows قبل أن تبدأ. فهي بصفتها ملفًا واحدًا تحمل بضع مكتبات أصلية لا يستطيع Windows تحميلها إلا من القرص. وبدون صلاحيات المسؤول تكتبها، عند أول تشغيل لكل إصدار، في مجلد .net تحت المجلد المؤقت للحساب وتحمّلها من هناك. ومع صلاحيات المسؤول تستخدم بدلًا من ذلك ProgramData\BetterWindowsServices على قرص Windows، وهو مجلد تنشئه بحيث لا يغيّره إلا المسؤولون، وتفحصه عند كل تشغيل. وإن تعذر إنشاء ذلك المجلد، أو كان بوسع غيرهم تغييره، فلن تبدأ النافذة وتذكر أي مجلد وما العمل. والانتقال إلى هناك يعني أن النافذة المرفوعة الصلاحيات تبدأ نفسها مرة ثانية، وهذا يستغرق جزءًا من الثانية، ويترك كل إصدار مكتباته هناك (نحو 8 MB) إلى أن يحذف أحدهم المجلد. وسطر الأوامر لا يحمل مثل هذه المكتبات ولا يفك شيئًا.
  • +
  • الجلسة المرفوعة الصلاحيات تسمّي إعدادات .NET التي ترثها بدل أن ترفضها. فأداة التحليل (profiler) أو مفتاح التتبع أو التفريغ أو منفذ التشخيص المضبوط في البيئة لا يمكن إيقافه من داخل برنامج .NET، لذا تسرد النافذة وسطر الأوامر، مع صلاحيات المسؤول، ما تجده منها. أما خطافات بدء التشغيل فتُعطَّل تمامًا.
  • +
+
+
+ +
+
+

أشياء يفعلها Windows وتبلّغ عنها الأداة كما هي

+
    +
  • الخدمة المستضافة داخل svchost مسار تشغيلها يسمّي المضيف، فيكون الملف موجود ومن وقّعه أقل دلالة مما هما عليه لخدمة لها عمليتها الخاصة.
  • +
  • الملف الذي له توقيعه الخاص وإدخال في كتالوج Windows قد يسمّي موقّعين مختلفين. والناشر المعروض هو الذي داخل الملف، وهو الذي يبقى كما هو عند النظر إلى الملف على جهاز آخر، وقد يختلف عما يبلغ عنه PowerShell.
  • +
  • بدون صلاحيات المسؤول يسرد المدير عناصر أقل ويرفض أكثر مما يسرده. وكلا النصفين يقولان ذلك في الأعلى، واللقطة تسجّله، لأن مقارنة لقطة مأخوذة بصلاحيات مرتفعة بأخرى مأخوذة دونها كانت ستبلّغ عن عناصر محذوفة لم يحذفها أحد.
  • +
+

وجدت مشكلة، أو خدمة تبلّغ عنها هذه الأداة بخلاف sc.exe؟ متتبع المشكلات مفتوح، والمقارنة بين الاثنين أنفع شيء يمكنك لصقه فيه.

+
+
diff --git a/site/pages/faq/hi.html b/site/pages/faq/hi.html new file mode 100644 index 0000000..55993f9 --- /dev/null +++ b/site/pages/faq/hi.html @@ -0,0 +1,78 @@ + + + + + +
+
+ सवाल +

सवाल, और सीमाएँ

+

जो टूल चुपचाप किसी चीज़ को कवर करने में विफल रहता है, वह उस टूल से बुरा है जो बताता है कि वह क्या नहीं कर सकता। सीमाएँ भी इसी पृष्ठ पर हैं, दो समूहों में: जिसे यह डिज़ाइन से मना करता है, और जो Windows करता है और जिसे यह टूल जैसा है वैसा ही रिपोर्ट करता है।

+
+
+ +
+
+
+
+

यह sc.exe, Get-Service या services.msc से कैसे अलग है?

+

sc query और Get-Service बताते हैं कि क्या चल रहा है। services.msc आपको उसे बदलने देता है, एक बार में एक पंक्ति, बिना कोई सवाल पूछने के तरीके के और बाद में बिना किसी रिकॉर्ड के। यह टूल सवाल पूछता है (start:auto !status:running), कुछ करने से पहले योजना दिखाता है, और एक स्नैपशॉट रखता है जिसकी तुलना आप एक हफ़्ते बाद कर सकते हैं। जहाँ यह किसी सेवा के बारे में sc.exe से असहमत हो, वह बग है, क्योंकि टेस्ट सूट का एक हिस्सा दोनों को चलाकर उनकी प्रविष्टि-दर-प्रविष्टि तुलना करता है। लंबी तुलना यहाँ है।

+
+
+

क्या इसे इंटरनेट चाहिए?

+

कभी नहीं। कोई टेलीमेट्री नहीं, अपडेट जाँच नहीं, क्रैश रिपोर्टिंग नहीं, खाता नहीं, किसी चीज़ का क्लाइंट नहीं। जब आप --follow-network देते हैं तभी यह एक बार नेटवर्क को छू सकता है: तब यह किसी दूसरी मशीन के शेयर पर मौजूद लॉन्च पथ को देख सकता है, और Windows को ऐसा प्रमाणपत्र लाने दे सकता है जो इस मशीन के पास पहले से नहीं है। यह डिफ़ॉल्ट रूप से बंद है, और सहायता बताती है कि क्यों। विंडो में GitHub और Donate बटन और उसके Help मेनू का पृष्ठ, दबाने पर, हर एक आपके ब्राउज़र को एक तय पता सौंपता है, और कनेक्ट आपका ब्राउज़र करता है।

+
+
+

क्या इसे व्यवस्थापक अधिकार चाहिए?

+

देखने के लिए नहीं। बदलने के लिए हाँ। इनके बिना सेवा प्रबंधक कम प्रविष्टियाँ दिखाता है और ज़्यादा मना करता है, और दोनों हिस्से सबसे ऊपर यह बता देते हैं, यह दिखावा करने के बजाय कि सूची पूरी मशीन की है। विंडो Restart as admin का विकल्प देती है। यह खुद अपने अधिकार कभी नहीं बढ़ाती।

+
+
+

क्या यह मुफ़्त है? क्या इसे काम पर इस्तेमाल किया जा सकता है?

+

दोनों का जवाब हाँ। GPL-3.0, कोई शर्त नहीं। आपका लिया हुआ स्नैपशॉट आपकी अपनी फ़ाइल है।

+
+
+

क्या यह मेरा सर्वर बिगाड़ देगा?

+

अपने आप नहीं। कोई भी चीज़ बिना ऐसी योजना के नहीं बदलती जिसे आपने देखा हो, ड्राइवरों को मना कर दिया जाता है, और जो योजना मशीन की ज़रूरत की किसी चीज़ को बंद कर देती उसमें यह लिखा होता है। जिससे यह आपको नहीं बचा सकता वह है ऐसी योजना को चला देना जिसे आपने पढ़ा नहीं। मशीन को जिन सेवाओं की ज़रूरत है उनकी सूची सात की शुरुआती सूची है: RPC के दोनों हिस्से और DCOM लॉन्चर, खाता प्रबंधक, कुंजी अलगाव, सत्र प्रबंधक और प्लग एंड प्ले। और रिमोट डेस्कटॉप उसमें नहीं है, इसलिए रिमोट सत्र में योजना पढ़ें।

+
+
+

क्या यह Microsoft का उत्पाद है?

+

नहीं। {{product}} एक स्वतंत्र ओपन सोर्स प्रोजेक्ट है और इसका Microsoft से कोई संबंध नहीं है, न Microsoft ने इसका समर्थन किया है और न इसे प्रायोजित किया है। Windows, Microsoft समूह की कंपनियों का ट्रेडमार्क है।

+
+
+

क्या प्रोग्राम मेरी भाषा में है?

+

नहीं। प्रोग्राम अंग्रेज़ी में बोलता है, और इसीलिए यह साइट अनूदित है। विंडो एक भाषा फ़ाइल पढ़ती है, languages\gui.<code>.json, जो निष्पादन योग्य फ़ाइल के बगल में रखी होती है, और उसे Windows की भाषा से चुनती है, बिना किसी सेटिंग के, इसलिए अनुवाद एक ऐसा योगदान है जिसे प्रोग्राम को दोबारा बिल्ड किए बिना जोड़ा जा सकता है। सूची में सेवाओं के नाम वही हैं जो आपका Windows उन्हें बताता है, यानी उस भाषा में जिसमें आपका Windows सेट है।

+
+
+

मेरा Windows हल्का है तो विंडो गहरी क्यों है?

+

यह गहरी है और Windows की सेटिंग कुछ भी हो, गहरी ही रहती है, हाई कॉन्ट्रास्ट थीम में भी। यह मानी हुई बात नहीं, जाँची हुई बात है: यह अपने रंग रखती है और पढ़ने लायक रहती है, और उस सेटिंग का पालन नहीं करती।

+
+
+
+
+ +
+
+

डिज़ाइन से

+
    +
  • सिर्फ़ स्थानीय मशीन। रिमोट प्रबंधन इस संस्करण में नहीं है। दो मशीनों की तुलना के लिए हर एक पर एक स्नैपशॉट लें और दोनों फ़ाइलों की तुलना करें।
  • +
  • सिर्फ़ Windows, सिर्फ़ 64-बिट, Windows 10 1809 या Windows Server 2019 और उसके बाद के संस्करण।
  • +
  • ड्राइवरों पर ऑपरेशन आज़माए नहीं जाते, मना कर दिए जाते हैं, क्योंकि कर्नेल ड्राइवर रोकना अक्सर रीस्टार्ट के बिना वापस नहीं किया जा सकता।
  • +
  • टूल अपने विशेषाधिकार खुद नहीं बढ़ाता। जब प्रबंधक मना करता है, तो यह वैसा बता देता है और एग्ज़िट कोड 3 के साथ खत्म होता है। विंडो खुद को व्यवस्थापक के रूप में रीस्टार्ट करने की पेशकश करती है, और इस बारे में और कुछ नहीं करती।
  • +
  • प्रमाणपत्र का निरस्तीकरण जाँचा नहीं जाता। इसके लिए नेटवर्क तक पहुँचना पड़ता, और यह टूल ऐसा कभी नहीं करता। इसलिए Trusted का मतलब है कि इस मशीन पर श्रृंखला मान्य थी, यह नहीं कि तब से किसी ने प्रमाणपत्र रद्द नहीं किया।
  • +
  • विंडो शुरू होने से पहले Windows यूज़र इंटरफ़ेस फ़्रेमवर्क का एक हिस्सा अनपैक करती है। एक फ़ाइल के रूप में यह कुछ नेटिव लाइब्रेरी साथ रखती है जिन्हें Windows केवल डिस्क से लोड कर सकता है। व्यवस्थापक अधिकारों के बिना यह उन्हें हर संस्करण के पहले स्टार्ट पर खाते के अस्थायी फ़ोल्डर के नीचे एक .net फ़ोल्डर में लिखती है और वहीं से लोड करती है। व्यवस्थापक अधिकारों के साथ यह इसके बजाय Windows ड्राइव पर ProgramData\BetterWindowsServices का उपयोग करती है। यह ऐसा फ़ोल्डर है जिसे वह इस तरह बनाती है कि केवल व्यवस्थापक उसे बदल सकें, और हर स्टार्ट पर उसकी जाँच करती है। यदि वह फ़ोल्डर बन न सके, या दूसरे उसे बदल सकें, तो विंडो शुरू नहीं होती और बताती है कि कौन सा फ़ोल्डर है और क्या करना है। वहाँ जाने का मतलब है कि उन्नत अधिकारों वाली विंडो खुद को दूसरी बार शुरू करती है, जिसमें एक सेकंड का एक छोटा हिस्सा लगता है, और हर संस्करण अपनी लाइब्रेरी वहाँ (लगभग 8 MB) छोड़ देता है जब तक कोई फ़ोल्डर को हटा न दे। कमांड लाइन में ऐसी कोई लाइब्रेरी नहीं है और वह कुछ अनपैक नहीं करती।
  • +
  • उन्नत अधिकारों वाला सत्र विरासत में मिली .NET सेटिंग्स को मना करने के बजाय उनके नाम बताता है। एनवायरनमेंट में सेट प्रोफ़ाइलर, ट्रेस या डंप स्विच, या डायग्नोस्टिक पोर्ट को .NET प्रोग्राम के अंदर से बंद नहीं किया जा सकता, इसलिए व्यवस्थापक अधिकारों के साथ दोनों हिस्से जो भी मिले उन्हें सूचीबद्ध करते हैं। स्टार्टअप हुक सीधे बंद कर दिए जाते हैं।
  • +
+
+
+ +
+
+

वे चीज़ें जो Windows करता है और जिन्हें यह टूल जैसा है वैसा ही रिपोर्ट करता है

+
    +
  • svchost के अंदर होस्ट की गई सेवा का लॉन्च पथ होस्ट का नाम बताता है, इसलिए फ़ाइल मौजूद है और किसने हस्ताक्षर किए दोनों उतना नहीं बताते जितना अपनी अलग प्रक्रिया वाली सेवा के लिए बताते हैं।
  • +
  • ऐसी फ़ाइल जिस पर उसका अपना हस्ताक्षर भी है और Windows कैटलॉग प्रविष्टि भी दो अलग हस्ताक्षरकर्ताओं के नाम बता सकती है। दिखाया गया प्रकाशक वह है जो फ़ाइल के अंदर है, यानी वह जो फ़ाइल को दूसरी मशीन पर देखने पर भी वही रहता है, और वह PowerShell की रिपोर्ट से अलग हो सकता है।
  • +
  • व्यवस्थापक अधिकारों के बिना सेवा प्रबंधक कम प्रविष्टियाँ सूचीबद्ध करता है और जो सूचीबद्ध करता है उसमें से ज़्यादा को मना करता है। दोनों हिस्से यह सबसे ऊपर बता देते हैं, और स्नैपशॉट इसे दर्ज करता है, क्योंकि उन्नत अधिकारों से लिए गए स्नैपशॉट की तुलना बिना अधिकारों वाले स्नैपशॉट से करने पर वरना ऐसी प्रविष्टियाँ हटाई हुई दिखतीं जिन्हें किसी ने हटाया नहीं।
  • +
+

कोई समस्या मिली, या कोई ऐसी सेवा जिसे यह टूल sc.exe से अलग बताता है? इश्यू ट्रैकर खुला है, और दोनों के बीच का diff वह सबसे उपयोगी चीज़ है जो आप उसमें चिपका सकते हैं।

+
+
diff --git a/site/pages/faq/th.html b/site/pages/faq/th.html new file mode 100644 index 0000000..61eca27 --- /dev/null +++ b/site/pages/faq/th.html @@ -0,0 +1,78 @@ + + + + + +
+
+ คำถาม +

คำถามและข้อจำกัด

+

เครื่องมือที่ปล่อยให้บางอย่างหลุดไปเงียบๆ แย่กว่าเครื่องมือที่บอกว่าทำอะไรไม่ได้ ข้อจำกัดอยู่ในหน้านี้ด้วย แบ่งเป็นสองกลุ่ม: สิ่งที่มันปฏิเสธโดยการออกแบบ และสิ่งที่ Windows ทำซึ่งเครื่องมือนี้รายงานตามที่เป็น

+
+
+ +
+
+
+
+

ต่างจาก sc.exe, Get-Service หรือ services.msc อย่างไร

+

sc query และ Get-Service บอกว่าอะไรกำลังทำงาน services.msc ให้คุณเปลี่ยนมันได้ทีละแถว โดยถามคำถามไม่ได้และไม่มีบันทึกหลังจากนั้น เครื่องมือนี้ถามคำถามได้ (start:auto !status:running) แสดงแผนให้คุณดูก่อนลงมือ และเก็บสแนปช็อตที่คุณ diff ได้อีกสัปดาห์ต่อมา เมื่อมันไม่ตรงกับ sc.exe เรื่องบริการใดบริการหนึ่ง นั่นคือบั๊ก ส่วนหนึ่งของชุดทดสอบรันทั้งสองแล้วเปรียบเทียบทีละรายการ เปรียบเทียบฉบับยาวอยู่ที่นี่

+
+
+

ต้องใช้อินเทอร์เน็ตไหม

+

ไม่เลย ไม่มีเทเลเมทรี ไม่มีการตรวจหาอัปเดต ไม่มีการรายงานการแครช ไม่มีบัญชี ไม่เป็นไคลเอนต์ของอะไรทั้งสิ้น ครั้งเดียวที่มันอาจแตะเครือข่ายคือเมื่อคุณส่ง --follow-network: เมื่อนั้นมันอาจดูพาธการเปิดใช้งานบนโฟลเดอร์แชร์ของเครื่องอื่น และให้ Windows ดึงใบรับรองที่เครื่องนี้ยังไม่มี ปิดไว้เป็นค่าเริ่มต้น และวิธีใช้บอกเหตุผล ปุ่ม GitHub และ Donate ในหน้าต่างและหน้าในเมนู Help แต่ละอันส่งที่อยู่คงที่หนึ่งแห่งให้เบราว์เซอร์ของคุณเมื่อคุณกด และเบราว์เซอร์ของคุณคือสิ่งที่เชื่อมต่อ

+
+
+

ต้องใช้สิทธิ์ผู้ดูแลระบบไหม

+

ถ้าแค่ดู ไม่ต้อง ถ้าจะเปลี่ยน ต้อง ถ้าไม่มี ตัวจัดการจะแสดงรายการน้อยลงและปฏิเสธมากขึ้น และทั้งสองส่วนจะบอกไว้ที่ด้านบนแทนที่จะแสร้งว่ารายชื่อคือทั้งเครื่อง หน้าต่างมี Restart as admin ให้ มันไม่ยกระดับสิทธิ์ตัวเองเลย

+
+
+

ฟรีไหม ใช้ที่ทำงานได้ไหม

+

ได้ทั้งสองอย่าง GPL-3.0 ไม่มีเงื่อนไขแอบแฝง สแนปช็อตที่คุณสร้างเป็นไฟล์ของคุณ

+
+
+

จะทำเซิร์ฟเวอร์พังไหม

+

ไม่ได้ทำเอง ไม่มีอะไรถูกเปลี่ยนหากไม่มีแผนที่คุณได้เห็น ไดรเวอร์ถูกปฏิเสธ และแผนที่จะทำให้สิ่งที่เครื่องต้องใช้ล้มลงจะบอกไว้ สิ่งที่มันป้องกันคุณไม่ได้คือการทำตามแผนที่คุณไม่ได้อ่าน รายชื่อบริการที่เครื่องต้องใช้เป็นรายชื่อตั้งต้น 7 ตัว ได้แก่ RPC สองส่วนและตัวเปิด DCOM ตัวจัดการบัญชี การแยกคีย์ ตัวจัดการเซสชัน และ plug and play และ รีโมตเดสก์ท็อปไม่อยู่ในนั้น ดังนั้นเมื่อทำผ่านเซสชันระยะไกล ให้อ่านแผน

+
+
+

นี่เป็นผลิตภัณฑ์ของ Microsoft ไหม

+

ไม่ใช่ {{product}} เป็นโครงการโอเพนซอร์สอิสระ และไม่มีส่วนเกี่ยวข้อง ไม่ได้รับการรับรองหรือสนับสนุนโดย Microsoft Windows เป็นเครื่องหมายการค้าของกลุ่มบริษัท Microsoft

+
+
+

โปรแกรมมีภาษาของฉันไหม

+

ไม่มี โปรแกรมใช้ภาษาอังกฤษ ซึ่งเป็นเหตุผลที่เว็บไซต์นี้ถูกแปล หน้าต่างอ่านไฟล์ภาษา languages\gui.<code>.json ที่วางไว้ข้างไฟล์ปฏิบัติการและเลือกตามภาษาของ Windows โดยไม่มีสวิตช์ การแปลจึงเป็นการมีส่วนร่วมที่เพิ่มได้โดยไม่ต้องสร้างโปรแกรมใหม่ ชื่อบริการในรายชื่อเป็นอย่างที่ Windows ของคุณบอก คือในภาษาที่ Windows ของคุณตั้งไว้

+
+
+

ทำไมหน้าต่างเป็นสีเข้มเมื่อ Windows ของฉันเป็นสีอ่อน

+

มันเป็นสีเข้มและคงเป็นสีเข้มไม่ว่า Windows จะตั้งอะไรไว้ รวมถึงธีมคอนทราสต์สูง นี่ตรวจสอบแล้วไม่ใช่สมมติ มันใช้สีของตัวเองและอ่านได้ และไม่ทำตามการตั้งค่านั้น

+
+
+
+
+ +
+
+

โดยการออกแบบ

+
    +
  • เฉพาะเครื่องนี้เท่านั้น การจัดการระยะไกลไม่อยู่ในเวอร์ชันนี้ ถ้าจะเปรียบเทียบสองเครื่อง ให้สร้างสแนปช็อตบนแต่ละเครื่องแล้ว diff ไฟล์ทั้งสอง
  • +
  • Windows เท่านั้น 64 บิตเท่านั้น Windows 10 1809 หรือ Windows Server 2019 ขึ้นไป
  • +
  • การดำเนินการกับไดรเวอร์ถูกปฏิเสธแทนที่จะลอง เพราะการหยุดไดรเวอร์เคอร์เนลมักย้อนกลับไม่ได้ถ้าไม่รีสตาร์ต
  • +
  • เครื่องมือไม่ยกระดับสิทธิ์ของตัวเอง เมื่อตัวจัดการปฏิเสธ มันจะบอกและจบด้วยรหัสออก 3 หน้าต่างเสนอให้รีสตาร์ตตัวเองเป็นผู้ดูแลระบบ และไม่ทำอะไรอย่างอื่นเกี่ยวกับเรื่องนี้
  • +
  • ไม่ตรวจการเพิกถอนใบรับรอง มันต้องเข้าถึงเครือข่าย และเครื่องมือนี้ไม่ทำเช่นนั้น ดังนั้น Trusted หมายถึงสายใบรับรองถูกต้องบนเครื่องนี้ ไม่ใช่ว่าไม่มีใครเพิกถอนใบรับรองตั้งแต่นั้น
  • +
  • หน้าต่างแตกไฟล์บางส่วนของเฟรมเวิร์กส่วนติดต่อผู้ใช้ของ Windows ก่อนเริ่ม เมื่อเป็นไฟล์เดียว มันพกไลบรารีเนทีฟไม่กี่ตัวที่ Windows โหลดได้จากดิสก์เท่านั้น เมื่อไม่มีสิทธิ์ผู้ดูแลระบบ มันเขียนไลบรารีเหล่านั้นตอนเริ่มครั้งแรกของแต่ละเวอร์ชันลงโฟลเดอร์ .net ใต้โฟลเดอร์ชั่วคราวของบัญชี และโหลดจากที่นั่น เมื่อมีสิทธิ์ผู้ดูแลระบบ มันใช้ ProgramData\BetterWindowsServices บนไดรฟ์ Windows แทน เป็นโฟลเดอร์ที่มันสร้างเพื่อให้เฉพาะผู้ดูแลระบบเปลี่ยนได้ และตรวจทุกครั้งที่เริ่ม ถ้าสร้างโฟลเดอร์นั้นไม่ได้ หรือมีคนอื่นเปลี่ยนมันได้ หน้าต่างจะไม่เริ่มและบอกว่าโฟลเดอร์ไหนและต้องทำอย่างไร การย้ายไปที่นั่นหมายความว่าหน้าต่างที่ยกระดับสิทธิ์เริ่มตัวเองเป็นครั้งที่สอง ซึ่งใช้เวลาเสี้ยววินาที และแต่ละเวอร์ชันทิ้งไลบรารีของตัวเองไว้ที่นั่น (ประมาณ 8 MB) จนกว่าจะมีคนลบโฟลเดอร์ บรรทัดคำสั่งไม่มีไลบรารีแบบนั้นและไม่แตกไฟล์อะไร
  • +
  • เซสชันที่ยกระดับสิทธิ์จะระบุการตั้งค่า .NET ที่สืบทอดมาแทนที่จะปฏิเสธ โปรไฟเลอร์ สวิตช์การติดตามหรือดัมป์ หรือพอร์ตวินิจฉัยที่ตั้งไว้ในสภาพแวดล้อม ปิดจากภายในโปรแกรม .NET ไม่ได้ ดังนั้นเมื่อมีสิทธิ์ผู้ดูแลระบบ ทั้งสองส่วนจะแสดงรายการที่พบ ส่วน startup hook จะถูกปิดทั้งหมด
  • +
+
+
+ +
+
+

สิ่งที่ Windows ทำซึ่งเครื่องมือนี้รายงานตามที่เป็น

+
    +
  • บริการที่โฮสต์อยู่ใน svchost มีพาธการเปิดใช้งานที่ระบุโฮสต์ ดังนั้น ไฟล์อยู่ตรงนั้น และ ใครลงลายเซ็น จึงบอกได้น้อยกว่าบริการที่มีกระบวนการของตัวเอง
  • +
  • ไฟล์ที่มีทั้งลายเซ็นของตัวเองและรายการแค็ตตาล็อกของ Windows อาจระบุผู้ลงลายเซ็นสองคนที่ต่างกัน ผู้เผยแพร่ที่แสดงคือคนที่อยู่ภายในไฟล์ คือคนที่ยังเหมือนเดิมเมื่อดูไฟล์บนเครื่องอื่น และอาจต่างจากที่ PowerShell รายงาน
  • +
  • เมื่อไม่มีสิทธิ์ผู้ดูแลระบบ ตัวจัดการแสดงรายการน้อยลงและปฏิเสธรายการที่แสดงมากขึ้น ทั้งสองส่วนบอกไว้ที่ด้านบน และสแนปช็อตบันทึกเรื่องนี้ เพราะการเปรียบเทียบสแนปช็อตที่ยกระดับสิทธิ์กับอันที่สร้างโดยไม่มีสิทธิ์ จะรายงานรายการว่าถูกลบทั้งที่ไม่มีใครลบ
  • +
+

พบปัญหา หรือบริการที่เครื่องมือนี้รายงานต่างจาก sc.exe ใช่ไหม ตัวติดตามปัญหา เปิดอยู่ และ diff ระหว่างสองอย่างนั้นคือสิ่งที่มีประโยชน์ที่สุดที่คุณวางลงไปได้

+
+
diff --git a/site/pages/home/ar.html b/site/pages/home/ar.html new file mode 100644 index 0000000..21dbd55 --- /dev/null +++ b/site/pages/home/ar.html @@ -0,0 +1,198 @@ + + + + + + + +
+
+
+

ابحث في خدمات Windows لديك، وعاين كل تغيير، واعرف ما الذي انحرف منذ أمس

+

{{product}} هو services.msc بعد إعادة بنائه لمن يديرون أجهزة Windows: نافذة وسطر أوامر يعملان على محرك واحد. اسأل الجهاز سؤالًا بدل التمرير عبر 800 صف. وشاهد ما سيفعله أي تغيير قبل أن تضغط أي شيء. والجزء الذي لم يكن في services.msc قط: جمّد كل الخدمات في ملف، وبعد أسبوع اسأل عمّا تغيّر.

+ +
    +
  • مجاني ومفتوح المصدر، GPL-3.0
  • +
  • ملف واحد، أو برنامج تثبيت
  • +
  • لا حاجة إلى صلاحيات المسؤول للاطلاع
  • +
  • لا يتصل بالإنترنت أبدًا
  • +
+
+
+ النافذة وقد حُدّد فيها خمسة عناصر، وظهرت فوق القائمة خطة تشغيلها: خمس خطوات، وملاحظة بأن اثنين منها في تلك الحالة أصلًا، وسطر bws start لكل عنصر، وزر Start 5 entries. +
عناصر محددة، وخطة تُعرض قبل أن يحدث أي شيء، وسطر bws الذي يطلب الأمر نفسه تمامًا. البرنامج يتحدث الإنجليزية: تقرأ النافذة ملف لغة يوضع بجانبها، فالترجمة ممكنة دون إعادة بناء.
+
+
+
+ + +
+
+ نصف دقيقة معه +

كيف يبدو أثناء الاستخدام

+

جلسة حقيقية على نظام Windows مثبّت باللغة البولندية. الأسماء المعروضة تأتي من Windows فهي بلغته. أما النافذة نفسها فتتحدث الإنجليزية.

+
+ أربعة عناصر محددة وخطة تشغيلها، وإعادة تشغيل قسرية للخدمة Local Session Manager تحذّر خطتها من أن الجهاز لا يعمل بدونها وتطلب اسمها قبل أن يعمل الزر، والأسئلة المقترحة تحت مربع البحث الفارغ، وخدمة Print Spooler وقد عُثر عليها بكتابة جزء من اسمها ثم شُغّلت. +
أربعة عناصر محددة وخطة تشغيلها، وإعادة تشغيل قسرية تطلب اسم خدمة يحتاجها الجهاز، والأسئلة تحت مربع البحث الفارغ، وخدمة Print Spooler وقد عُثر عليها بالكتابة ثم شُغّلت.
+
+
+
+ شاشة البداية: ثلاث بطاقات أرقام عن هذا الجهاز، هي الخدمات العاملة، والخدمات المضبوطة على البدء التلقائي ولم تبدأ، والخدمات المضبوطة على البدء التلقائي وملفها غير موجود، وزر Show the list. +
تُفتح على بضعة أرقام عن هذا الجهاز. كل رقم سؤال: انقر عليه فينتقل السؤال إلى مربع البحث.
+
+
+ قائمة الخدمات مع ثلاث قوائم فوق مربع البحث، ومربع بحث فارغ، وأزرار التصفية مفتوحة في صفوف للحالة ونوع بدء التشغيل والتوقيع والتعارضات والمشغّلات، والقائمة أسفلها. +
أزرار التصفية تكتب في مربع البحث، فما نقرت عليه هو استعلام يمكنك قراءته وتعديله.
+
+
+
+
+ +
+
+ لماذا وُجد هذا +

services.msc لم يتغير تقريبًا منذ Windows 2000

+

يقضي المسؤولون فيه ساعات كل أسبوع وهم يصطدمون بالجدران نفسها.

+
+
    +
  • لا بحث. التنقل الوحيد هو القفز إلى الحرف الأول من الاسم المعروض.
  • +
  • لا تصفية. لا توجد طريقة لتسأل أرني ما هو مضبوط على البدء التلقائي ولا يعمل.
  • +
  • صف واحد في كل مرة. إعادة تشغيل 12 خدمة تعني 12 نقرة يمينية و12 انتظارًا.
  • +
  • «Stopping...» إلى الأبد، ولا مخرج إلا Task Manager وتخمين العملية.
  • +
  • لا سجل تاريخي. لا أحد يعرف من ضبط نوع بدء التشغيل على Disabled، أو متى.
  • +
  • بيانات مخفية. العملية والمشغّلات والامتيازات ومن وقّع الملف التنفيذي، ومعها security descriptor، كل ذلك يحتاج إلى sc.exe من الذاكرة، أو إلى السجل.
  • +
  • لا تكافؤ في سطر الأوامر. لغة sc.exe تعود إلى التسعينيات، والأمر Get-Service الذي يأتي مع Windows، في Windows PowerShell 5.1، لا يعرض الحساب الذي تعمل به الخدمة فضلًا عن وصفها. أما PowerShell 7 فيعرض الاثنين، ويُثبَّت بشكل منفصل.
  • +
+
+

كل أداة أخرى تعالج جزءًا منه

+

يعرض Process Hacker و System Informer قائمة غنية ويمكنهما إنهاء العملية قسرًا، لكن لا تدقيق فيهما ولا سطر أوامر. أما sc.exe وPsService فيستطيعان كل شيء ولا يخبرانك بشيء. وأوامر *-Service في PowerShell قابلة للبرمجة لكنها سطحية.

+

لا أحد يجمع بين قائمة قابلة للبحث، ومعاينة قبل كل تغيير، وسجل لما تغيّر عبر الزمن. وهذا السجل هو سبب إبقاء هذه الأداة على الجهاز بعد أول ظهيرة.

+ المقارنة الكاملة +
+
+
+
+ +
+
+ ماذا يفعل +

نافذة وسطر أوامر على محرك واحد

+
+

اسأل بدل أن تمرّر

start:auto !status:running تعني ما يجب أن يعمل ولا يعمل. لغة واحدة، في مربع البحث وفي bws list --query، مع اقتراح الحقول أثناء الكتابة.

+

اعرض الخطة قبل أن يحدث أي شيء

كل إيقاف وبدء وإعادة تشغيل وتغيير لنوع بدء التشغيل يُعاين مع الخدمات التي يوقفها معه، والمعاينة هي ما يُنفَّذ.

+

يخبرك بما انحرف ومن غيّره

الأمر bws snapshot create يجمّد الجهاز في ملف، والأمر bws snapshot diff يقول ما تغيّر منذئذٍ، فيفصل التكوين عمّا بدأ أو توقف فحسب. والأمر bws history يقول من غيّر نوع بدء التشغيل ومن ثبّت خدمة، من سجل System. وتؤدي النافذة الأعمال الثلاثة كلها تحت Audit....

+

أصلح مشكلة شائعة بضغطة واحدة

تبويب Tools والأمر bws tool fix يعيدان تشغيل الخدمة الواقفة خلف طابعة لا تطبع أو صوت اختفى أو بحث عالق، مع ما يعتمد عليها، عبر الخطة نفسها التي يمر بها كل شيء آخر.

+

أوقف خدمة لا تتوقف

يطلب منها بلطف أولًا ولا ينهي العملية إلا إذا فشل ذلك، مسمّيًا كل خدمة أخرى تعيش فيها.

+

أظهر ما يخفيه services.msc

من وقّع الملف التنفيذي وهل يثق به Windows، والمشغّلات، والامتيازات، وكذلك security descriptor، والعملية وذاكرتها. أعمدةً، وأشياء يمكن البحث بها.

+

أبلغ عندما يتعذر عليه قراءة شيء

الحقل الذي تعذرت قراءته يُبلَّغ عنه على أنه لم يُقرأ ولا يُعرض فارغًا أبدًا. واللقطة المأخوذة بلا صلاحيات المسؤول تقول ذلك داخل الملف.

+

يتكامل مع السكربتات

الخيار --json في كل أمر، ورمز خروج لكل نهاية، والرمز 5 عندما تجد المقارنة انحرافًا.

+

يعمل من ملف واحد ودون اتصال

فك الضغط عن الملف وشغّله، أو ثبّته لكل الجهاز. لا حاجة إلى تثبيت .NET ولا يتصل بالإنترنت أبدًا. القراءة لا تحتاج إلى صلاحيات المسؤول. GPL-3.0.

+
+
+
+ +
+
+ الجزء الذي لم يفعله services.msc قط +

ما الذي تغيّر منذ أمس

+

اللقطة هي الجهاز كله في لحظة واحدة: كل خدمة وبرنامج تشغيل، مع نوع بدء التشغيل والحساب ومسار التشغيل، وقيمة التجزئة لملفها وموقّعه، وتبعياتها ومشغّلاتها وامتيازاتها، إضافةً إلى security descriptor الخاص بها. وهي JSON بحقل واحد في كل سطر، فتدخل مستودعًا ويقرؤها git diff.

+
+
$ bws snapshot diff before.json --live --exit-code
+Changed (2):
+  Spooler  Print Spooler
+    startType: Manual -> Automatic
+    status: Stopped -> Running  (running state, not configuration)
+  wlidsvc  Microsoft Account Sign-in Assistant
+    status: Stopped -> Running  (running state, not configuration)
+
+Added 0, removed 0, changed 2. Fields differing: 1 in configuration, 2 in running state.
+
    +
  • يُبلَّغ عن التكوين وحالة التشغيل كلٌّ على حدة. لقطتان بينهما يوم تختلفان فيما يعمل مصادفةً، وما من ذلك انحراف تقريبًا. السطر الذي يجب قراءته هو نوع بدء التشغيل الذي تغيّر.
  • +
  • ما تعذرت مقارنته يُسرد ولا يُخفى. الحقل الذي لم تقرأه إحدى اللقطتين قط يظهر على أنه لم تتم مقارنته، فالمقارنة التي تقول لم يتغير شيء تعني أنه لم يتغير شيء فيما استطاع الطرفان رؤيته.
  • +
  • الخيار --exit-code ينتهي بالرمز 5 عندما يختلف التكوين، فتستطيع مهمة مجدولة أن تأخذ لقطة عند النشر وتنبّه أحدًا في أول ليلة ينحرف فيها الجهاز.
  • +
  • جهازان، ملفان. خذ لقطة على بيئة التجهيز وأخرى على بيئة الإنتاج وقارن بينهما في أي مكان.
  • +
+
+ كيف تعمل اللقطات والانحراف +
+
+ +
+
+ لا شيء يحدث دون خطة +

المعاينة هي التنفيذ

+

كل عملية تكتب تبني خطة أولًا، وهذه الخطة نفسها هي المعاينة، وتسلسل الخدمات التابعة، والرفض قبل أن تضغط أي شيء، وسطر الأوامر الذي يطلب الأمر نفسه، وطريق العودة بعد ذلك.

+
+
$ bws stop Winmgmt --dry-run --dependents
+Plan: stop Winmgmt  (2 steps)
+  1. stop  vmms      (would break otherwise)
+  2. stop  Winmgmt   (asked for)
+
+Warnings:
+  - Stopping Winmgmt also stops one other entry: vmms
+  - Winmgmt starts automatically, so it will be back after the next restart.
+
    +
  • شغّله دون --dry-run فتكون هذه هي الخطوات، بهذا الترتيب، وبجانبها الأسباب نفسها. لا يوجد مسار برمجي ثانٍ للتنفيذ الفعلي.
  • +
  • ما يسقط معه موجود في الخطة. الخدمات التي ستتعطل خطوات قائمة بذاتها، والخطة التي ستوقف شيئًا يحتاجه الجهاز تقول ذلك في تحذيراتها.
  • +
  • الرفض يسبق الزر. برنامج تشغيل، أو خدمة لا يقبل المدير طلب إيقافها، أو عملية يحميها النظام: يُرفض ذلك عند بناء الخطة مع بيان السبب. وتُظهر النافذة الزر باهتًا وتذكر السبب بجانبه.
  • +
  • الإيقاف القسري خطوتان، والثانية مشروطة. يطلب bws kill من الخدمة أن تتوقف ولا ينهي عمليتها إلا إذا لم ينجح ذلك، مسمّيًا كل خدمة أخرى تعيش فيها.
  • +
+
+ عندما لا تتوقف الخدمة +
+
+ +
+
+ دقيقتان معه +

من سطر الأوامر

+

المحرك نفسه الذي تعمل به النافذة، للسكربتات والمهام المجدولة وCI. البيانات تذهب إلى الإخراج القياسي وكل ما عداها إلى الخطأ القياسي، فيعمل bws list --json | jq ولا يصل تحذير إلى JSON أبدًا.

+
bws list --query "start:auto !status:running"     ما يجب أن يعمل ولا يعمل
+bws list --query "file:missing"                   الخدمات التي اختفى ملفها التنفيذي
+bws list --query "signed:no peruser:no"           غير الموقّعة، دون نسخ الجلسات
+bws show Spooler                                  كل ما هو معروف عن عنصر واحد
+bws stop Winmgmt --dry-run --dependents           ما الذي سيتوقف معها عند إيقافها
+bws kill Spooler --dry-run                        ما الذي سيذهب معها عند إنهاء عمليتها
+bws start-type Spooler manual --dry-run           ما الذي سيحدث إن أُزيل عنها البدء التلقائي
+bws snapshot create before.json                   جمّد الجهاز قبل التغيير
+bws snapshot diff before.json --live --exit-code  ما الذي تغيّر منذئذٍ، والرمز 5 إن تغيّر الإعداد
+bws history Spooler                               من غيّر نوع بدء تشغيلها ومتى
+bws tool fix printer --dry-run                    ما الذي سيفعله الإصلاح السريع لطابعة عالقة
+ كل أمر وكل خيار وكل رمز خروج +
+
+ +
+
+ احصل عليه +

فك الضغط وشغّل، أو ثبّت

+

Windows 10 الإصدار 1809 أو Windows Server 2019 وما بعدهما، 64 بت. الأرشيفات لا تحتاج إلى برنامج تثبيت ولا تكتب شيئًا في السجل، والاطلاع لا يحتاج إلى صلاحيات المسؤول. أما تغيير أي شيء فيحتاج إلى جلسة مرفوعة الصلاحيات، وكلا النصفين يقولان ذلك بدل أن يفشلا بصمت: تعرض النافذة Restart as admin.

+
+ + + + + + + +
الملفما هو
{{archive_window}}النافذة، ملف تنفيذي واحد قائم بذاته، ولا حاجة إلى تثبيت .NET
{{archive_cli}}سطر الأوامر، ملف تنفيذي واحد قائم بذاته، للسكربتات وCI
{{archive_installer}}برنامج التثبيت: البرنامجان معًا لكل حساب على الجهاز، والنافذة في قائمة Start والأمر bws في PATH
+
+

الملفات التنفيذية موقّعة بتوقيع Authenticode، فيذكر Windows اسم الناشر بدل أن يحذّر من ناشر مجهول.

+ +
+
diff --git a/site/pages/home/hi.html b/site/pages/home/hi.html new file mode 100644 index 0000000..81ba0cd --- /dev/null +++ b/site/pages/home/hi.html @@ -0,0 +1,198 @@ + + + + + + + +
+
+
+

अपनी Windows सेवाएँ खोजें, हर बदलाव का पूर्वावलोकन देखें, और कल से क्या ड्रिफ्ट हुआ यह जानें

+

{{product}} वही services.msc है, जिसे Windows मशीनों का प्रशासन करने वालों के लिए नए सिरे से बनाया गया है। एक ही इंजन पर एक विंडो और एक कमांड लाइन। आठ सौ पंक्तियाँ स्क्रोल करने के बजाय मशीन से सवाल पूछें। कोई बदलाव क्या करेगा, यह कुछ भी दबाने से पहले देखें। और वह हिस्सा जो services.msc में कभी था ही नहीं: हर सेवा को एक फ़ाइल में फ़्रीज़ करें, और एक हफ़्ते बाद पूछें कि क्या बदला।

+ +
    +
  • मुफ़्त और ओपन सोर्स, GPL-3.0
  • +
  • एक फ़ाइल, या इंस्टॉलर
  • +
  • देखने के लिए व्यवस्थापक अधिकार नहीं चाहिए
  • +
  • इंटरनेट से कभी संपर्क नहीं करता
  • +
+
+
+ पाँच प्रविष्टियाँ चुनी हुई विंडो, जिसमें सूची के ऊपर उन्हें शुरू करने की योजना दिखाई गई है: पाँच चरण, यह टिप्पणी कि उनमें से दो पहले से उसी स्थिति में हैं, हर प्रविष्टि के लिए एक bws start पंक्ति, और Start 5 entries बटन। +
चुनी हुई प्रविष्टियाँ, कुछ भी होने से पहले दिखाई गई योजना, और वह bws पंक्ति जो ठीक यही काम माँगती है। प्रोग्राम अंग्रेज़ी में बोलता है। विंडो अपने बगल में रखी भाषा फ़ाइल को पढ़ती है, इसलिए अनुवाद बिना दोबारा बिल्ड किए संभव है।
+
+
+
+ + +
+
+ इसके साथ आधा मिनट +

उपयोग में यह कैसा दिखता है

+

एक असली सत्र, पोलिश भाषा में इंस्टॉल किए गए Windows पर। प्रदर्शन नाम Windows से आते हैं, इसलिए वे उसी की भाषा में हैं। विंडो खुद अंग्रेज़ी में है।

+
+ चार प्रविष्टियाँ चुनी गईं और उन्हें शुरू करने की योजना, Local Session Manager का ज़बरदस्ती रीस्टार्ट जिसकी योजना चेतावनी देती है कि इसके बिना मशीन काम नहीं करती और बटन चलने से पहले इसका नाम माँगती है, खाली खोज बॉक्स के नीचे शुरुआत के लिए सवाल, और नाम का एक हिस्सा टाइप करके खोजी गई तथा शुरू की गई Print Spooler। +
चार प्रविष्टियाँ चुनी गईं और उन्हें शुरू करने की योजना, एक ज़बरदस्ती रीस्टार्ट जो ऐसी सेवा का नाम माँगता है जिसकी मशीन को ज़रूरत है, खाली खोज बॉक्स के नीचे के सवाल, और टाइप करके खोजी व शुरू की गई Print Spooler।
+
+
+
+ शुरुआती स्क्रीन: इस मशीन के बारे में संख्याओं के तीन कार्ड, यानी चल रही सेवाएँ, अपने-आप शुरू होने के लिए सेट वे सेवाएँ जो शुरू नहीं हुईं, और अपने-आप शुरू होने के लिए सेट वे सेवाएँ जिनकी फ़ाइल गायब है, और एक Show the list बटन। +
यह इस मशीन की कुछ संख्याओं के साथ खुलता है। हर संख्या एक सवाल है। उस पर क्लिक करें और सवाल खोज बॉक्स में चला जाता है।
+
+
+ सेवाओं की सूची, जिसमें खोज बॉक्स के ऊपर तीन सूचियाँ, एक खाली खोज बॉक्स, स्थिति, स्टार्टअप प्रकार, हस्ताक्षर, विसंगतियों और ट्रिगर के लिए पंक्तियों में खुले फ़िल्टर बटन, और नीचे सूची है। +
फ़िल्टर बटन खोज बॉक्स में लिखते हैं, इसलिए आपने जो क्लिक किया वह एक ऐसी क्वेरी है जिसे आप पढ़ और संपादित कर सकते हैं।
+
+
+
+
+ +
+
+ यह क्यों बना +

services.msc Windows 2000 के बाद से लगभग वैसा ही है

+

व्यवस्थापक इसमें हफ़्ते के कई घंटे बिताते हैं और हर बार उन्हीं दीवारों से टकराते हैं।

+
+
    +
  • कोई खोज नहीं। नेविगेट करने का एकमात्र तरीका प्रदर्शन नाम के पहले अक्षर पर कूदना है।
  • +
  • कोई फ़िल्टरिंग नहीं। यह पूछने का कोई तरीका नहीं कि मुझे वह दिखाओ जो अपने-आप शुरू होने के लिए सेट है और चल नहीं रहा।
  • +
  • एक बार में एक पंक्ति। बारह सेवाएँ रीस्टार्ट करने का मतलब है बारह राइट-क्लिक और बारह बार इंतज़ार।
  • +
  • “Stopping...” हमेशा के लिए, और Task Manager तथा प्रक्रिया का अंदाज़ा लगाने के सिवा बाहर निकलने का कोई रास्ता नहीं।
  • +
  • कोई इतिहास नहीं। कोई नहीं जानता कि उस स्टार्टअप प्रकार को Disabled किसने किया, या कब।
  • +
  • छिपा हुआ डेटा। प्रक्रिया, ट्रिगर, विशेषाधिकार, security descriptor, निष्पादन योग्य फ़ाइल पर किसने हस्ताक्षर किए, यह सब याद से sc.exe चलाने या रजिस्ट्री खंगालने पर ही मिलता है।
  • +
  • कमांड लाइन में बराबरी नहीं। sc.exe का सिंटैक्स नब्बे के दशक का है, और Windows PowerShell 5.1 में Windows के साथ आने वाला Get-Service यह तक नहीं दिखाता कि सेवा किस खाते से चलती है, विवरण तो दूर की बात है। PowerShell 7 दोनों दिखाता है, और वह अलग से इंस्टॉल होता है।
  • +
+
+

दूसरे टूल इसका एक-एक हिस्सा ठीक करते हैं

+

Process Hacker और System Informer भरपूर जानकारी वाली सूची दिखाते हैं और ज़बरदस्ती प्रक्रिया खत्म कर सकते हैं, पर उनमें न ऑडिट है न कमांड लाइन। sc.exe और PsService सब कुछ कर सकते हैं पर आपको कुछ बताते नहीं। PowerShell के *-Service cmdlet स्क्रिप्ट में चल सकते हैं पर उथले हैं।

+

खोजी जा सकने वाली सूची, हर बदलाव से पहले पूर्वावलोकन, और समय के साथ क्या बदला इसका रिकॉर्ड, इन तीनों को कोई एक साथ नहीं देता। और पहली दोपहर के बाद इसे मशीन पर रखने की वजह यही रिकॉर्ड है।

+ पूरी तुलना +
+
+
+
+ +
+
+ यह क्या करता है +

एक इंजन पर एक विंडो और एक कमांड लाइन

+
+

स्क्रोल करने के बजाय पूछें

start:auto !status:running का मतलब है जो चालू होना चाहिए और नहीं है। एक ही भाषा, खोज बॉक्स में भी और bws list --query में भी, और टाइप करते समय फ़ील्ड सुझाए जाते हैं।

+

कुछ भी होने से पहले योजना दिखाएँ

हर स्टॉप, स्टार्ट, रीस्टार्ट और स्टार्टअप प्रकार का बदलाव उन सेवाओं के साथ पूर्वावलोकन में दिखता है जिन्हें वह अपने साथ बंद करता है, और जो पूर्वावलोकन में दिखता है वही चलता है।

+

बताएँ कि क्या ड्रिफ्ट हुआ और किसने बदला

bws snapshot create मशीन को एक फ़ाइल में फ़्रीज़ कर देता है, और bws snapshot diff बताता है कि तब से क्या बदला, और कॉन्फ़िगरेशन को उससे अलग रखता है जो सिर्फ़ शुरू या बंद हुआ। bws history System लॉग से बताता है कि स्टार्टअप प्रकार किसने बदला और सेवा किसने इंस्टॉल की। विंडो ये तीनों काम Audit... के तहत करती है।

+

एक बटन दबाकर आम समस्या ठीक करें

Tools टैब और bws tool fix उस सेवा को रीस्टार्ट करते हैं जो प्रिंट न करने वाले प्रिंटर, बंद पड़ी आवाज़ या अटकी हुई खोज के पीछे होती है, साथ ही उन सेवाओं को भी जो उस पर निर्भर हैं, और यह सब बाकी हर चीज़ वाली उसी योजना के ज़रिए होता है।

+

ऐसी सेवा रोकें जो रुकती ही नहीं

यह पहले विनम्रता से कहता है और प्रक्रिया को तभी खत्म करता है जब वह विफल हो, और उसमें रहने वाली हर दूसरी सेवा का नाम बताता है।

+

वह दिखाएँ जो services.msc छिपाता है

निष्पादन योग्य फ़ाइल पर किसने हस्ताक्षर किए और Windows उस पर भरोसा करता है या नहीं, ट्रिगर, विशेषाधिकार, security descriptor, प्रक्रिया और उसकी मेमोरी। कॉलम के रूप में भी, और खोजने की चीज़ों के रूप में भी।

+

बताएँ कि कब कुछ पढ़ नहीं पाया

जो फ़ील्ड पढ़ा नहीं जा सका उसे “पढ़ा नहीं गया” बताया जाता है, खाली कभी नहीं दिखाया जाता। व्यवस्थापक अधिकारों के बिना लिया गया स्नैपशॉट यह बात फ़ाइल के अंदर ही बता देता है।

+

स्क्रिप्ट में आसानी से फ़िट हो

हर कमांड पर --json, हर अंत के लिए एक एग्ज़िट कोड, और जब diff को ड्रिफ्ट मिले तो 5।

+

एक फ़ाइल से चलाएँ, ऑफ़लाइन

अनज़िप करके चलाएँ, या पूरी मशीन के लिए इंस्टॉल करें। .NET इंस्टॉल करने की ज़रूरत नहीं, और यह इंटरनेट से कभी संपर्क नहीं करता। पढ़ने के लिए व्यवस्थापक अधिकार नहीं चाहिए। GPL-3.0।

+
+
+
+ +
+
+ वह हिस्सा जो services.msc ने कभी नहीं किया +

कल से क्या बदला

+

स्नैपशॉट एक पल में पूरी मशीन है: हर सेवा और ड्राइवर, उसके स्टार्टअप प्रकार, खाते, लॉन्च पथ, उसकी फ़ाइल के हैश और हस्ताक्षरकर्ता, निर्भरताओं, ट्रिगर, विशेषाधिकारों और security descriptor के साथ। यह JSON है जिसमें हर पंक्ति में एक फ़ील्ड है, इसलिए यह रिपॉज़िटरी में रखा जा सकता है और git diff इसे पढ़ लेता है।

+
+
$ bws snapshot diff before.json --live --exit-code
+Changed (2):
+  Spooler  Print Spooler
+    startType: Manual -> Automatic
+    status: Stopped -> Running  (running state, not configuration)
+  wlidsvc  Microsoft Account Sign-in Assistant
+    status: Stopped -> Running  (running state, not configuration)
+
+Added 0, removed 0, changed 2. Fields differing: 1 in configuration, 2 in running state.
+
    +
  • कॉन्फ़िगरेशन और चलने की स्थिति अलग-अलग बताई जाती हैं। एक दिन के अंतर से लिए गए दो स्नैपशॉट इसमें अलग होते हैं कि क्या चल रहा है, और उसमें से लगभग कुछ भी ड्रिफ्ट नहीं होता। जो स्टार्टअप प्रकार बदला वही पंक्ति पढ़ने लायक है।
  • +
  • जिसकी तुलना नहीं हो सकी वह सूचीबद्ध है, छिपा नहीं। जो फ़ील्ड किसी एक स्नैपशॉट ने कभी पढ़ा ही नहीं, वह तुलना नहीं की गई के रूप में सामने आता है, इसलिए जो diff कुछ नहीं बदला कहता है उसका मतलब है कि जो दोनों पक्ष देख सके उसमें कुछ नहीं बदला।
  • +
  • --exit-code कॉन्फ़िगरेशन अलग होने पर 5 के साथ खत्म होता है, इसलिए एक शेड्यूल किया गया टास्क डिप्लॉयमेंट के समय स्नैपशॉट ले सकता है और मशीन के ड्रिफ्ट होने की पहली ही रात किसी को अलर्ट भेज सकता है।
  • +
  • दो मशीनें, दो फ़ाइलें। स्टेजिंग पर एक स्नैपशॉट लें और प्रोडक्शन पर एक, और उनकी तुलना कहीं भी करें।
  • +
+
+ स्नैपशॉट और ड्रिफ्ट कैसे काम करते हैं +
+
+ +
+
+ योजना के बिना कुछ नहीं होता +

पूर्वावलोकन ही निष्पादन है

+

कुछ भी लिखने वाला हर ऑपरेशन पहले एक योजना बनाता है, और वही योजना पूर्वावलोकन है, निर्भर सेवाओं का कैस्केड है, कुछ दबाने से पहले का इनकार है, वही काम माँगने वाली कमांड लाइन है, और बाद में वापस लौटने का रास्ता है।

+
+
$ bws stop Winmgmt --dry-run --dependents
+Plan: stop Winmgmt  (2 steps)
+  1. stop  vmms      (would break otherwise)
+  2. stop  Winmgmt   (asked for)
+
+Warnings:
+  - Stopping Winmgmt also stops one other entry: vmms
+  - Winmgmt starts automatically, so it will be back after the next restart.
+
    +
  • --dry-run के बिना चलाएँ तो वही चरण चलते हैं, उसी क्रम में, और उनके साथ वही कारण। असली काम के लिए कोई दूसरा कोड पथ नहीं है।
  • +
  • जो उसके साथ बंद होता है वह योजना में है। जो सेवाएँ टूटतीं वे अपने आप में अलग चरण हैं, और जो योजना मशीन की ज़रूरत की किसी चीज़ को बंद कर देती उसकी चेतावनियों में यह लिखा होता है।
  • +
  • इनकार बटन से पहले आता है। ड्राइवर, ऐसी सेवा जिसे बंद करने का अनुरोध सेवा प्रबंधक स्वीकार नहीं करता, सिस्टम द्वारा सुरक्षित प्रक्रिया: इन सबको योजना बनते समय ही कारण के साथ मना कर दिया जाता है। विंडो बटन को धूसर कर देती है और उसके बगल में कारण बताती है।
  • +
  • ज़बरदस्ती रोकना दो चरणों का है, और दूसरा सशर्त है। bws kill सेवा से रुकने को कहता है और उसकी प्रक्रिया को तभी खत्म करता है जब वह काम न करे, और उसमें रहने वाली हर दूसरी सेवा का नाम बताता है।
  • +
+
+ जब कोई सेवा रुकने से इनकार करे +
+
+ +
+
+ इसके साथ दो मिनट +

कमांड लाइन से

+

विंडो वाला ही इंजन, स्क्रिप्ट, शेड्यूल किए गए टास्क और CI के लिए। डेटा स्टैंडर्ड आउटपुट में जाता है और बाकी सब स्टैंडर्ड एरर में, इसलिए bws list --json | jq काम करता है और कोई चेतावनी आपके JSON में कभी नहीं आती।

+
bws list --query "start:auto !status:running"     जो चालू होना चाहिए और नहीं है
+bws list --query "file:missing"                   वे सेवाएँ जिनकी बाइनरी गायब है
+bws list --query "signed:no peruser:no"           बिना हस्ताक्षर वाली, प्रति-सत्र प्रतियों के बिना
+bws show Spooler                                  एक प्रविष्टि के बारे में जो कुछ पता है
+bws stop Winmgmt --dry-run --dependents           इसे रोकने से और क्या बंद होगा
+bws kill Spooler --dry-run                        इसकी प्रक्रिया खत्म करने से साथ में क्या जाएगा
+bws start-type Spooler manual --dry-run           इसे ऑटोमैटिक से हटाने पर क्या होगा
+bws snapshot create before.json                   बदलाव से पहले मशीन को फ़्रीज़ करें
+bws snapshot diff before.json --live --exit-code  तब से क्या बदला, सेटअप बदला हो तो 5
+bws history Spooler                               इसका स्टार्टअप प्रकार किसने और कब बदला
+bws tool fix printer --dry-run                    अटके प्रिंटर का त्वरित समाधान क्या करेगा
+ हर कमांड, विकल्प और एग्ज़िट कोड +
+
+ +
+
+ इसे पाएँ +

अनज़िप करके चलाएँ, या इंस्टॉल करें

+

Windows 10 1809 या Windows Server 2019 और उसके बाद के संस्करण, 64-बिट। आर्काइव को इंस्टॉलर नहीं चाहिए और वे रजिस्ट्री में कुछ नहीं लिखते, और देखने के लिए व्यवस्थापक अधिकार नहीं चाहिए। कुछ भी बदलने के लिए उन्नत अधिकारों वाला सत्र चाहिए, और दोनों हिस्से चुपचाप विफल होने के बजाय यह बता देते हैं। विंडो Restart as admin का विकल्प देती है।

+
+ + + + + + + +
फ़ाइलयह क्या है
{{archive_window}}विंडो, एक अपने-आप में पूर्ण निष्पादन योग्य फ़ाइल, .NET इंस्टॉल करने की ज़रूरत नहीं
{{archive_cli}}कमांड लाइन, एक अपने-आप में पूर्ण निष्पादन योग्य फ़ाइल, स्क्रिप्ट और CI के लिए
{{archive_installer}}इंस्टॉलर: दोनों प्रोग्राम मशीन के हर खाते के लिए, विंडो Start मेनू में और bws PATH में
+
+

निष्पादन योग्य फ़ाइलों पर Authenticode हस्ताक्षर है, इसलिए Windows अज्ञात प्रकाशक की चेतावनी देने के बजाय प्रकाशक का नाम बताता है।

+ +
+
diff --git a/site/pages/home/th.html b/site/pages/home/th.html new file mode 100644 index 0000000..1aa9044 --- /dev/null +++ b/site/pages/home/th.html @@ -0,0 +1,198 @@ + + + + + + + +
+
+
+

ค้นหาบริการ Windows ของคุณ ดูตัวอย่างทุกการเปลี่ยนแปลง และดูว่าอะไรดริฟต์ไปตั้งแต่เมื่อวาน

+

{{product}} คือ services.msc ที่สร้างใหม่สำหรับคนที่ดูแลเครื่อง Windows เป็นหน้าต่างกับบรรทัดคำสั่งที่ใช้เอนจินตัวเดียวกัน ถามเครื่องแทนการเลื่อนดู 800 แถว ดูว่าการเปลี่ยนแปลงจะทำอะไรก่อนกดอะไรทั้งนั้น และสิ่งที่ services.msc ไม่เคยมี: บันทึกทุกบริการลงไฟล์ แล้วอีกสัปดาห์ถามว่าอะไรเปลี่ยนไป

+ +
    +
  • ฟรีและโอเพนซอร์ส GPL-3.0
  • +
  • ไฟล์เดียว หรือตัวติดตั้ง
  • +
  • ดูข้อมูลได้โดยไม่ต้องใช้สิทธิ์ผู้ดูแลระบบ
  • +
  • ไม่เชื่อมต่ออินเทอร์เน็ตเลย
  • +
+
+
+ หน้าต่างที่เลือกไว้ 5 รายการ พร้อมแผนการเริ่มบริการเหล่านั้นแสดงเหนือรายชื่อ: 5 ขั้นตอน หมายเหตุว่า 2 รายการอยู่ในสถานะนั้นอยู่แล้ว บรรทัด bws start ของแต่ละรายการ และปุ่ม Start 5 entries +
รายการที่เลือก แผนที่แสดงก่อนจะมีอะไรเกิดขึ้น และบรรทัด bws ที่ขอสิ่งเดียวกันทุกประการ โปรแกรมใช้ภาษาอังกฤษ หน้าต่างจะอ่านไฟล์ภาษาที่วางไว้ข้างๆ จึงแปลได้โดยไม่ต้องสร้างใหม่
+
+
+
+ + +
+
+ ลองใช้ครึ่งนาที +

หน้าตาเวลาใช้งานจริง

+

เซสชันจริง บน Windows ที่ติดตั้งเป็นภาษาโปแลนด์ ชื่อที่แสดงมาจาก Windows จึงเป็นภาษาของ Windows ส่วนตัวหน้าต่างเองเป็นภาษาอังกฤษ

+
+ เลือก 4 รายการพร้อมแผนการเริ่มบริการเหล่านั้น การรีสตาร์ตแบบบังคับของ Local Session Manager ซึ่งแผนเตือนว่าเครื่องทำงานไม่ได้หากไม่มีมัน และขอให้พิมพ์ชื่อก่อนปุ่มจะใช้งานได้ คำถามเริ่มต้นใต้ช่องค้นหาที่ว่าง และ Print Spooler ที่พบโดยพิมพ์ชื่อบางส่วนแล้วเริ่มทำงาน +
เลือก 4 รายการพร้อมแผนการเริ่มบริการ การรีสตาร์ตแบบบังคับที่ขอชื่อบริการที่เครื่องต้องใช้ คำถามใต้ช่องค้นหาที่ว่าง และ Print Spooler ที่ค้นพบโดยการพิมพ์แล้วเริ่มทำงาน
+
+
+
+ หน้าจอเปิดเครื่อง: การ์ดตัวเลข 3 ใบเกี่ยวกับเครื่องนี้ ได้แก่ บริการที่กำลังทำงาน บริการที่ตั้งให้เริ่มอัตโนมัติแต่ไม่ได้ขึ้นมา และบริการที่ตั้งให้เริ่มอัตโนมัติแต่ไฟล์หายไป พร้อมปุ่ม Show the list +
เปิดมาพร้อมตัวเลขไม่กี่ตัวเกี่ยวกับเครื่องนี้ แต่ละตัวคือคำถาม คลิกแล้วคำถามจะไปอยู่ในช่องค้นหา
+
+
+ รายชื่อบริการที่มีรายการสามชุดอยู่เหนือช่องค้นหา ช่องค้นหาที่ว่าง ปุ่มตัวกรองที่กางออกเป็นแถวสำหรับสถานะ ประเภทการเริ่มต้น ลายเซ็น ความไม่สอดคล้อง และทริกเกอร์ และรายชื่ออยู่ด้านล่าง +
ปุ่มตัวกรองเขียนลงในช่องค้นหา สิ่งที่คุณคลิกจึงเป็นคิวรีที่อ่านและแก้ไขได้
+
+
+
+
+ +
+
+ ทำไมถึงมีโปรแกรมนี้ +

services.msc แทบไม่เปลี่ยนเลยตั้งแต่ Windows 2000

+

ผู้ดูแลระบบใช้เวลาหลายชั่วโมงต่อสัปดาห์กับมัน และเจอกำแพงเดิมๆ ซ้ำแล้วซ้ำอีก

+
+
    +
  • ไม่มีการค้นหา วิธีเดียวที่ใช้นำทางคือกระโดดไปที่ตัวอักษรแรกของชื่อที่แสดง
  • +
  • ไม่มีการกรอง ถามไม่ได้ว่า อะไรบ้างที่ตั้งให้เริ่มอัตโนมัติแต่ไม่ได้ทำงาน
  • +
  • ทีละแถว การรีสตาร์ต 12 บริการคือคลิกขวา 12 ครั้งและรอ 12 รอบ
  • +
  • “Stopping...” ไม่จบสิ้น ไม่มีทางออกนอกจาก Task Manager และการเดากระบวนการ
  • +
  • ไม่มีประวัติ ไม่มีใครรู้ว่าใครตั้งประเภทการเริ่มต้นเป็น Disabled และเมื่อไร
  • +
  • ข้อมูลที่ซ่อนอยู่ กระบวนการ ทริกเกอร์ สิทธิพิเศษ security descriptor และใครลงลายเซ็นไฟล์ปฏิบัติการ ทั้งหมดต้องใช้ sc.exe จากความจำ หรือเปิดรีจิสทรี
  • +
  • บรรทัดคำสั่งไม่เท่าเทียมกัน sc.exe มีไวยากรณ์จากยุค 90 และ Get-Service ที่มากับ Windows ใน Windows PowerShell 5.1 ไม่แสดงบัญชีที่บริการใช้รัน ไม่ต้องพูดถึงคำอธิบาย PowerShell 7 แสดงทั้งสองอย่าง แต่ต้องติดตั้งแยกต่างหาก
  • +
+
+

เครื่องมืออื่นแต่ละตัวแก้ได้เพียงบางส่วน

+

Process Hacker และ System Informer แสดงรายชื่อที่ละเอียดและบังคับปิดกระบวนการได้ แต่ไม่มีการตรวจสอบและไม่มีบรรทัดคำสั่ง sc.exe และ PsService ทำได้ทุกอย่างแต่ไม่บอกอะไรคุณเลย cmdlet *-Service ของ PowerShell เขียนสคริปต์ได้แต่ตื้น

+

ไม่มีเครื่องมือไหนรวมรายชื่อที่ค้นหาได้ ตัวอย่างก่อนทุกการเปลี่ยนแปลง และบันทึกว่าอะไรเปลี่ยนไปตามเวลา และบันทึกนั้นเองคือเหตุผลที่ควรเก็บโปรแกรมนี้ไว้ในเครื่องหลังจากบ่ายวันแรก

+ เปรียบเทียบฉบับเต็ม +
+
+
+
+ +
+
+ ทำอะไรได้บ้าง +

หน้าต่างและบรรทัดคำสั่งบนเอนจินเดียวกัน

+
+

ถามแทนการเลื่อนหา

start:auto !status:running คือ อะไรที่ควรทำงานแต่ไม่ได้ทำงาน ภาษาเดียวกัน ทั้งในช่องค้นหาและใน bws list --query พร้อมแนะนำฟิลด์ขณะพิมพ์

+

แสดงแผนก่อนจะมีอะไรเกิดขึ้น

ทุกการหยุด เริ่ม รีสตาร์ต และการเปลี่ยนประเภทการเริ่มต้นจะแสดงตัวอย่างพร้อมบริการที่จะล้มตามไปด้วย และตัวอย่างนั้นคือสิ่งที่ทำงานจริง

+

บอกว่าอะไรดริฟต์ และใครเปลี่ยน

bws snapshot create บันทึกสถานะเครื่องลงไฟล์ และ bws snapshot diff บอกว่าหลังจากนั้นอะไรเปลี่ยนไป โดยแยกการกำหนดค่าออกจากสิ่งที่แค่เริ่มหรือหยุด bws history บอกว่าใครเปลี่ยนประเภทการเริ่มต้นและใครติดตั้งบริการ จาก System log หน้าต่างทำทั้งสามอย่างภายใต้ Audit...

+

แก้ปัญหาที่พบบ่อยด้วยการกดครั้งเดียว

แท็บ Tools และ bws tool fix รีสตาร์ตบริการที่อยู่เบื้องหลังเครื่องพิมพ์ที่ไม่พิมพ์ เสียงที่หายไป หรือการค้นหาที่ค้าง พร้อมสิ่งที่ขึ้นอยู่กับมัน ผ่านแผนเดียวกับทุกอย่างอื่น

+

หยุดบริการที่หยุดไม่ลง

ขอดีๆ ก่อน และจบกระบวนการเฉพาะเมื่อวิธีนั้นล้มเหลว พร้อมบอกชื่อบริการอื่นทุกตัวที่อยู่ในกระบวนการนั้น

+

แสดงสิ่งที่ services.msc ซ่อนไว้

ใครลงลายเซ็นไฟล์ปฏิบัติการและ Windows เชื่อถือหรือไม่ ทริกเกอร์ สิทธิพิเศษ security descriptor กระบวนการและหน่วยความจำของมัน เป็นทั้งคอลัมน์และสิ่งที่ค้นหาได้

+

บอกเมื่ออ่านอะไรไม่ได้

ฟิลด์ที่อ่านไม่ได้จะรายงานว่าไม่ได้อ่าน ไม่เคยแสดงเป็นค่าว่าง สแนปช็อตที่สร้างโดยไม่มีสิทธิ์ผู้ดูแลระบบจะบอกเรื่องนี้ไว้ในไฟล์

+

ใช้ในสคริปต์ได้

--json ในทุกคำสั่ง รหัสออกสำหรับทุกการจบ และ 5 เมื่อ diff พบดริฟต์

+

รันจากไฟล์เดียว แบบออฟไลน์

แตกไฟล์แล้วรัน หรือติดตั้งให้ทั้งเครื่อง ไม่ต้องติดตั้ง .NET และไม่เชื่อมต่ออินเทอร์เน็ตเลย การอ่านไม่ต้องใช้สิทธิ์ผู้ดูแลระบบ GPL-3.0

+
+
+
+ +
+
+ สิ่งที่ services.msc ไม่เคยทำ +

อะไรเปลี่ยนไปตั้งแต่เมื่อวาน

+

สแนปช็อตคือเครื่องทั้งเครื่อง ณ ช่วงเวลาหนึ่ง ทุกบริการและไดรเวอร์ พร้อมประเภทการเริ่มต้น บัญชี พาธการเปิดใช้งาน แฮชและผู้ลงลายเซ็นของไฟล์ การพึ่งพา ทริกเกอร์ สิทธิพิเศษ และ security descriptor เป็น JSON ที่มีหนึ่งฟิลด์ต่อบรรทัด จึงเก็บในรีโพซิทอรีได้ และ git diff อ่านได้

+
+
$ bws snapshot diff before.json --live --exit-code
+Changed (2):
+  Spooler  Print Spooler
+    startType: Manual -> Automatic
+    status: Stopped -> Running  (running state, not configuration)
+  wlidsvc  Microsoft Account Sign-in Assistant
+    status: Stopped -> Running  (running state, not configuration)
+
+Added 0, removed 0, changed 2. Fields differing: 1 in configuration, 2 in running state.
+
    +
  • การกำหนดค่าและสถานะการทำงานรายงานแยกกัน สแนปช็อตสองชุดที่ห่างกันหนึ่งวันต่างกันตรงสิ่งที่บังเอิญทำงานอยู่ และแทบไม่มีส่วนไหนเป็นดริฟต์ ประเภทการเริ่มต้นที่เปลี่ยนคือบรรทัดที่ควรอ่าน
  • +
  • สิ่งที่เปรียบเทียบไม่ได้จะถูกแสดงไว้ ไม่ถูกซ่อน ฟิลด์ที่สแนปช็อตหนึ่งไม่เคยอ่านจะแสดงเป็น not compared ดังนั้น diff ที่บอกว่า ไม่มีอะไรเปลี่ยน หมายถึงไม่มีอะไรเปลี่ยนในสิ่งที่ทั้งสองฝั่งมองเห็น
  • +
  • --exit-code จบด้วย 5 เมื่อการกำหนดค่าต่างกัน งานตามกำหนดเวลาจึงสร้างสแนปช็อตตอนติดตั้งใช้งานและแจ้งคนในคืนแรกที่เครื่องดริฟต์ได้
  • +
  • สองเครื่อง สองไฟล์ สร้างสแนปช็อตบนสเตจจิงหนึ่งชุดและบนโปรดักชันหนึ่งชุด แล้ว diff กันที่ไหนก็ได้
  • +
+
+ สแนปช็อตและดริฟต์ทำงานอย่างไร +
+
+ +
+
+ ไม่มีอะไรเกิดขึ้นถ้าไม่มีแผน +

ตัวอย่างคือการทำงานจริง

+

ทุกการดำเนินการที่เขียนข้อมูลจะสร้างแผนก่อน และแผนเดียวกันนั้นคือตัวอย่าง ลำดับบริการที่ล้มตามกัน การปฏิเสธก่อนที่คุณจะกดอะไร บรรทัดคำสั่งที่ขอสิ่งเดียวกัน และทางย้อนกลับหลังจากนั้น

+
+
$ bws stop Winmgmt --dry-run --dependents
+Plan: stop Winmgmt  (2 steps)
+  1. stop  vmms      (would break otherwise)
+  2. stop  Winmgmt   (asked for)
+
+Warnings:
+  - Stopping Winmgmt also stops one other entry: vmms
+  - Winmgmt starts automatically, so it will be back after the next restart.
+
    +
  • รันโดยไม่มี --dry-run แล้วจะได้ขั้นตอนเหล่านั้น ตามลำดับเดียวกันพร้อมเหตุผลเดียวกันข้างๆ ไม่มีเส้นทางโค้ดที่สองสำหรับของจริง
  • +
  • สิ่งที่ล้มตามกันอยู่ในแผน บริการที่จะเสียหายเป็นขั้นตอนของตัวเอง และแผนที่จะทำให้สิ่งที่เครื่องต้องใช้หยุดลงจะบอกไว้ในคำเตือน
  • +
  • การปฏิเสธมาก่อนปุ่ม ไดรเวอร์ บริการที่ตัวจัดการไม่ยอมรับคำขอหยุด กระบวนการที่ระบบป้องกันไว้ จะถูกปฏิเสธตั้งแต่สร้างแผนพร้อมเหตุผล หน้าต่างทำให้ปุ่มเป็นสีเทาและบอกเหตุผลไว้ข้างๆ
  • +
  • การบังคับหยุดมีสองขั้น และขั้นที่สองมีเงื่อนไข bws kill ขอให้บริการหยุดและจบกระบวนการของมันเฉพาะเมื่อวิธีนั้นไม่ได้ผล พร้อมบอกชื่อบริการอื่นทุกตัวที่อยู่ในนั้น
  • +
+
+ เมื่อบริการหยุดไม่ลง +
+
+ +
+
+ ลองใช้สองนาที +

จากบรรทัดคำสั่ง

+

เอนจินเดียวกับหน้าต่าง สำหรับสคริปต์ งานตามกำหนดเวลา และ CI ข้อมูลไปที่ standard output และอย่างอื่นทั้งหมดไปที่ standard error ดังนั้น bws list --json | jq ใช้ได้ และคำเตือนจะไม่ปนเข้ามาใน JSON ของคุณ

+
bws list --query "start:auto !status:running"     อะไรที่ควรทำงานแต่ไม่ได้ทำงาน
+bws list --query "file:missing"                   บริการที่ไฟล์ปฏิบัติการหายไป
+bws list --query "signed:no peruser:no"           ไม่มีลายเซ็น ไม่รวมสำเนาต่อเซสชัน
+bws show Spooler                                  ทุกอย่างที่รู้เกี่ยวกับหนึ่งรายการ
+bws stop Winmgmt --dry-run --dependents           การหยุดมันจะทำให้อะไรล้มตามไปบ้าง
+bws kill Spooler --dry-run                        การจบกระบวนการของมันจะพาอะไรไปด้วย
+bws start-type Spooler manual --dry-run           การเอาออกจากอัตโนมัติจะเกิดอะไรขึ้น
+bws snapshot create before.json                   บันทึกสถานะเครื่องก่อนการเปลี่ยนแปลง
+bws snapshot diff before.json --live --exit-code  อะไรเปลี่ยนไปตั้งแต่นั้น 5 ถ้าการตั้งค่าเปลี่ยน
+bws history Spooler                               ใครเปลี่ยนประเภทการเริ่มต้นของมัน และเมื่อไร
+bws tool fix printer --dry-run                    การแก้ด่วนสำหรับเครื่องพิมพ์ที่ค้างจะทำอะไร
+ ทุกคำสั่ง ตัวเลือก และรหัสออก +
+
+ +
+
+ รับไปใช้ +

แตกไฟล์แล้วรัน หรือติดตั้ง

+

Windows 10 1809 หรือ Windows Server 2019 ขึ้นไป 64 บิต ไฟล์ที่บีบอัดไม่ต้องใช้ตัวติดตั้งและไม่เขียนอะไรลงรีจิสทรี และการดูข้อมูลไม่ต้องใช้สิทธิ์ผู้ดูแลระบบ การเปลี่ยนแปลงอะไรก็ตามต้องใช้เซสชันที่ยกระดับสิทธิ์ และทั้งสองส่วนจะบอกเรื่องนี้แทนที่จะล้มเหลวเงียบๆ หน้าต่างมี Restart as admin ให้

+
+ + + + + + + +
ไฟล์คืออะไร
{{archive_window}}หน้าต่าง ไฟล์ปฏิบัติการแบบครบในตัวหนึ่งไฟล์ ไม่ต้องติดตั้ง .NET
{{archive_cli}}บรรทัดคำสั่ง ไฟล์ปฏิบัติการแบบครบในตัวหนึ่งไฟล์ สำหรับสคริปต์และ CI
{{archive_installer}}ตัวติดตั้ง: ทั้งสองโปรแกรมสำหรับทุกบัญชีในเครื่อง หน้าต่างอยู่ในเมนูเริ่ม และ bws อยู่ใน PATH
+
+

ไฟล์ปฏิบัติการมีลายเซ็น Authenticode ดังนั้น Windows จะแสดงชื่อผู้เผยแพร่ แทนที่จะเตือนว่าเป็นผู้เผยแพร่ที่ไม่รู้จัก

+ +
+
diff --git a/site/pages/query-language/ar.html b/site/pages/query-language/ar.html new file mode 100644 index 0000000..dcebead --- /dev/null +++ b/site/pages/query-language/ar.html @@ -0,0 +1,177 @@ + + + + + + + +
+
+ لغة الاستعلام +

اسأل الجهاز سؤالًا

+

لغة واحدة، في مربع بحث النافذة وفي bws list --query. الكلمة المجردة تبحث في الاسم والاسم المعروض والحساب ومسار التشغيل. والحقل يضيّق البحث. {{field_count}} حقلًا، والنص نفسه يعني الشيء نفسه في نصفي الأداة.

+
+
+ +
+
+

ستة استعلامات تجيب عن سؤال حقيقي

+
+

ما يجب أن يعمل ولا يعمل

start:auto !status:running

أول استعلام يكتبه معظم الناس، وهو الذي لا يستطيع services.msc الإجابة عنه إطلاقًا.

+

خدمات اختفى ملفها

file:missing

عنصر يشير إلى ملف تنفيذي غير موجود على القرص. وهو عادةً إزالة تثبيت تركت التسجيل خلفها.

+

غير موقّعة، دون ضجيج الجلسات

signed:no peruser:no

تصنع العائلات الخاصة بكل مستخدم نسخة لكل جلسة وتملأ القائمة بما يكاد يتطابق. وهذا يسأل عن الباقي.

+

تعمل رغم تعطيلها

mismatch:running

تكوين وحالة لا يتفقان: عنصر مضبوط في المدير على ألا يبدأ أبدًا، وهو يعمل مع ذلك.

+

أي شيء يطلب صلاحيات تصحيح الأخطاء

privilege:SeDebugPrivilege

امتياز يتيح لعملية فتح أي عملية أخرى. ومن المفيد أن تعرف أي الخدمات تطلبه.

+

ما لم تستطع الأداة قراءته

account:?

العناصر التي لم تستطع هذه الجلسة قراءة الحساب فيها. وهذا سؤال لا يستطيع services.msc حتى طرحه.

+
+
+
+ +
+
+

كيف يُكتب الاستعلام

+
+
+

شروط البحث

+
    +
  • تُفصل الشروط بمسافات ويجب أن تتحقق كلها، ولا توجد كلمة and لأنه لا معنى آخر يمكن أن تؤديه.
  • +
  • الحقل نفسه إذا كُتب مرتين هو الاستثناء الوحيد: status:running status:stopped تعني أيًّا منهما، لأن هذا ما يكتبه تحديد مرشحين. أما حدّان على رقم فيضيّقان كالمعتاد: pid:>1000 pid:<2000 هو النطاق بينهما.
  • +
  • الرمز ! قبل شرط ينفيه: !status:running. وفي ملف دفعي فيه setlocal EnableDelayedExpansion يلتهم cmd ذلك الرمز ! دون كلمة، فيعني الاستعلام شيئًا آخر بصمت، فاكتب ^! داخل علامتي الاقتباس هناك.
  • +
  • الفاصلة داخل الحقل تعني أو: start:manual,disabled.
  • +
  • علامتا الاقتباس تحميان كل ما فيه مسافات أو نقطتان رأسيتان: account:"NT SERVICE\McmSvc".
  • +
  • المسار الملصق كما هو، C:\Windows\System32\svchost.exe، يُبحث عنه ولا يُقرأ على أنه حقل اسمه C.
  • +
+
+
+

كيف يُطابَق النص

+
    +
  • name:spool يطابق كل ما يحتوي عليه. وهذا هو الافتراضي لأنه ما يتوقعه الناس من مربع بحث.
  • +
  • name:=spooler مطابقة تامة.
  • +
  • name:spool* يقبل أحرف البدل، * و?.
  • +
  • name:/^Sql.*/ تعبير نمطي، وداخل الشرطتين المائلتين يُكتب كما تُكتب التعبيرات النمطية: \? و\\ والفاصلة تعني ما تعنيه هناك. والشرطة المائلة التي لا تُغلق خطأ، فللبحث عن الشرطة المائلة نفسها اكتب \/ أو استخدم علامتي الاقتباس.
  • +
  • يُتجاهل اختلاف حالة الأحرف حتى خارج ASCII: اسم معروض بالبولندية أو اليونانية يطابق مهما كانت طريقة كتابته.
  • +
+
+
+

ثلاث كلمات يقبلها كل حقل

+ {{list:reserved-words}} +

القيمة المكتوبة بخطأ هي خطأ، وليست نتيجة فارغة أبدًا. status:runing يجيب Did you mean running? وينتهي بالرمز 2. فالقائمة الفارغة كانت ستبدو إجابة، والفرق بين «لا شيء يطابق» و«كتبتها خطأ» هو الفرق بين جهاز نظيف وتدقيق لم يُثبت شيئًا. والاستعلام الذي لن يضيّق شيئًا يُرفض في سطر الأوامر أيضًا، حتى لا يعمل سكربت على الجهاز كله بسبب خطأ مطبعي.

+
+
+ +
+
+

أمثلة أخرى

+

كل مثال يعمل بالطريقة نفسها في مربع بحث النافذة وبعد bws list --query، وقد شُغّل كل منها على Windows حقيقي قبل أن يُكتب هنا. وما يجده يعتمد على الجهاز، وفي السؤال عن المشكلات تكون الإجابة الفارغة هي ما تريده.

+
+

الحالة ونوع بدء التشغيل

+
+ + + + + + + + +
الاستعلامما الذي يجده
status:stopPending,startPendingعالقة على الإيقاف أو البدء، وهو الانتظار الذي يعرضه snap-in ولا ينتهي أبدًا.
start:auto status:stopped trigger:noneمضبوطة على البدء التلقائي، ومتوقفة، ولا تنتظر مشغّلًا: القائمة القصيرة التي تستحق القراءة بعد إعادة التشغيل.
start:delayedتلقائي، يبدأ بعد العناصر التلقائية الأخرى بقليل.
start:manual,disabled status:runningتعمل مع أن شيئًا لا يبدؤها عند الإقلاع: طلبها شيء ما، أو بدأها مشغّل، أو بدأها شخص.
+
+

الحسابات

+
+ + + + + + + +
الاستعلامما الذي يجده
account:localsystem !publisher:microsoftتعمل بحساب LocalSystem، وهو أقوى حساب، من ملف لم توقّعه Microsoft. والاستعلام عن الناشر يقرأ التوقيعات من تلقاء نفسه، فيستغرق بضع ثوانٍ.
!account:localsystem,localservice,networkservice type:ownProcess,sharedProcessالخدمات التي تعمل بأي حساب آخر: حساب افتراضي أو مُدار أو حساب شخص بعينه.
account:"NT SERVICE"حساب افتراضي خاص بالخدمة. وعلامتا الاقتباس تبقيان الكلمتين معًا بسبب المسافة.
+
+

الملفات والتوقيعات

+
+ + + + + + + + + + +
الاستعلامما الذي يجده
signed:notSigned,untrustedRoot,tamperedبلا توقيع، أو سلسلة لا يثق بها Windows، أو ملف تغيّر بعد توقيعه.
signed:trusted !publisher:microsoftموقّعة وموثوقة وليست من Microsoft: البرامج التي وضعتها شركات أخرى على هذا الجهاز.
type:driver start:boot,system !signed:trustedبرامج تشغيل تُحمَّل أثناء بدء Windows ولا يثق Windows بتوقيعها. وعلى جهاز سليم لا يوجد أي منها.
!path:C:\Windows type:ownProcessخدمة لها عمليتها الخاصة وملفها خارج مجلد Windows.
path:\AppData\تعمل من داخل ملف تعريف أحدهم، وهو آخر مكان يُتوقع أن تُشغَّل منه خدمة.
path:\System32\\ type:ownProcessالشرطة المائلة العكسية قبل المسافة تجعل المسافة جزءًا من الكلمة، فالمسار المنتهي بشرطة مائلة عكسية يُكتب بشرطتين حين يليه شرط آخر. وفي نهاية الاستعلام تكفي واحدة.
+
+

المشغّلات والتبعيات

+
+ + + + + + + + + +
الاستعلامما الذي يجده
trigger:device status:stoppedتنتظر وصول جهاز، فهي متوقفة لسبب.
trigger:networkتبدأ عندما يصل طلب إلى نقطة نهاية في الشبكة: منفذ أو أنبوب مسمّى أو واجهة RPC.
trigger:stopعناصر يستطيع مشغّل إيقافها، لا بدؤها فقط.
dependson:Winmgmtعناصر تحتاج إلى WMI كي تعمل.
requiredby:Spoolerكل ما تحتاجه Print Spooler لتعمل، وما تحتاجه تلك بدورها.
+
+

الامتيازات والعمليات

+
+ + + + + + + + + + +
الاستعلامما الذي يجده
privilege:SeTcbPrivilegeتطلب العمل بوصفها جزءًا من نظام التشغيل.
privilege:SeImpersonatePrivilege !account:localsystemتستطيع التصرف نيابةً عن عميل وهي تعمل بحساب غير LocalSystem.
sidtype:unrestrictedتحمل معرّف SID خاصًا بها في عمليتها، فيمكن للأذونات أن تسمّيها وحدها. والاستعلام sidtype:restricted يسأل عن الخدمات التي عمليتها مقيّدة الكتابة أيضًا.
type:sharedProcess status:runningتعمل داخل svchost مشترك مع غيرها.
memory:>200MBعملية تستخدم أكثر من 200 MB. وتُقرأ الذاكرة من تلقاء نفسها حين يسأل الاستعلام عنها.
pid:1000-2000في عملية معرّفها بين 1000 و2000.
+
+

الأسماء والنص

+
+ + + + + + + + + + + +
الاستعلامما الذي يجده
spoolكلمة مجردة، يُبحث عنها في الاسم والاسم المعروض والحساب ومسار التشغيل.
name:=wuauservهذا الاسم بالضبط، ولا شيء يحتوي عليه فقط.
name:win*أسماء تبدأ بالحروف win، مكتوبة بحرف بدل.
name:/svc$/أسماء تنتهي بالحروف svc، مكتوبة تعبيرًا نمطيًا.
description:noneلا وصف إطلاقًا، وهذا حال معظم برامج التشغيل.
description:?وصف لم يستطع Windows تسليمه، وعادةً لأنه يشير إلى ملف لغة غير موجود.
peruser:templateالقوالب الخاصة بكل مستخدم التي ينسخها Windows لكل جلسة مسجَّل دخولها.
+
+
+
+
+ +
+
+

كل حقل

+

مبني من البرنامج نفسه، فلا يستطيع هذا الجدول أن ينحرف عمّا تقبله الأداة. والحقل الذي لا قائمة قيم له يقبل نصًا أو رقمًا أو حجمًا، والعمود الثالث يقول أيها.

+ {{table:query-fields}} +
+
+ +
+
+

شيئان يستحقان أن تعرفهما

+
+
+

بعض الحقول مكلفة، وطلبها يشغّل القراءة

+

قراءة التوقيعات تستغرق عدة ثوانٍ على جهاز كامل، والذاكرة قياس وليست إعدادًا، فلا يُقرأ أيٌّ منهما للقائمة ما لم يُطلب. والاستعلام الذي يذكر أحدهما يشغّل تلك القراءة من تلقاء نفسه، فلا داعي لأن تتذكر --signatures مع signed:no. وفي النافذة يقول الاستعلام عن التوقيعات إن الجواب غير مكتمل إلى أن تصل، بدل أن يعرض قائمة أقصر كأنها الجواب.

+
+
+

النتيجة التي حُكم فيها على شيء غير مقروء تقول ذلك

+

إذا حُكم على عناصر بناءً على حقل تعذرت على هذه الجلسة قراءته، فإن النتيجة تحمل سطرًا يذكر كم عنصرًا، لأن نتيجة كهذه قد تنقصها عناصر، أو تضم عناصر لا تنتمي إليها. وهذه القاعدة نفسها التي تلتزم بها الأداة كلها: القراءة الفاشلة ظاهرة في الجواب، ولا تُبتلع أبدًا. والناشر يعامل المعاملة نفسها حين لا تدّعيه إلا الشهادة: بجانب أي حكم غير trusted يُعرض الاسم على أنه not verified، ويحتسب publisher: العنصر غير مؤكَّد في سطر مستقل، فيُبقي !publisher:microsoft على ملف من Microsoft غيّره أحدهم بعد توقيعه.

+
+
+ مرجع سطر الأوامر +
+
diff --git a/site/pages/query-language/hi.html b/site/pages/query-language/hi.html new file mode 100644 index 0000000..d18e661 --- /dev/null +++ b/site/pages/query-language/hi.html @@ -0,0 +1,178 @@ + + + + + + + +
+
+ क्वेरी भाषा +

मशीन से सवाल पूछें

+

एक भाषा, विंडो के खोज बॉक्स में भी और bws list --query में भी। अकेला शब्द नाम, प्रदर्शन नाम, खाते और लॉन्च पथ में खोजता है। फ़ील्ड उसे सीमित करता है। {{field_count}} फ़ील्ड, और टूल के दोनों हिस्सों में एक ही पाठ का एक ही मतलब होता है।

+
+
+ +
+
+

छह जो एक असली सवाल का जवाब देते हैं

+
+

जो चालू होना चाहिए और नहीं है

start:auto !status:running

ज़्यादातर लोग जो पहली क्वेरी लिखते हैं, और जिसका जवाब services.msc बिल्कुल नहीं दे सकता।

+

वे सेवाएँ जिनकी फ़ाइल गायब है

file:missing

ऐसी प्रविष्टि जो डिस्क पर मौजूद न रहने वाली बाइनरी की ओर इशारा करती है। आमतौर पर वह अनइंस्टॉल जिसने रजिस्ट्रेशन पीछे छोड़ दिया।

+

बिना हस्ताक्षर वाली, सत्र के शोर के बिना

signed:no peruser:no

प्रति-उपयोगकर्ता परिवार हर सत्र के लिए एक प्रति बनाते हैं और सूची को लगभग-एक-जैसी प्रविष्टियों से भर देते हैं। यह बाकी के बारे में पूछता है।

+

Disabled होने के बावजूद चल रही

mismatch:running

कॉन्फ़िगरेशन और स्थिति जो आपस में मेल नहीं खातीं: ऐसी प्रविष्टि जिसे प्रबंधक कभी शुरू न करने के लिए सेट है, फिर भी चल रही है।

+

कुछ भी जो डीबग अधिकार माँगता है

privilege:SeDebugPrivilege

एक विशेषाधिकार जो किसी प्रक्रिया को दूसरी किसी भी प्रक्रिया को खोलने देता है। यह जानना ज़रूरी है कि कौन सी सेवाएँ इसे माँगती हैं।

+

जो टूल पढ़ नहीं सका

account:?

वे प्रविष्टियाँ जिनमें यह सत्र खाता नहीं पढ़ सका। एक ऐसा सवाल जो services.msc पूछ भी नहीं सकता।

+
+
+
+ +
+
+

क्वेरी कैसे लिखी जाती है

+
+
+

शब्द

+
    +
  • शब्द रिक्त स्थानों से अलग किए जाते हैं और सभी का मेल खाना ज़रूरी है। and कीवर्ड इसलिए नहीं है कि उसका और कोई मतलब हो ही नहीं सकता।
  • +
  • एक ही फ़ील्ड का दो बार लिखा जाना अकेला अपवाद है: status:running status:stopped का मतलब है दोनों में से कोई, क्योंकि दो फ़िल्टर टिक करने पर यही लिखा जाता है। किसी संख्या पर दो सीमाएँ फिर भी दायरा घटाती हैं: pid:>1000 pid:<2000 उन दोनों के बीच का दायरा है।
  • +
  • किसी शब्द के आगे ! उसे उलट देता है: !status:running। setlocal EnableDelayedExpansion वाली बैच फ़ाइल में cmd उस ! को बिना कुछ कहे खा जाता है और क्वेरी चुपचाप कुछ और मतलब रखने लगती है। वहाँ उद्धरण चिह्नों के अंदर ^! लिखें।
  • +
  • फ़ील्ड के अंदर अल्पविराम का मतलब या है: start:manual,disabled।
  • +
  • उद्धरण चिह्न ऐसी किसी भी चीज़ को सुरक्षित रखते हैं जिसमें रिक्त स्थान या कोलन हों: account:"NT SERVICE\McmSvc"।
  • +
  • जैसा है वैसा चिपकाया गया पथ, C:\Windows\System32\svchost.exe, खोजा जाता है, C नाम के फ़ील्ड के रूप में पढ़ा नहीं जाता।
  • +
+
+
+

पाठ का मिलान कैसे होता है

+
    +
  • name:spool उस हर चीज़ से मेल खाता है जिसमें वह शामिल हो। यह डिफ़ॉल्ट है, क्योंकि खोज बॉक्स से लोग यही उम्मीद करते हैं।
  • +
  • name:=spooler सटीक मिलान है।
  • +
  • name:spool* वाइल्डकार्ड लेता है, * और ?।
  • +
  • name:/^Sql.*/ एक रेगुलर एक्सप्रेशन है, और स्लैश के अंदर वह वैसे ही लिखा जाता है जैसे रेगुलर एक्सप्रेशन लिखे जाते हैं: \?, \\ और अल्पविराम का वही मतलब है जो वहाँ होता है। जो स्लैश कभी बंद नहीं होता वह त्रुटि है। स्लैश को ही खोजने के लिए \/ लिखें या उद्धरण चिह्न इस्तेमाल करें।
  • +
  • बड़े और छोटे अक्षरों का भेद अनदेखा किया जाता है, ASCII के बाहर भी: पोलिश या ग्रीक में प्रदर्शन नाम चाहे जैसे टाइप किया जाए, मेल खाता है।
  • +
+
+
+

तीन शब्द जो हर फ़ील्ड स्वीकार करता है

+ {{list:reserved-words}} +

गलत टाइप किया गया मान त्रुटि है, कभी खाली नतीजा नहीं। status:runing जवाब देता है Did you mean running? और कोड 2 के साथ खत्म होता है। खाली सूची जवाब जैसी दिखती, और “कुछ मेल नहीं खाता” तथा “आपने गलत टाइप किया” के बीच का अंतर ही साफ़-सुथरी मशीन और ऐसे ऑडिट के बीच का अंतर है जिसने कुछ साबित नहीं किया। जो क्वेरी कुछ भी सीमित न करती उसे कमांड लाइन पर भी मना कर दिया जाता है, ताकि टाइपो की वजह से कोई स्क्रिप्ट पूरी मशीन पर काम न करने लगे।

+
+
+ +
+
+

और उदाहरण

+

हर एक विंडो के खोज बॉक्स में और bws list --query के बाद एक जैसा काम करता है, और हर एक को यहाँ लिखे जाने से पहले असली Windows पर चलाया गया था। वह क्या ढूँढता है यह मशीन पर निर्भर है, और परेशानी के बारे में पूछे गए सवाल का खाली जवाब वही है जो आप चाहते हैं।

+
+

स्थिति और स्टार्टअप प्रकार

+
+ + + + + + + + +
क्वेरीयह क्या ढूँढता है
status:stopPending,startPendingरुकने या शुरू होने पर अटकी हुई: वह इंतज़ार जो snap-in दिखाता है और जो कभी खत्म नहीं होता।
start:auto status:stopped trigger:noneअपने-आप शुरू होने के लिए सेट, रुकी हुई, और किसी ट्रिगर का इंतज़ार न करती: रीस्टार्ट के बाद पढ़ने लायक छोटी सूची।
start:delayedऑटोमैटिक, पर बाकी ऑटोमैटिक प्रविष्टियों से थोड़ी देर बाद शुरू होने वाली।
start:manual,disabled status:runningचल रही है जबकि बूट पर इसे कोई शुरू नहीं करता: किसी ने इसे माँगा, किसी ट्रिगर ने इसे शुरू किया, या किसी व्यक्ति ने।
+
+

खाते

+
+ + + + + + + +
क्वेरीयह क्या ढूँढता है
account:localsystem !publisher:microsoftLocalSystem के रूप में चल रही, सबसे शक्तिशाली खाता, ऐसी फ़ाइल से जिस पर Microsoft ने हस्ताक्षर नहीं किए। प्रकाशक के बारे में क्वेरी हस्ताक्षर अपने आप पढ़ती है, इसलिए इसमें कुछ सेकंड लगते हैं।
!account:localsystem,localservice,networkservice type:ownProcess,sharedProcessकिसी भी दूसरे खाते के अंतर्गत चलती सेवाएँ: वर्चुअल खाता, प्रबंधित खाता या किसी व्यक्ति का अपना खाता।
account:"NT SERVICE"सेवा का अपना वर्चुअल खाता। उद्धरण चिह्न शब्दों को साथ रखते हैं, रिक्त स्थान की वजह से।
+
+

फ़ाइलें और हस्ताक्षर

+
+ + + + + + + + + + +
क्वेरीयह क्या ढूँढता है
signed:notSigned,untrustedRoot,tamperedकोई हस्ताक्षर नहीं, ऐसी श्रृंखला जिस पर Windows भरोसा नहीं करता, या हस्ताक्षर के बाद बदली गई फ़ाइल।
signed:trusted !publisher:microsoftहस्ताक्षरित, भरोसेमंद, और Microsoft द्वारा नहीं: वह सॉफ़्टवेयर जो दूसरी कंपनियों ने इस मशीन पर रखा है।
type:driver start:boot,system !signed:trustedWindows के शुरू होते समय लोड होने वाले ड्राइवर जिनके हस्ताक्षर पर Windows भरोसा नहीं करता। स्वस्थ मशीन पर, एक भी नहीं।
!path:C:\Windows type:ownProcessअपनी अलग प्रक्रिया वाली सेवा जिसकी फ़ाइल Windows फ़ोल्डर के बाहर है।
path:\AppData\किसी के प्रोफ़ाइल के अंदर से लॉन्च की गई, वह आखिरी जगह जहाँ किसी सेवा की उम्मीद की जाती है।
path:\System32\\ type:ownProcessरिक्त स्थान से पहले का बैकस्लैश रिक्त स्थान को शब्द का हिस्सा बना देता है, इसलिए बैकस्लैश पर खत्म होने वाला पथ, जब उसके बाद कोई और शब्द आए, दो बैकस्लैश के साथ लिखा जाता है। क्वेरी के अंत में एक काफ़ी है।
+
+

ट्रिगर और निर्भरताएँ

+
+ + + + + + + + + +
क्वेरीयह क्या ढूँढता है
trigger:device status:stoppedकिसी डिवाइस के आने का इंतज़ार कर रही, इसलिए किसी कारण से रुकी हुई।
trigger:networkतब शुरू होती है जब किसी नेटवर्क एंडपॉइंट पर अनुरोध आता है: पोर्ट, नेम्ड पाइप या RPC इंटरफ़ेस।
trigger:stopवे प्रविष्टियाँ जिन्हें कोई ट्रिगर रोक भी सकता है, सिर्फ़ शुरू ही नहीं।
dependson:Winmgmtवे प्रविष्टियाँ जिन्हें चलने के लिए WMI चाहिए।
requiredby:Spoolerवह सब जो Print Spooler को चलने के लिए चाहिए, और बदले में उन्हें क्या चाहिए।
+
+

विशेषाधिकार और प्रक्रियाएँ

+
+ + + + + + + + + + +
क्वेरीयह क्या ढूँढता है
privilege:SeTcbPrivilegeऑपरेटिंग सिस्टम के हिस्से के रूप में काम करने का अनुरोध करती है।
privilege:SeImpersonatePrivilege !account:localsystemLocalSystem के अलावा किसी खाते के अंतर्गत चलते हुए क्लाइंट की ओर से काम कर सकती है।
sidtype:unrestrictedअपनी प्रक्रिया में अपना एक सेवा SID रखती है, इसलिए अनुमतियाँ उसे अकेले नाम दे सकती हैं। sidtype:restricted उनके लिए पूछता है जिनकी प्रक्रिया लिखने पर भी प्रतिबंधित है।
type:sharedProcess status:runningसाझा svchost के अंदर, दूसरों के साथ चल रही।
memory:>200MBऐसी प्रक्रिया जो 200 MB से ज़्यादा इस्तेमाल करती है। जब क्वेरी मेमोरी के बारे में पूछती है तो मेमोरी अपने आप पढ़ी जाती है।
pid:1000-2000ऐसी प्रक्रिया में जिसकी आईडी 1000 और 2000 के बीच है।
+
+

नाम और पाठ

+
+ + + + + + + + + + + +
क्वेरीयह क्या ढूँढता है
spoolअकेला शब्द, जो नाम, प्रदर्शन नाम, खाते और लॉन्च पथ में खोजा जाता है।
name:=wuauservठीक यही नाम, और ऐसा कुछ नहीं जो सिर्फ़ इसे शामिल करता हो।
name:win*वे नाम जो win से शुरू होते हैं, वाइल्डकार्ड के साथ लिखे हुए।
name:/svc$/वे नाम जो svc पर खत्म होते हैं, रेगुलर एक्सप्रेशन के रूप में लिखे हुए।
description:noneकोई विवरण बिल्कुल नहीं, जो ज़्यादातर ड्राइवरों के साथ है।
description:?ऐसा विवरण जो Windows सौंप नहीं सका, आमतौर पर इसलिए कि वह किसी ऐसी भाषा फ़ाइल की ओर इशारा करता है जो मौजूद नहीं।
peruser:templateप्रति-उपयोगकर्ता टेम्पलेट जिन्हें Windows हर साइन-इन किए गए सत्र के लिए कॉपी करता है।
+
+
+
+
+ +
+
+

हर फ़ील्ड

+

प्रोग्राम से ही बनी, इसलिए यह तालिका उससे अलग नहीं हो सकती जो टूल स्वीकार करता है। जिस फ़ील्ड की मानों की सूची नहीं है वह पाठ, संख्या या आकार लेता है। तीसरा कॉलम बताता है कि कौन सा।

+ {{table:query-fields}} +
+
+ +
+
+

दो बातें जानने लायक

+
+
+

कुछ फ़ील्ड महँगे हैं, और उन्हें माँगना पढ़ना चालू कर देता है

+

पूरी मशीन पर हस्ताक्षर पढ़ने में कई सेकंड लगते हैं और मेमोरी एक माप है, सेटिंग नहीं, इसलिए माँगे बिना सूची के लिए इनमें से कुछ नहीं पढ़ा जाता। जो क्वेरी इनमें से किसी का ज़िक्र करती है वह उस पढ़ने को अपने आप चालू कर देती है, इसलिए signed:no के साथ --signatures भी याद रखने की ज़रूरत नहीं। विंडो में हस्ताक्षरों के बारे में क्वेरी कहती है कि जवाब हस्ताक्षर आने तक अधूरा है, छोटी सूची को जवाब की तरह दिखाने के बजाय।

+
+
+

जिस नतीजे का फ़ैसला पढ़ी न जा सकने वाली चीज़ पर हुआ, वह यह बता देता है

+

यदि प्रविष्टियों का फ़ैसला किसी ऐसे फ़ील्ड पर हुआ जिसे यह सत्र पढ़ नहीं सका, तो नतीजे में एक पंक्ति होती है जो बताती है कितनी, क्योंकि ऐसे नतीजे में प्रविष्टियाँ छूट सकती हैं, या ऐसी प्रविष्टियाँ हो सकती हैं जो वहाँ की नहीं हैं। यही वह नियम है जो पूरा टूल निभाता है: असफल पढ़ना जवाब में दिखता है, कभी निगला नहीं जाता। प्रकाशक के साथ भी यही बर्ताव होता है जब उसका दावा सिर्फ़ प्रमाणपत्र करता है: trusted के अलावा किसी भी फ़ैसले के बगल में नाम not verified के रूप में दिखाया जाता है, और publisher: प्रविष्टि को अपनी एक अलग पंक्ति में अनिश्चित गिनता है, इसलिए !publisher:microsoft उस Microsoft फ़ाइल को रखता है जिसे हस्ताक्षर के बाद किसी ने बदल दिया।

+
+
+ कमांड लाइन संदर्भ +
+
diff --git a/site/pages/query-language/th.html b/site/pages/query-language/th.html new file mode 100644 index 0000000..7be2571 --- /dev/null +++ b/site/pages/query-language/th.html @@ -0,0 +1,177 @@ + + + + + + + +
+
+ ภาษาคิวรี +

ถามเครื่องหนึ่งคำถาม

+

ภาษาเดียว ทั้งในช่องค้นหาของหน้าต่างและใน bws list --query คำเดี่ยวๆ จะค้นหาในชื่อ ชื่อที่แสดง บัญชี และพาธการเปิดใช้งาน ฟิลด์ช่วยจำกัดให้แคบลง {{field_count}} ฟิลด์ และข้อความเดียวกันมีความหมายเดียวกันในทั้งสองส่วนของเครื่องมือ

+
+
+ +
+
+

หกคิวรีที่ตอบคำถามจริง

+
+

อะไรที่ควรทำงานแต่ไม่ได้ทำงาน

start:auto !status:running

คิวรีแรกที่คนส่วนใหญ่เขียน และเป็นคิวรีที่ services.msc ตอบไม่ได้เลย

+

บริการที่ไฟล์หายไป

file:missing

รายการที่ชี้ไปยังไฟล์ปฏิบัติการที่ไม่อยู่บนดิสก์ มักเกิดจากการถอนการติดตั้งที่ทิ้งการลงทะเบียนไว้

+

ไม่มีลายเซ็น และไม่มีสัญญาณรบกวนจากเซสชัน

signed:no peruser:no

ตระกูลต่อผู้ใช้สร้างสำเนาต่อเซสชันและทำให้รายชื่อเต็มไปด้วยรายการที่เกือบซ้ำกัน คิวรีนี้ถามเฉพาะส่วนที่เหลือ

+

ทำงานทั้งที่ปิดใช้งาน

mismatch:running

การกำหนดค่าและสถานะขัดแย้งกัน รายการที่ตัวจัดการตั้งไว้ไม่ให้เริ่มเลย แต่ทำงานอยู่

+

อะไรก็ตามที่ขอสิทธิ์ดีบัก

privilege:SeDebugPrivilege

สิทธิพิเศษที่ให้กระบวนการเปิดกระบวนการอื่นได้ทุกตัว ควรรู้ว่าบริการไหนขอมัน

+

สิ่งที่เครื่องมืออ่านไม่ได้

account:?

รายการที่เซสชันนี้อ่านบัญชีไม่ได้ เป็นคำถามที่ services.msc ถามไม่ได้ด้วยซ้ำ

+
+
+
+ +
+
+

เขียนคิวรีอย่างไร

+
+
+

คำค้น

+
    +
  • คำค้นคั่นด้วยช่องว่างและต้องตรงทุกคำ ไม่มีคีย์เวิร์ด and เพราะมันไม่มีความหมายอื่นที่เป็นไปได้
  • +
  • ฟิลด์เดียวกันที่เขียนสองครั้งเป็นข้อยกเว้นเดียว: status:running status:stopped หมายถึงอย่างใดอย่างหนึ่ง เพราะนั่นคือสิ่งที่การติ๊กตัวกรองสองตัวเขียนออกมา ขอบเขตสองด้านของตัวเลขยังคงจำกัดให้แคบลง pid:>1000 pid:<2000 คือช่วงระหว่างทั้งสอง
  • +
  • ! หน้าคำค้นทำให้เป็นนิเสธ: !status:running ในไฟล์แบตช์ที่มี setlocal EnableDelayedExpansion cmd จะกิน ! นั้นโดยไม่บอกอะไร และคิวรีก็มีความหมายอื่นไปเงียบๆ ให้เขียน ^! ภายในเครื่องหมายคำพูดตรงนั้น
  • +
  • เครื่องหมายจุลภาคภายในฟิลด์คือ หรือ: start:manual,disabled
  • +
  • เครื่องหมายคำพูดปกป้องสิ่งที่มีช่องว่างหรือเครื่องหมายทวิภาค: account:"NT SERVICE\McmSvc"
  • +
  • พาธที่วางมาตามที่เป็น C:\Windows\System32\svchost.exe จะถูกค้นหา ไม่ถูกอ่านเป็นฟิลด์ชื่อ C
  • +
+
+
+

ข้อความจับคู่อย่างไร

+
    +
  • name:spool ตรงกับทุกอย่างที่ มี คำนั้น เป็นค่าเริ่มต้น เพราะเป็นสิ่งที่คนคาดหวังจากช่องค้นหา
  • +
  • name:=spooler คือตรงทั้งหมด
  • +
  • name:spool* รับไวลด์การ์ด * และ ?
  • +
  • name:/^Sql.*/ คือนิพจน์ปกติ และภายในเครื่องหมายทับเขียนตามแบบของนิพจน์ปกติ: \?, \\ และเครื่องหมายจุลภาคมีความหมายตามที่มันมีในนั้น เครื่องหมายทับที่ไม่ปิดคือข้อผิดพลาด ถ้าจะค้นหาเครื่องหมายทับเอง ให้เขียน \/ หรือใช้เครื่องหมายคำพูด
  • +
  • ไม่สนตัวพิมพ์ใหญ่เล็ก รวมถึงนอก ASCII ชื่อที่แสดงภาษาโปแลนด์หรือกรีกตรงกันไม่ว่าจะพิมพ์แบบไหน
  • +
+
+
+

สามคำที่ทุกฟิลด์ยอมรับ

+ {{list:reserved-words}} +

ค่าที่พิมพ์ผิดคือข้อผิดพลาด ไม่เคยเป็นผลลัพธ์ว่าง status:runing ตอบว่า Did you mean running? และจบด้วยรหัส 2 รายชื่อว่างจะดูเหมือนคำตอบ และความต่างระหว่าง “ไม่มีอะไรตรง” กับ “คุณพิมพ์ผิด” คือความต่างระหว่างเครื่องที่สะอาดกับการตรวจสอบที่ไม่ได้พิสูจน์อะไร คิวรีที่ไม่ทำให้แคบลงเลยจะถูกปฏิเสธบนบรรทัดคำสั่งด้วย สคริปต์จึงไม่ทำงานกับทั้งเครื่องเพราะพิมพ์ผิดตัวเดียว

+
+
+ +
+
+

ตัวอย่างเพิ่มเติม

+

แต่ละตัวทำงานเหมือนกันในช่องค้นหาของหน้าต่างและหลัง bws list --query และแต่ละตัวถูกรันบน Windows จริงก่อนจะเขียนไว้ที่นี่ สิ่งที่พบขึ้นอยู่กับเครื่อง และสำหรับคำถามเรื่องปัญหา คำตอบที่ว่างคือคำตอบที่คุณต้องการ

+
+

สถานะและประเภทการเริ่มต้น

+
+ + + + + + + + +
คิวรีสิ่งที่พบ
status:stopPending,startPendingค้างอยู่ที่กำลังหยุดหรือกำลังเริ่ม การรอที่สแนปอินแสดงและไม่มีวันจบ
start:auto status:stopped trigger:noneตั้งให้เริ่มอัตโนมัติ หยุดอยู่ และไม่ได้รอทริกเกอร์ รายชื่อสั้นๆ ที่ควรอ่านหลังรีสตาร์ต
start:delayedอัตโนมัติ เริ่มช้ากว่ารายการอัตโนมัติอื่นเล็กน้อย
start:manual,disabled status:runningทำงานอยู่ทั้งที่ไม่มีอะไรเริ่มมันตอนบูต มีบางอย่างขอมัน ทริกเกอร์เริ่มมัน หรือมีคนเริ่มมัน
+
+

บัญชี

+
+ + + + + + + +
คิวรีสิ่งที่พบ
account:localsystem !publisher:microsoftรันเป็น LocalSystem บัญชีที่แรงที่สุด จากไฟล์ที่ Microsoft ไม่ได้ลงลายเซ็น คิวรีเกี่ยวกับผู้เผยแพร่อ่านลายเซ็นเอง จึงใช้เวลาไม่กี่วินาที
!account:localsystem,localservice,networkservice type:ownProcess,sharedProcessบริการที่รันภายใต้บัญชีอื่นใด บัญชีเสมือน บัญชีที่มีการจัดการ หรือบัญชีของคนใดคนหนึ่งเอง
account:"NT SERVICE"บัญชีเสมือนของบริการเอง เครื่องหมายคำพูดรวมคำเข้าด้วยกันเพราะมีช่องว่าง
+
+

ไฟล์และลายเซ็น

+
+ + + + + + + + + + +
คิวรีสิ่งที่พบ
signed:notSigned,untrustedRoot,tamperedไม่มีลายเซ็น สายใบรับรองที่ Windows ไม่เชื่อถือ หรือไฟล์ที่ถูกเปลี่ยนหลังลงลายเซ็น
signed:trusted !publisher:microsoftลงลายเซ็น เชื่อถือได้ และไม่ใช่โดย Microsoft ซอฟต์แวร์ที่บริษัทอื่นวางไว้บนเครื่องนี้
type:driver start:boot,system !signed:trustedไดรเวอร์ที่โหลดตอน Windows เริ่มซึ่ง Windows ไม่เชื่อถือลายเซ็น บนเครื่องที่แข็งแรงควรไม่มีเลย
!path:C:\Windows type:ownProcessบริการที่มีกระบวนการของตัวเองซึ่งไฟล์อยู่นอกโฟลเดอร์ Windows
path:\AppData\เปิดจากภายในโปรไฟล์ของใครสักคน ที่สุดท้ายที่คนคาดว่าจะมีบริการ
path:\System32\\ type:ownProcessแบ็กสแลชหน้าช่องว่างทำให้ช่องว่างเป็นส่วนหนึ่งของคำ ดังนั้นพาธที่ลงท้ายด้วยแบ็กสแลชจึงเขียนสองตัวเมื่อมีคำค้นอื่นตามหลัง ที่ท้ายคิวรีหนึ่งตัวก็พอ
+
+

ทริกเกอร์และการพึ่งพา

+
+ + + + + + + + + +
คิวรีสิ่งที่พบ
trigger:device status:stoppedรอให้อุปกรณ์มาถึง จึงหยุดด้วยเหตุผล
trigger:networkเริ่มเมื่อมีคำขอมาถึงเอ็นด์พอยต์เครือข่าย พอร์ต named pipe หรืออินเทอร์เฟซ RPC
trigger:stopรายการที่ทริกเกอร์หยุดได้ ไม่ใช่แค่เริ่ม
dependson:Winmgmtรายการที่ต้องใช้ WMI เพื่อทำงาน
requiredby:Spoolerทุกอย่างที่ Print Spooler ต้องใช้เพื่อทำงาน และสิ่งที่สิ่งเหล่านั้นต้องใช้ต่อกันไป
+
+

สิทธิพิเศษและกระบวนการ

+
+ + + + + + + + + + +
คิวรีสิ่งที่พบ
privilege:SeTcbPrivilegeขอทำงานเป็นส่วนหนึ่งของระบบปฏิบัติการ
privilege:SeImpersonatePrivilege !account:localsystemทำงานแทนไคลเอนต์ได้ขณะรันภายใต้บัญชีอื่นที่ไม่ใช่ LocalSystem
sidtype:unrestrictedมี service SID ของตัวเองในกระบวนการ สิทธิ์จึงระบุชื่อมันตัวเดียวได้ sidtype:restricted ถามถึงรายการที่กระบวนการถูกจำกัดการเขียนด้วย
type:sharedProcess status:runningทำงานอยู่ใน svchost ที่ใช้ร่วมกัน พร้อมรายการอื่น
memory:>200MBกระบวนการที่ใช้มากกว่า 200 MB หน่วยความจำจะถูกอ่านเองเมื่อคิวรีถามถึงมัน
pid:1000-2000อยู่ในกระบวนการที่ id อยู่ระหว่าง 1000 ถึง 2000
+
+

ชื่อและข้อความ

+
+ + + + + + + + + + + +
คิวรีสิ่งที่พบ
spoolคำเดี่ยวๆ ค้นหาในชื่อ ชื่อที่แสดง บัญชี และพาธการเปิดใช้งาน
name:=wuauservชื่อนี้ตรงทั้งหมด และไม่มีอะไรที่แค่มีมันอยู่ข้างใน
name:win*ชื่อที่ขึ้นต้นด้วย win เขียนด้วยไวลด์การ์ด
name:/svc$/ชื่อที่ลงท้ายด้วย svc เขียนเป็นนิพจน์ปกติ
description:noneไม่มีคำอธิบายเลย ซึ่งคือไดรเวอร์ส่วนใหญ่
description:?คำอธิบายที่ Windows ส่งมาให้ไม่ได้ มักเพราะชี้ไปที่ไฟล์ภาษาที่ไม่อยู่
peruser:templateแม่แบบต่อผู้ใช้ที่ Windows คัดลอกสำหรับแต่ละเซสชันที่ลงชื่อเข้าใช้
+
+
+
+
+ +
+
+

ทุกฟิลด์

+

สร้างจากโปรแกรมเอง ตารางนี้จึงไม่มีทางห่างจากสิ่งที่เครื่องมือยอมรับ ฟิลด์ที่ไม่มีรายการค่าจะรับข้อความ ตัวเลข หรือขนาด คอลัมน์ที่สามบอกว่าอย่างไหน

+ {{table:query-fields}} +
+
+ +
+
+

สองเรื่องที่ควรรู้

+
+
+

บางฟิลด์แพง และการถามถึงมันจะเปิดการอ่าน

+

ลายเซ็นใช้เวลาหลายวินาทีทั้งเครื่อง และหน่วยความจำเป็นการวัดไม่ใช่การตั้งค่า จึงไม่อ่านทั้งสองสำหรับรายชื่อเว้นแต่จะขอ คิวรีที่กล่าวถึงอย่างใดอย่างหนึ่งจะเปิดการอ่านนั้นเอง คุณไม่ต้องจำ --signatures เพิ่มจาก signed:no ในหน้าต่าง คิวรีเกี่ยวกับลายเซ็นจะบอกว่าคำตอบยังไม่ครบจนกว่าลายเซ็นจะมาถึง แทนที่จะแสดงรายชื่อที่สั้นลงราวกับเป็นคำตอบ

+
+
+

ผลลัพธ์ที่ตัดสินจากสิ่งที่อ่านไม่ได้จะบอกไว้

+

ถ้ารายการถูกตัดสินจากฟิลด์ที่เซสชันนี้อ่านไม่ได้ ผลลัพธ์จะมีบรรทัดบอกว่ากี่รายการ เพราะผลลัพธ์แบบนั้นอาจขาดรายการหรือมีรายการที่ไม่ควรอยู่ นั่นคือกฎเดียวกับที่ทั้งเครื่องมือยึดถือ การอ่านที่ไม่สำเร็จมองเห็นได้ในคำตอบ ไม่เคยถูกกลืนหาย ผู้เผยแพร่ได้รับการปฏิบัติแบบเดียวกันเมื่อมีเพียงใบรับรองที่อ้างมัน ข้างคำตัดสินใดที่ไม่ใช่ trusted ชื่อจะแสดงเป็น not verified และ publisher: นับรายการนั้นว่าไม่แน่ใจในบรรทัดของตัวเอง ดังนั้น !publisher:microsoft จึงเก็บไฟล์ Microsoft ที่มีคนเปลี่ยนหลังลงลายเซ็นไว้

+
+
+ เอกสารอ้างอิงบรรทัดคำสั่ง +
+
diff --git a/site/pages/sc-exe-and-powershell/ar.html b/site/pages/sc-exe-and-powershell/ar.html new file mode 100644 index 0000000..2bf67ab --- /dev/null +++ b/site/pages/sc-exe-and-powershell/ar.html @@ -0,0 +1,97 @@ + + + + + +
+
+ دليل +

sc.exe وGet-Service، وهذه الأداة

+

كلاهما موجود على الجهاز أصلًا، وكلاهما سيبقى نافعًا. وهذه الصفحة عن المكان الذي يتوقفان عنده، وهي تقول بوضوح أين يظلان الجواب الأفضل.

+
+
+ +
+
+

أين يتوقف كل منهما

+
+
+

sc.exe

+

يصل إلى كل ما يعرفه مدير التحكم بالخدمات تقريبًا، ولا يخبرك بشيء عن كيف تسأل. وصيغته من التسعينيات: sc config X start= auto، حيث المسافة بعد علامة المساواة إلزامية وغيابها فشل صامت في فعل ما قصدته.

+

يجيب عن عنصر واحد في كل مرة. لا تصفية، ولا مخرجات يستطيع سكربت تحليلها دون كتابة محلل، ولا معاينة: الأمر sc stop إما أن ينجح أو يعيد رقمًا.

+
+
+

Get-Service وأوامر *-Service

+

كائنات حقيقية، وأنبوب معالجة، ونظرة سطحية. ففي Windows PowerShell 5.1، وهو الذي يأتي مع Windows، لا يعرض Get-Service الحساب الذي تعمل به الخدمة ولا وصفها. أما PowerShell 7 فيعرض الاثنين، ومسار التشغيل أيضًا، ويُثبَّت بشكل منفصل.

+

الخيار Stop-Service -Force يعني «حتى لو كان شيء يعتمد عليها»: فهو يوقف الخدمات التابعة، ويخبرك بعد ذلك لا قبله.

+
+
+
+
+ +
+
+

الأسئلة نفسها، بثلاث طرق

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
السؤالبما هو موجود على الجهازهنا
ما الذي يجب أن يعمل ولا يعملGet-Service | Where-Object { $_.StartType -eq 'Automatic' -and $_.Status -ne 'Running' }bws list --query "start:auto !status:running"
أي الخدمات لها ملف تنفيذي غير موقّعاقرأ كل مسار تشغيل، وحلّه، واستدعِ Get-AuthenticodeSignature على كل واحد: سكربت، لا أمرbws list --query "signed:no"
ما الذي سيسقط إن أوقفت هذهsc enumdepend X، ثم اقرأ القائمة وقرّر بنفسكbws stop X --dry-run --dependents، وهي الخطة التي ستُنفَّذ
ما الذي تغيّر منذ الأسبوع الماضيلا شيء، إلا إن كتبت المُجمِّع بنفسكbws snapshot diff before.json --live
من غيّر نوع بدء التشغيل، ومتىGet-WinEvent -FilterHashtable @{ LogName = 'System'; Id = 7040 }، ثم اقرأ رسالة كل حدثbws history Spooler، وسطره الأول يقول إلى أي مدى يمتد السجل إلى الوراء
مخرجات يقرؤها الجهازكائنات من PowerShell، ونص من sc.exeالخيار --json في كل أمر، على الإخراج القياسي، والتحذيرات على الخطأ القياسي
+
+

حيثما اختلفت هذه الأداة عن sc.exe بشأن خدمة فذلك خلل هنا. فجزء من مجموعة الاختبارات يشغّل الاثنين على الجهاز الذي يعمل عليه ويقارن بينهما عنصرًا عنصرًا، والفرق بين الاثنين هو أنفع شيء يمكن وضعه في بلاغ.

+
+
+ +
+
+

متى تواصل استخدام ما عندك

+
    +
  • أنت على جهاز ستلمسه مرة واحدة. كلاهما موجود أصلًا ولا شيء يحتاج إلى المرور عبر سياسة.
  • +
  • تحتاج إلى تغيير الحساب أو مسار التشغيل أو إجراءات الاسترداد. يفعل sc.exe الثلاثة. أما هذه الأداة فتعرض الحساب ومسار التشغيل ولا تغيّر أيًّا منهما، وتقرأ إجراءات الاسترداد فقط لتحذّر قبل أن تنهي عملية.
  • +
  • تحتاج إلى إنشاء خدمة أو حذفها. sc create وsc delete. ليس هنا، عن قصد.
  • +
  • أنت غارق أصلًا في أنبوب PowerShell. يعود bws list --json كائنات عبر ConvertFrom-Json، فينضم إلى الأنبوب بدل أن يحل محله.
  • +
+
+
+ +
+
+

معًا، لا بدلًا

+

الأداة التي تجيب عن ما الخطب في هذا الجهاز والأدوات التي تغيّر إعدادًا واحدًا ليست الأداة نفسها. اسأل السؤال هنا، واقرأ الخطة هنا، واستخدم ما تشاء لتنفيذها: فالخطة تطبع سطر الأوامر الذي يطلب الشيء نفسه، وهذا السطر مصمّم لكي يُنسخ.

+ +
+
diff --git a/site/pages/sc-exe-and-powershell/hi.html b/site/pages/sc-exe-and-powershell/hi.html new file mode 100644 index 0000000..57b2e0c --- /dev/null +++ b/site/pages/sc-exe-and-powershell/hi.html @@ -0,0 +1,97 @@ + + + + + +
+
+ गाइड +

sc.exe, Get-Service, और यह

+

दोनों मशीन पर पहले से हैं, और दोनों काम के बने रहेंगे। यह पृष्ठ इस बारे में है कि वे कहाँ रुक जाते हैं, और यह साफ़ कहता है कि वे कहाँ अब भी बेहतर जवाब हैं।

+
+
+ +
+
+

हर एक कहाँ रुकता है

+
+
+

sc.exe

+

सेवा नियंत्रण प्रबंधक जो कुछ भी जानता है, लगभग उस सब तक यह पहुँच सकता है, और पूछने का तरीका क्या है इसके बारे में यह आपको कुछ नहीं बताता। सिंटैक्स नब्बे के दशक का है: sc config X start= auto, जहाँ बराबर के चिह्न के बाद का रिक्त स्थान अनिवार्य है और उसका न होना वह करने में चुपचाप विफल होना है जो आपका मतलब था।

+

यह एक बार में एक प्रविष्टि के बारे में जवाब देता है। कोई फ़िल्टरिंग नहीं, ऐसा कोई आउटपुट नहीं जिसे स्क्रिप्ट बिना पार्सर लिखे पार्स कर सके, और कोई पूर्वावलोकन नहीं: sc stop या तो काम करता है या एक नंबर लौटाता है।

+
+
+

Get-Service और *-Service cmdlet

+

असली ऑब्जेक्ट, एक पाइपलाइन, और एक उथला दृश्य। Windows PowerShell 5.1 में, जो Windows के साथ आता है, Get-Service यह नहीं दिखाता कि सेवा किस खाते से चलती है, न उसका विवरण। PowerShell 7 दोनों दिखाता है, और लॉन्च पथ भी, और वह अलग से इंस्टॉल होता है।

+

Stop-Service -Force का मतलब है “भले ही कुछ उस पर निर्भर हो”: यह निर्भर सेवाओं को रोक देता है, और आपको बाद में बताता है, पहले नहीं।

+
+
+
+
+ +
+
+

वही सवाल, तीन तरीकों से

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
सवालमशीन पर जो है उसके साथयहाँ
क्या चलना चाहिए और नहीं चल रहाGet-Service | Where-Object { $_.StartType -eq 'Automatic' -and $_.Status -ne 'Running' }bws list --query "start:auto !status:running"
किन सेवाओं की निष्पादन योग्य फ़ाइल पर हस्ताक्षर नहीं हैहर लॉन्च पथ पढ़ें, उसे हल करें, हर एक पर Get-AuthenticodeSignature चलाएँ: एक स्क्रिप्ट, कमांड नहींbws list --query "signed:no"
इसे रोकने से क्या बंद होगाsc enumdepend X, फिर सूची पढ़ें और खुद तय करेंbws stop X --dry-run --dependents, यानी वह योजना जो चलेगी
पिछले हफ़्ते से क्या बदलाकुछ नहीं, जब तक आपने कलेक्टर खुद न लिखा होbws snapshot diff before.json --live
स्टार्टअप प्रकार किसने और कब बदलाGet-WinEvent -FilterHashtable @{ LogName = 'System'; Id = 7040 }, फिर हर इवेंट का संदेश पढ़ेंbws history Spooler, जिसकी पहली पंक्ति बताती है कि लॉग कितना पीछे तक जाता है
मशीन-पठनीय आउटपुटPowerShell से ऑब्जेक्ट, sc.exe से पाठहर कमांड पर --json, स्टैंडर्ड आउटपुट पर, चेतावनियाँ स्टैंडर्ड एरर पर
+
+

जहाँ यह टूल किसी सेवा के बारे में sc.exe से असहमत हो, वहाँ यहाँ बग है। टेस्ट सूट का एक हिस्सा दोनों को उसी मशीन पर चलाकर प्रविष्टि-दर-प्रविष्टि तुलना करता है, और दोनों के बीच का अंतर वह सबसे उपयोगी चीज़ है जो इश्यू में डाली जा सकती है।

+
+
+ +
+
+

जो आपके पास है उसे कब इस्तेमाल करते रहें

+
    +
  • आप ऐसी मशीन पर हैं जिसे एक बार छुएँगे। दोनों पहले से वहाँ हैं और किसी नीति से कुछ पार नहीं कराना।
  • +
  • आपको खाता, लॉन्च पथ या रिकवरी क्रियाएँ बदलनी हैं। sc.exe तीनों करता है। यह टूल खाता और लॉन्च पथ दिखाता है और दोनों में से कुछ नहीं बदलता, और रिकवरी क्रियाएँ सिर्फ़ इसलिए पढ़ता है कि प्रक्रिया खत्म करने से पहले चेतावनी दे सके।
  • +
  • आपको सेवा बनानी या हटानी है। sc create और sc delete। यहाँ नहीं, जानबूझकर।
  • +
  • आप पहले से किसी PowerShell पाइपलाइन में गहरे हैं। bws list --json ConvertFrom-Json के ज़रिए ऑब्जेक्ट के रूप में आता है, इसलिए यह पाइपलाइन की जगह लेने के बजाय उसमें जुड़ जाता है।
  • +
+
+
+ +
+
+

साथ में, उसके बजाय नहीं

+

वह टूल जो जवाब देता है कि इस मशीन में क्या गड़बड़ है और वे टूल जो एक सेटिंग बदलते हैं, एक ही टूल नहीं हैं। सवाल यहाँ पूछें, योजना यहाँ पढ़ें, और उसे पूरा करने के लिए जो चाहें इस्तेमाल करें। योजना वह कमांड लाइन छापती है जो यही काम माँगती है, और उस पंक्ति को कॉपी करने के लिए ही बनाया गया है।

+ +
+
diff --git a/site/pages/sc-exe-and-powershell/th.html b/site/pages/sc-exe-and-powershell/th.html new file mode 100644 index 0000000..1b43a36 --- /dev/null +++ b/site/pages/sc-exe-and-powershell/th.html @@ -0,0 +1,97 @@ + + + + + +
+
+ คู่มือ +

sc.exe, Get-Service และเครื่องมือนี้

+

ทั้งสองอยู่บนเครื่องอยู่แล้ว และทั้งสองจะยังมีประโยชน์ต่อไป หน้านี้เกี่ยวกับที่ที่พวกมันหยุด และบอกตรงๆ ว่าที่ไหนที่พวกมันยังเป็นคำตอบที่ดีกว่า

+
+
+ +
+
+

แต่ละตัวหยุดที่ไหน

+
+
+

sc.exe

+

มันเข้าถึงเกือบทุกอย่างที่ service control manager รู้ และไม่บอกอะไรคุณเลยว่าจะถามอย่างไร ไวยากรณ์มาจากยุค 90 sc config X start= auto ที่ช่องว่างหลังเครื่องหมายเท่ากับเป็นข้อบังคับ และการไม่มีมันคือความล้มเหลวเงียบๆ ที่จะทำสิ่งที่คุณหมายถึง

+

มันตอบทีละรายการ ไม่มีการกรอง ไม่มีผลลัพธ์ที่สคริปต์แยกวิเคราะห์ได้โดยไม่ต้องเขียนตัวแยกวิเคราะห์ และไม่มีตัวอย่าง: sc stop ทำงานได้หรือไม่ก็คืนตัวเลข

+
+
+

Get-Service และ cmdlet *-Service

+

อ็อบเจกต์จริง ไปป์ไลน์ และมุมมองที่ตื้น ใน Windows PowerShell 5.1 ตัวที่มากับ Windows Get-Service ไม่แสดงบัญชีที่บริการใช้รันหรือคำอธิบาย PowerShell 7 แสดงทั้งสอง และพาธการเปิดใช้งานด้วย และต้องติดตั้งแยกต่างหาก

+

Stop-Service -Force หมายถึง “แม้ว่าจะมีบางอย่างขึ้นอยู่กับมัน” มันหยุดรายการที่ขึ้นอยู่กับมัน และบอกคุณหลังจากนั้นไม่ใช่ก่อน

+
+
+
+
+ +
+
+

คำถามเดียวกัน สามวิธี

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
คำถามด้วยสิ่งที่มีบนเครื่องที่นี่
อะไรที่ควรทำงานแต่ไม่ได้ทำงานGet-Service | Where-Object { $_.StartType -eq 'Automatic' -and $_.Status -ne 'Running' }bws list --query "start:auto !status:running"
บริการไหนมีไฟล์ปฏิบัติการที่ไม่มีลายเซ็นอ่านพาธการเปิดใช้งานแต่ละอัน แปลงมัน เรียก Get-AuthenticodeSignature กับแต่ละอัน นั่นคือสคริปต์ ไม่ใช่คำสั่งbws list --query "signed:no"
การหยุดตัวนี้จะพาอะไรไปด้วยsc enumdepend X แล้วอ่านรายการและตัดสินใจเองbws stop X --dry-run --dependents ซึ่งคือแผนที่จะรัน
อะไรเปลี่ยนตั้งแต่สัปดาห์ที่แล้วไม่มี เว้นแต่คุณเขียนตัวเก็บข้อมูลเองbws snapshot diff before.json --live
ใครเปลี่ยนประเภทการเริ่มต้น และเมื่อไรGet-WinEvent -FilterHashtable @{ LogName = 'System'; Id = 7040 } แล้วอ่านข้อความของแต่ละเหตุการณ์bws history Spooler ซึ่งบรรทัดแรกบอกว่า log ย้อนไปไกลแค่ไหน
ผลลัพธ์ที่เครื่องอ่านได้อ็อบเจกต์จาก PowerShell ข้อความจาก sc.exe--json ในทุกคำสั่ง ที่ standard output โดยมีคำเตือนที่ standard error
+
+

เมื่อเครื่องมือนี้ไม่ตรงกับ sc.exe เรื่องบริการใดบริการหนึ่ง นั่นคือบั๊กที่นี่ ส่วนหนึ่งของชุดทดสอบรันทั้งสองกับเครื่องที่มันอยู่และเปรียบเทียบทีละรายการ และความต่างระหว่างสองอย่างคือสิ่งที่มีประโยชน์ที่สุดอย่างเดียวที่ควรใส่ใน issue

+
+
+ +
+
+

เมื่อไรควรใช้สิ่งที่คุณมีต่อไป

+
    +
  • คุณอยู่บนเครื่องที่คุณจะแตะครั้งเดียว ทั้งสองอยู่ที่นั่นแล้วและไม่ต้องผ่านนโยบายใดๆ
  • +
  • คุณต้องเปลี่ยนบัญชี พาธการเปิดใช้งาน หรือการดำเนินการกู้คืน sc.exe ทำทั้งสามอย่าง เครื่องมือนี้แสดงบัญชีและพาธการเปิดใช้งานและไม่เปลี่ยนทั้งสองอย่าง และอ่านการดำเนินการกู้คืนเพียงเพื่อเตือนก่อนจะจบกระบวนการ
  • +
  • คุณต้องสร้างหรือลบบริการ sc create และ sc delete ไม่มีที่นี่ โดยตั้งใจ
  • +
  • คุณอยู่ลึกในไปป์ไลน์ PowerShell แล้ว bws list --json กลับมาเป็นอ็อบเจกต์ผ่าน ConvertFrom-Json จึงเข้าร่วมไปป์ไลน์แทนที่จะแทนที่มัน
  • +
+
+
+ +
+
+

ใช้ร่วมกัน ไม่ใช่แทนที่

+

เครื่องมือที่ตอบ เครื่องนี้มีอะไรผิด กับเครื่องมือที่เปลี่ยนการตั้งค่าหนึ่งอย่างไม่ใช่เครื่องมือเดียวกัน ถามคำถามที่นี่ อ่านแผนที่นี่ และใช้อะไรก็ได้ที่คุณชอบเพื่อทำตามแผน แผนพิมพ์บรรทัดคำสั่งที่ขอสิ่งเดียวกัน และบรรทัดนั้นตั้งใจให้คัดลอก

+ +
+
diff --git a/site/pages/services-msc-alternative/ar.html b/site/pages/services-msc-alternative/ar.html new file mode 100644 index 0000000..70abde7 --- /dev/null +++ b/site/pages/services-msc-alternative/ar.html @@ -0,0 +1,102 @@ + + + + + +
+
+ دليل +

بديل للأداة services.msc

+

لم تتغير أداة Services snap-in تقريبًا منذ Windows 2000. وهي ما زالت أسرع طريقة لبدء خدمة واحدة تراها على الشاشة، وأبطأ طريقة للإجابة عن أي سؤال بشأن جهاز.

+
+
+ +
+
+

ما الذي يدفع الناس إلى البحث

+
+
    +
  • لا بحث. التنقل الوحيد هو كتابة حرف للقفز إلى أول اسم معروض يبدأ به. وعلى جهاز فيه 800 عنصر يكون هذا تمريرًا بخطوات زائدة.
  • +
  • لا تصفية. لا توجد طريقة لتسأل ما المضبوط على البدء التلقائي ولا يعمل، وهو السؤال الوحيد الذي يكشف جهازًا معطوبًا.
  • +
  • صف واحد في كل مرة. إعادة تشغيل 12 خدمة تعني 12 نقرة يمينية و12 انتظارًا.
  • +
  • «Stopping...» بلا مخرج إلا Task Manager وتخمين أي svchost يجب إنهاؤه.
  • +
+
    +
  • لا سجل تاريخي. لا أحد يعرف من ضبط نوع بدء التشغيل على Disabled، أو متى، أو هل كان كذلك الشهر الماضي.
  • +
  • بيانات مخفية. العملية والمشغّلات والامتيازات المطلوبة، وكذلك security descriptor، ومن وقّع الملف التنفيذي: لا شيء من ذلك في snap-in، وكله مهم عندما يكون هناك خلل.
  • +
  • الأعمدة لا تتغير. Name, description, status, start type, log on as. هذه القائمة كلها، ولا يمكن ترتيب أي منها ترتيبًا مفيدًا على جهاز حقيقي.
  • +
+
+
+
+ +
+
+

المهام نفسها، في الاثنين

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ما تريد فعلهفي services.mscهنا
إيجاد ما يجب أن يعمل ولا يعملرتّب بنوع بدء التشغيل، ومرّر، واقرأ كل صفstart:auto !status:running
معرفة ما يسقط مع الإيقافمربع حوار يسمّي الخدمات التابعة بعد أن تضغط Stopخطة قبل أن يحدث أي شيء، فيها كل خدمة تابعة خطوة وتحذير حين يكون أحدها مما يحتاجه الجهاز
معرفة ما تغيّر منذ الأسبوع الماضيلا شيءbws snapshot diff before.json --live
معرفة من غيّر نوع بدء التشغيللا شيءbws history Spooler، من سجل System
إعادة تشغيل 12 خدمة12 نقرة يمينيةحدّد 12، خطة واحدة، تشغيل واحد، تقرير واحد
معرفة من وقّع الملف التنفيذي لخدمةلا يُعرضعمود، وشيء يمكن البحث به: signed:no
أتمتة أي من هذالا يمكن برمجتهbws، مع --json ورمز خروج لكل نهاية
+
+
+
+ +
+
+

ما يفعله snap-in أفضل حتى الآن

+

شيئان، والادعاء بغير ذلك هو من النوع الذي لا يقوله هذا المشروع.

+
    +
  • هو موجود على الجهاز أصلًا. لا شيء يُنزَّل، ولا شيء يحتاج إلى المرور عبر سياسة برمجيات. وعلى جهاز ستلمسه مرة واحدة، هذه هي الحجة كلها.
  • +
  • يحرّر إجراءات الاسترداد والحساب ومسار التشغيل. أما هذه الأداة فتعرض الحساب ومسار التشغيل ولا تغيّر أيًّا منهما، وتقرأ إجراءات الاسترداد فقط لتحذّر قبل أن تنهي عملية. وإنشاء خدمة أو حذفها أو إعادة توجيهها ليس هنا أيضًا.
  • +
+

وما لا يستطيعه إطلاقًا هو سبب وجود هذه الأداة: أن تطرح سؤالًا، وتعرض خطة أولًا، وتخبرك بما انحرف.

+
+
+ +
+
+

ما هذه الأداة

+

{{product}} مجاني ومفتوح المصدر بموجب GPL-3.0، ملف واحد لكل نصف أو برنامج تثبيت للجهاز كله، ولا يتصل بالإنترنت أبدًا. والقراءة لا تحتاج إلى صلاحيات المسؤول. أما التغيير فيحتاج إليها، ويقول ذلك بدل أن يفشل بصمت.

+ +
+
diff --git a/site/pages/services-msc-alternative/cs.html b/site/pages/services-msc-alternative/cs.html index f5f5e26..12c9437 100644 --- a/site/pages/services-msc-alternative/cs.html +++ b/site/pages/services-msc-alternative/cs.html @@ -1,7 +1,7 @@ - +
diff --git a/site/pages/services-msc-alternative/de.html b/site/pages/services-msc-alternative/de.html index 7240d65..3097f75 100644 --- a/site/pages/services-msc-alternative/de.html +++ b/site/pages/services-msc-alternative/de.html @@ -1,7 +1,7 @@ - +
@@ -32,7 +32,7 @@

Was Leute dazu bringt, sich umzusehen

-

Dieselben drei Aufgaben, in beiden

+

Dieselben Aufgaben, in beiden

diff --git a/site/pages/services-msc-alternative/en.html b/site/pages/services-msc-alternative/en.html index 9c5e73f..677a35f 100644 --- a/site/pages/services-msc-alternative/en.html +++ b/site/pages/services-msc-alternative/en.html @@ -31,7 +31,7 @@

What sends people looking

-

The same three tasks, in both

+

The same tasks, in both

Sie wollenIn services.mscHier
diff --git a/site/pages/services-msc-alternative/es.html b/site/pages/services-msc-alternative/es.html index 85128f8..67e559d 100644 --- a/site/pages/services-msc-alternative/es.html +++ b/site/pages/services-msc-alternative/es.html @@ -1,7 +1,7 @@ - +
@@ -32,7 +32,7 @@

Lo que lleva a la gente a buscar otra cosa

-

Las mismas tres tareas, en ambos

+

Las mismas tareas, en ambos

You want toIn services.mscHere
diff --git a/site/pages/services-msc-alternative/fr.html b/site/pages/services-msc-alternative/fr.html index fda01f5..99c5ca0 100644 --- a/site/pages/services-msc-alternative/fr.html +++ b/site/pages/services-msc-alternative/fr.html @@ -1,7 +1,7 @@ - +
@@ -32,7 +32,7 @@

Ce qui pousse à chercher ailleurs

-

Les mêmes trois tâches, dans les deux

+

Les mêmes tâches, dans les deux

Usted quiereEn services.mscAquí
diff --git a/site/pages/services-msc-alternative/hi.html b/site/pages/services-msc-alternative/hi.html new file mode 100644 index 0000000..63869e0 --- /dev/null +++ b/site/pages/services-msc-alternative/hi.html @@ -0,0 +1,102 @@ + + + + + +
+
+ गाइड +

services.msc का विकल्प

+

Services snap-in Windows 2000 के बाद से लगभग वैसा ही है। स्क्रीन पर दिख रही किसी एक सेवा को शुरू करने का यह आज भी सबसे तेज़ तरीका है, और मशीन के बारे में किसी भी सवाल का जवाब पाने का सबसे धीमा तरीका।

+
+
+ +
+
+

लोग विकल्प क्यों खोजने लगते हैं

+
+
    +
  • कोई खोज नहीं। नेविगेट करने का एकमात्र तरीका एक अक्षर टाइप करके उस अक्षर से शुरू होने वाले पहले प्रदर्शन नाम पर कूदना है। आठ सौ प्रविष्टियों वाली मशीन पर यह अतिरिक्त चरणों के साथ स्क्रोल करना है।
  • +
  • कोई फ़िल्टरिंग नहीं। यह पूछने का कोई तरीका नहीं कि अपने-आप शुरू होने के लिए क्या सेट है और चल नहीं रहा, यानी वह एक सवाल जो खराब मशीन को खोज निकालता है।
  • +
  • एक बार में एक पंक्ति। बारह सेवाएँ रीस्टार्ट करने का मतलब है बारह राइट-क्लिक और बारह बार इंतज़ार।
  • +
  • “Stopping...” और बाहर निकलने का कोई रास्ता नहीं, सिवा Task Manager के और यह अंदाज़ा लगाने के कि कौन सा svchost खत्म करना है।
  • +
+
    +
  • कोई इतिहास नहीं। कोई नहीं जानता कि उस स्टार्टअप प्रकार को Disabled किसने किया, या कब, या क्या वह पिछले महीने भी ऐसा ही था।
  • +
  • छिपा हुआ डेटा। प्रक्रिया, ट्रिगर, ज़रूरी विशेषाधिकार, security descriptor, निष्पादन योग्य फ़ाइल पर किसने हस्ताक्षर किए, इनमें से कुछ भी snap-in में नहीं है, और कुछ गलत होने पर यह सब मायने रखता है।
  • +
  • कॉलम बदले नहीं जा सकते। Name, description, status, start type, log on as। बस यही पूरी सूची है, और असली मशीन पर इनमें से किसी को भी काम की तरह सॉर्ट नहीं किया जा सकता।
  • +
+
+
+
+ +
+
+

वही काम, दोनों में

+
+
Vous voulezDans services.mscIci
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
आप क्या करना चाहते हैंservices.msc मेंयहाँ
जो चलना चाहिए और नहीं चल रहा उसे ढूँढनास्टार्टअप प्रकार से सॉर्ट करें, स्क्रोल करें, हर पंक्ति पढ़ेंstart:auto !status:running
जानना कि रोकने से साथ में क्या बंद होगाएक डायलॉग जो Stop दबाने के बाद निर्भर सेवाओं के नाम बताता हैकुछ होने से पहले एक योजना, जिसमें हर निर्भर सेवा एक चरण है और जब उनमें से कोई मशीन की ज़रूरत की हो तो चेतावनी
जानना कि पिछले हफ़्ते से क्या बदलाकुछ नहींbws snapshot diff before.json --live
जानना कि स्टार्टअप प्रकार किसने बदलाकुछ नहींbws history Spooler, System लॉग से
बारह सेवाएँ रीस्टार्ट करनाबारह राइट-क्लिकबारह चुनें, एक योजना, एक रन, एक रिपोर्ट
देखना कि सेवा की निष्पादन योग्य फ़ाइल पर किसने हस्ताक्षर किएदिखाया नहीं जाताएक कॉलम, और खोजने की चीज़: signed:no
इनमें से कुछ भी स्क्रिप्ट करनास्क्रिप्ट नहीं किया जा सकताbws, --json और हर अंत के लिए एक एग्ज़िट कोड के साथ
+
+
+
+ +
+
+

snap-in अब भी क्या बेहतर करता है

+

दो चीज़ें, और अन्यथा दिखावा करना उस तरह का दावा होगा जो यह प्रोजेक्ट नहीं करता।

+
    +
  • यह मशीन पर पहले से है। कुछ डाउनलोड नहीं करना, सॉफ़्टवेयर नीति से कुछ पार नहीं कराना। जिस मशीन को आप एक बार छुएँगे, उस पर यही पूरी दलील है।
  • +
  • यह रिकवरी क्रियाएँ, खाता और लॉन्च पथ बदल सकता है। यह टूल खाता और लॉन्च पथ दिखाता है और दोनों में से कुछ नहीं बदलता, और रिकवरी क्रियाएँ सिर्फ़ इसलिए पढ़ता है कि प्रक्रिया खत्म करने से पहले चेतावनी दे सके। सेवा बनाना, हटाना या उसका पथ बदलना भी यहाँ नहीं है।
  • +
+

जो यह बिल्कुल नहीं कर सकता वही इसके होने की वजह है: सवाल पूछना, पहले योजना दिखाना, और बताना कि क्या ड्रिफ्ट हुआ।

+
+
+ +
+
+

यह क्या है

+

{{product}} GPL-3.0 के तहत मुफ़्त और ओपन सोर्स है, हर हिस्से के लिए एक फ़ाइल या पूरी मशीन के लिए इंस्टॉलर, और यह इंटरनेट से कभी संपर्क नहीं करता। पढ़ने के लिए व्यवस्थापक अधिकार नहीं चाहिए। बदलने के लिए चाहिए, और यह चुपचाप विफल होने के बजाय यह कह देता है।

+ +
+
diff --git a/site/pages/services-msc-alternative/id.html b/site/pages/services-msc-alternative/id.html index 7b10ad2..b1e9622 100644 --- a/site/pages/services-msc-alternative/id.html +++ b/site/pages/services-msc-alternative/id.html @@ -1,7 +1,7 @@ - +
diff --git a/site/pages/services-msc-alternative/it.html b/site/pages/services-msc-alternative/it.html index 19b229f..5d3887f 100644 --- a/site/pages/services-msc-alternative/it.html +++ b/site/pages/services-msc-alternative/it.html @@ -1,7 +1,7 @@ - +
@@ -32,7 +32,7 @@

Cosa spinge a cercare altrove

-

Le stesse tre attività, in entrambi

+

Le stesse attività, in entrambi

diff --git a/site/pages/services-msc-alternative/ja.html b/site/pages/services-msc-alternative/ja.html index 4100f8a..7950420 100644 --- a/site/pages/services-msc-alternative/ja.html +++ b/site/pages/services-msc-alternative/ja.html @@ -1,7 +1,7 @@ - +
@@ -32,7 +32,7 @@

人々が代替を探す理由

-

同じ 3 つの作業を、両方で

+

同じ作業を、両方で

VuoleIn services.mscQui
diff --git a/site/pages/services-msc-alternative/ko.html b/site/pages/services-msc-alternative/ko.html index cb72ef4..094c775 100644 --- a/site/pages/services-msc-alternative/ko.html +++ b/site/pages/services-msc-alternative/ko.html @@ -1,7 +1,7 @@ - +
@@ -32,7 +32,7 @@

사람들이 대안을 찾게 만드는 것

-

같은 세 가지 작업을 양쪽에서

+

같은 작업을 양쪽에서

したいことservices.msc ではここでは
diff --git a/site/pages/services-msc-alternative/nl.html b/site/pages/services-msc-alternative/nl.html index 5d1e2de..2e70767 100644 --- a/site/pages/services-msc-alternative/nl.html +++ b/site/pages/services-msc-alternative/nl.html @@ -1,7 +1,7 @@ - +
diff --git a/site/pages/services-msc-alternative/pl.html b/site/pages/services-msc-alternative/pl.html index 06c7cb4..e357e01 100644 --- a/site/pages/services-msc-alternative/pl.html +++ b/site/pages/services-msc-alternative/pl.html @@ -1,7 +1,7 @@ - +
@@ -32,7 +32,7 @@

Co wysyła ludzi na poszukiwania

-

Te same trzy zadania, w obu

+

Te same zadania, w obu

하고 싶은 일services.msc에서여기서
diff --git a/site/pages/services-msc-alternative/pt-br.html b/site/pages/services-msc-alternative/pt-br.html index 2e61412..825fed7 100644 --- a/site/pages/services-msc-alternative/pt-br.html +++ b/site/pages/services-msc-alternative/pt-br.html @@ -1,7 +1,7 @@ - +
@@ -32,7 +32,7 @@

O que leva as pessoas a procurar outra coisa

-

As mesmas três tarefas, nos dois

+

As mesmas tarefas, nos dois

ChceszW services.mscTutaj
diff --git a/site/pages/services-msc-alternative/ro.html b/site/pages/services-msc-alternative/ro.html index 54ad526..971d505 100644 --- a/site/pages/services-msc-alternative/ro.html +++ b/site/pages/services-msc-alternative/ro.html @@ -1,7 +1,7 @@ - +
diff --git a/site/pages/services-msc-alternative/ru.html b/site/pages/services-msc-alternative/ru.html index 606d9d2..45096f6 100644 --- a/site/pages/services-msc-alternative/ru.html +++ b/site/pages/services-msc-alternative/ru.html @@ -1,7 +1,7 @@ - +
diff --git a/site/pages/services-msc-alternative/th.html b/site/pages/services-msc-alternative/th.html new file mode 100644 index 0000000..f48566c --- /dev/null +++ b/site/pages/services-msc-alternative/th.html @@ -0,0 +1,102 @@ + + + + + +
+
+ คู่มือ +

ทางเลือกแทน services.msc

+

สแนปอิน Services แทบไม่เปลี่ยนเลยตั้งแต่ Windows 2000 มันยังเป็นวิธีที่เร็วที่สุดในการเริ่มบริการหนึ่งตัวที่คุณเห็นบนหน้าจออยู่แล้ว และเป็นวิธีที่ช้าที่สุดในการตอบคำถามใดๆ เกี่ยวกับเครื่อง

+
+
+ +
+
+

อะไรทำให้คนไปหาทางเลือก

+
+
    +
  • ไม่มีการค้นหา วิธีนำทางเดียวคือพิมพ์ตัวอักษรเพื่อกระโดดไปที่ชื่อที่แสดงตัวแรกที่ขึ้นต้นด้วยตัวนั้น บนเครื่องที่มี 800 รายการ นั่นคือการเลื่อนที่มีขั้นตอนเพิ่ม
  • +
  • ไม่มีการกรอง ถามไม่ได้ว่า อะไรบ้างที่ตั้งให้เริ่มอัตโนมัติแต่ไม่ได้ทำงาน ซึ่งเป็นคำถามเดียวที่หาเครื่องที่เสียได้
  • +
  • ทีละแถว การรีสตาร์ต 12 บริการคือคลิกขวา 12 ครั้งและรอ 12 รอบ
  • +
  • “Stopping...” ที่ไม่มีทางออก นอกจาก Task Manager และการเดาว่าจะจบ svchost ตัวไหน
  • +
+
    +
  • ไม่มีประวัติ ไม่มีใครรู้ว่าใครตั้งประเภทการเริ่มต้นเป็น Disabled หรือเมื่อไร หรือเป็นแบบนั้นมาตั้งแต่เดือนที่แล้วหรือเปล่า
  • +
  • ข้อมูลที่ซ่อนอยู่ กระบวนการ ทริกเกอร์ สิทธิพิเศษที่ต้องใช้ security descriptor และใครลงลายเซ็นไฟล์ปฏิบัติการ ไม่มีอะไรอยู่ในสแนปอิน และทั้งหมดสำคัญเมื่อมีบางอย่างผิดปกติ
  • +
  • คอลัมน์เปลี่ยนไม่ได้ ชื่อ คำอธิบาย สถานะ ประเภทการเริ่มต้น ล็อกออนเป็น นั่นคือรายการทั้งหมด และไม่มีตัวไหนเรียงลำดับได้อย่างมีประโยชน์บนเครื่องจริง
  • +
+
+
+
+ +
+
+

งานเดียวกัน ในทั้งสองที่

+
+
Você querNo services.mscAqui
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
คุณต้องการใน services.mscที่นี่
หาสิ่งที่ควรทำงานแต่ไม่ได้ทำงานเรียงตามประเภทการเริ่มต้น เลื่อน อ่านทุกแถวstart:auto !status:running
รู้ว่าการหยุดพาอะไรไปด้วยกล่องโต้ตอบที่บอกชื่อรายการที่ขึ้นอยู่กับมันหลังจากคุณกด Stopแผนก่อนจะมีอะไรเกิดขึ้น โดยแต่ละรายการที่ขึ้นอยู่กับมันเป็นหนึ่งขั้นตอน และมีคำเตือนเมื่อหนึ่งในนั้นเป็นสิ่งที่เครื่องต้องใช้
รู้ว่าอะไรเปลี่ยนตั้งแต่สัปดาห์ที่แล้วไม่มีbws snapshot diff before.json --live
รู้ว่าใครเปลี่ยนประเภทการเริ่มต้นไม่มีbws history Spooler จาก System log
รีสตาร์ต 12 บริการคลิกขวา 12 ครั้งเลือก 12 ตัว หนึ่งแผน หนึ่งการรัน หนึ่งรายงาน
ดูว่าใครลงลายเซ็นไฟล์ปฏิบัติการของบริการไม่แสดงเป็นคอลัมน์ และเป็นสิ่งที่ค้นหาได้: signed:no
เขียนสคริปต์ทำสิ่งใดสิ่งหนึ่งในนั้นเขียนสคริปต์ไม่ได้bws พร้อม --json และรหัสออกสำหรับทุกการจบ
+
+
+
+ +
+
+

สิ่งที่สแนปอินยังทำได้ดีกว่า

+

สองอย่าง และการแสร้งว่าไม่ใช่เป็นคำกล่าวประเภทที่โครงการนี้ไม่ทำ

+
    +
  • มันอยู่บนเครื่องอยู่แล้ว ไม่ต้องดาวน์โหลด ไม่ต้องผ่านนโยบายซอฟต์แวร์ บนเครื่องที่คุณจะแตะครั้งเดียว นั่นคือข้อโต้แย้งทั้งหมด
  • +
  • มันแก้ไขการดำเนินการกู้คืน บัญชี และพาธการเปิดใช้งานได้ เครื่องมือนี้แสดงบัญชีและพาธการเปิดใช้งานและไม่เปลี่ยนทั้งสองอย่าง และอ่านการดำเนินการกู้คืนเพียงเพื่อเตือนก่อนจะจบกระบวนการ การสร้าง ลบ หรือชี้บริการใหม่ก็ไม่มีที่นี่เช่นกัน
  • +
+

สิ่งที่มันทำไม่ได้เลยคือเหตุผลที่โปรแกรมนี้มีอยู่: ถามคำถาม แสดงแผนก่อน และบอกว่าอะไรดริฟต์

+
+
+ +
+
+

นี่คืออะไร

+

{{product}} ฟรีและโอเพนซอร์สภายใต้ GPL-3.0 หนึ่งไฟล์ต่อหนึ่งส่วน หรือตัวติดตั้งสำหรับทั้งเครื่อง และไม่เชื่อมต่ออินเทอร์เน็ตเลย การอ่านไม่ต้องใช้สิทธิ์ผู้ดูแลระบบ การเปลี่ยนแปลงต้องใช้ และมันบอกเรื่องนี้แทนที่จะล้มเหลวเงียบๆ

+ +
+
diff --git a/site/pages/services-msc-alternative/tr.html b/site/pages/services-msc-alternative/tr.html index 436e87e..468e058 100644 --- a/site/pages/services-msc-alternative/tr.html +++ b/site/pages/services-msc-alternative/tr.html @@ -1,7 +1,7 @@ - +
diff --git a/site/pages/services-msc-alternative/uk.html b/site/pages/services-msc-alternative/uk.html index 3786006..498db54 100644 --- a/site/pages/services-msc-alternative/uk.html +++ b/site/pages/services-msc-alternative/uk.html @@ -1,7 +1,7 @@ - +
@@ -32,7 +32,7 @@

Що змушує людей шукати

-

Ті самі три завдання в обох

+

Ті самі завдання в обох

diff --git a/site/pages/services-msc-alternative/vi.html b/site/pages/services-msc-alternative/vi.html index 8e16172..a492051 100644 --- a/site/pages/services-msc-alternative/vi.html +++ b/site/pages/services-msc-alternative/vi.html @@ -1,7 +1,7 @@ - +
diff --git a/site/pages/services-msc-alternative/zh-hans.html b/site/pages/services-msc-alternative/zh-hans.html index 0816ab8..f003618 100644 --- a/site/pages/services-msc-alternative/zh-hans.html +++ b/site/pages/services-msc-alternative/zh-hans.html @@ -1,7 +1,7 @@ - +
@@ -32,7 +32,7 @@

是什么促使人们去寻找

-

同样三项任务,在两者中

+

同样的任务,在两者中

Ви хочетеУ services.mscТут
diff --git a/site/pages/services-msc-alternative/zh-hant.html b/site/pages/services-msc-alternative/zh-hant.html index 73f2ef8..8e3c108 100644 --- a/site/pages/services-msc-alternative/zh-hant.html +++ b/site/pages/services-msc-alternative/zh-hant.html @@ -1,7 +1,7 @@ - +
@@ -32,7 +32,7 @@

是什麼促使人們去尋找

-

同樣三項任務,在兩者中

+

同樣的任務,在兩者中

你想要在 services.msc 中在这里
diff --git a/site/pages/snapshots-and-drift/ar.html b/site/pages/snapshots-and-drift/ar.html new file mode 100644 index 0000000..390aba9 --- /dev/null +++ b/site/pages/snapshots-and-drift/ar.html @@ -0,0 +1,65 @@ + + + + + +
+
+ الجزء الذي لم يفعله services.msc قط +

اللقطات والانحراف

+

كل أداة أخرى تخبرك كيف يبدو الجهاز الآن. أما السؤال الذي يطرحه المسؤول فعلًا فهو ما الذي يختلف عما كان عليه حين كان يعمل، ولا شيء في Windows الأصلي يجيب عنه.

+
+
+ +
+
+

ما الذي تحمله اللقطة

+

الجهاز كله في لحظة واحدة: كل خدمة وبرنامج تشغيل، مع نوع بدء التشغيل والحساب ومسار التشغيل ووسائطه، وقيمة التجزئة للملف الذي يشغّله وموقّعه، وتبعياته وما يعتمد عليه، ومشغّلاته، وامتيازاته المطلوبة، ونوع SID الخاص به، وكذلك security descriptor، إضافةً إلى اسم الجهاز والحساب الذي أخذها وهل كان ذلك الحساب مسؤولًا.

+
bws snapshot create before.json --note "before the patch"
+

هي JSON بحقل واحد في كل سطر. وهذا مقصود: فهو يعني أن اللقطة تدخل مستودعًا ويقرؤها git diff، فلا تكون مقارنة الأداة نفسها هي الطريقة الوحيدة للنظر في واحدة.

+

احفظها بما هي عليه. اللقطة تصف الجهاز كله، حتى كل مسار تشغيل وكل security descriptor. وتُكتب بأي أذونات يحملها مجلدها أصلًا، والأداة لا تضيّق شيئًا، فالمجلد الذي يستطيع آخرون قراءته يستطيعون أن يقرؤوا فيه كل ذلك.

+
+
+ +
+
+

ثم اسأل عما يختلف

+
$ bws snapshot diff before.json --live --exit-code
+Changed (2):
+  Spooler  Print Spooler
+    startType: Manual -> Automatic
+    status: Stopped -> Running  (running state, not configuration)
+  wlidsvc  Microsoft Account Sign-in Assistant
+    status: Stopped -> Running  (running state, not configuration)
+
+Added 0, removed 0, changed 2. Fields differing: 1 in configuration, 2 in running state.
+
+
    +
  • يُبلَّغ عن التكوين وحالة التشغيل كلٌّ على حدة. لقطتان بينهما يوم تختلفان فيما يعمل مصادفةً، وليس أغلب ذلك انحرافًا. فإذا اختلطا ضاع السطر الوحيد المهم، وهو نوع بدء تشغيل غيّره أحدهم، تحت أربعين سطرًا لا تهم.
  • +
  • ما تعذرت مقارنته يُسرد ولا يُخفى. الحقل الذي لم تقرأه إحدى اللقطتين قط، لأن تلك الجلسة لم تكن تملك صلاحية قراءته، يظهر على أنه لم تتم مقارنته تحت عنصره، ويحسب الملخص تلك العناصر. فالمقارنة التي تقول لم يتغير شيء تعني أنه لم يتغير شيء فيما استطاع الطرفان رؤيته.
  • +
+
    +
  • مقارنة لقطة مأخوذة بصلاحيات مرتفعة بأخرى دونها ستكذب، فتبلّغ عن عناصر محذوفة لم يحذفها أحد. وكل ملف يسجّل هل كان الحساب الذي أخذه مسؤولًا، وتقول المقارنة ذلك.
  • +
  • ملفان، لا ملف وهذا الجهاز فقط. خذ واحدة على بيئة التجهيز وأخرى على بيئة الإنتاج وقارن بينهما في أي مكان: فالجواب عن لماذا تختلف بيئة التجهيز لا يحتاج إلى حضور أي من الجهازين.
  • +
+
+

وتفعل النافذة الشيء نفسه تحت Audit.... الأمر Take snapshot... يكتب الملف نفسه، مع ملاحظة إن كتبت واحدة، والأمر Compare with this machine... أو Compare two snapshots... يعرض ما تغيّر بدل القائمة، صفًا لكل حقل، وكل ما يجعل المقارنة غير تامة الدقة مذكور فوق الجدول. وShow يضيّقها إلى الفروق أو إلى حقل واحد، وExport... يكتبها في ملف CSV.

+
+
+ +
+
+

رمز الخروج هو المقصود

+

الخيار --exit-code ينتهي بالرمز 5 عندما يختلف التكوين: عنصر أُضيف أو أُزيل، أو عنصر مضبوط بشكل مختلف. والخدمة التي توقفت أو بدأت من تلقاء نفسها يُبلَّغ عنها ولا تُحتسب، وكذلك النسخ الخاصة بكل مستخدم التي ينشئها Windows لكل جلسة مسجَّل دخولها، فهذه تُترك وتُعدّ. وهذا ليس فشلًا: فالانحراف هو ما صُنعت هذه الأداة لإيجاده، وإيجاده ليس فشلًا، ولذلك له رقم خاص به بدل أن يستعير الرقم الذي يعني أن شيئًا ساء.

+
# يوم يدخل الجهاز الخدمة
+bws snapshot create C:\baselines\web01.json --note "after the build"
+
+# كل ليلة، من مهمة مجدولة
+bws snapshot diff C:\baselines\web01.json --live --exit-code --json > C:\logs\drift.json
+#   0 - لا انحراف في التكوين
+#   5 - انحرف التكوين، ويقول drift.json ما الذي حدث
+#   3 - عمل ولم يستطع قراءة كل شيء، فالجواب جزئي
+

هذه هي الآلية كلها: خط أساس يؤخذ والجهاز سليم معروف، وسؤال يُطرح كل ليلة. وفي أول ليلة يجيب فيها 5 يعرف أحدهم في تلك الليلة نفسها لا في صباح يتعطل فيه شيء.

+ استخدام هذا في التدقيق +
+
diff --git a/site/pages/snapshots-and-drift/hi.html b/site/pages/snapshots-and-drift/hi.html new file mode 100644 index 0000000..134b9c1 --- /dev/null +++ b/site/pages/snapshots-and-drift/hi.html @@ -0,0 +1,65 @@ + + + + + +
+
+ वह हिस्सा जो services.msc ने कभी नहीं किया +

स्नैपशॉट और ड्रिफ्ट

+

हर दूसरा टूल बताता है कि मशीन अभी कैसी दिखती है। एक व्यवस्थापक का असली सवाल है जब यह काम करती थी तब से अब क्या अलग है, और स्टॉक Windows पर कुछ भी इसका जवाब नहीं देता।

+
+
+ +
+
+

स्नैपशॉट में क्या होता है

+

एक पल में पूरी मशीन: हर सेवा और ड्राइवर, उसके स्टार्टअप प्रकार, खाते, लॉन्च पथ और आर्ग्युमेंट, उस फ़ाइल के हैश और हस्ताक्षरकर्ता जिसे वह चलाता है, उसकी निर्भरताओं और जो उस पर निर्भर है, उसके ट्रिगर, उसके ज़रूरी विशेषाधिकार, उसके SID प्रकार और उसके security descriptor के साथ, और मशीन का नाम, उसे लेने वाला खाता, और क्या वह खाता व्यवस्थापक था।

+
bws snapshot create before.json --note "before the patch"
+

यह JSON है जिसमें हर पंक्ति में एक फ़ील्ड है। यह जानबूझकर है: इसका मतलब है कि स्नैपशॉट रिपॉज़िटरी में रखा जा सकता है और git diff उसे पढ़ लेता है, इसलिए टूल की अपनी तुलना उसे देखने का अकेला तरीका नहीं है।

+

इसे वैसे रखें जो यह है। स्नैपशॉट पूरी मशीन का वर्णन करता है, हर लॉन्च पथ और security descriptor तक। यह उन्हीं अनुमतियों के साथ लिखा जाता है जो उसकी डायरेक्टरी में पहले से हैं, और टूल कुछ भी सीमित नहीं करता, इसलिए जिस डायरेक्टरी को दूसरे लोग पढ़ सकते हैं, उसमें वे यह सब पढ़ सकते हैं।

+
+
+ +
+
+

फिर पूछें कि क्या अलग है

+
$ bws snapshot diff before.json --live --exit-code
+Changed (2):
+  Spooler  Print Spooler
+    startType: Manual -> Automatic
+    status: Stopped -> Running  (running state, not configuration)
+  wlidsvc  Microsoft Account Sign-in Assistant
+    status: Stopped -> Running  (running state, not configuration)
+
+Added 0, removed 0, changed 2. Fields differing: 1 in configuration, 2 in running state.
+
+
    +
  • कॉन्फ़िगरेशन और चलने की स्थिति अलग-अलग बताई जाती हैं। एक दिन के अंतर से लिए गए दो स्नैपशॉट इसमें अलग होते हैं कि क्या चल रहा है, और उसमें से लगभग कुछ भी ड्रिफ्ट नहीं होता। सब मिला दें तो वह एक पंक्ति जो मायने रखती है, यानी किसी का बदला हुआ स्टार्टअप प्रकार, उन चालीस के नीचे दब जाती है जो मायने नहीं रखतीं।
  • +
  • जिसकी तुलना नहीं हो सकी वह सूचीबद्ध है, छिपा नहीं। जो फ़ील्ड दोनों में से किसी एक स्नैपशॉट ने कभी पढ़ा ही नहीं, क्योंकि उस सत्र के पास उसके अधिकार नहीं थे, वह अपनी प्रविष्टि के नीचे तुलना नहीं की गई के रूप में सामने आता है, और सारांश उन प्रविष्टियों को गिनता है। इसलिए जो diff कुछ नहीं बदला कहता है उसका मतलब है कि जो दोनों पक्ष देख सके उसमें कुछ नहीं बदला।
  • +
+
    +
  • उन्नत अधिकारों वाले स्नैपशॉट की बिना अधिकारों वाले से तुलना झूठ बोलती, ऐसी प्रविष्टियाँ हटाई हुई बताती जिन्हें किसी ने हटाया नहीं। हर फ़ाइल दर्ज करती है कि उसे लेने वाला खाता व्यवस्थापक था या नहीं, और तुलना यह बता देती है।
  • +
  • दो फ़ाइलें, सिर्फ़ फ़ाइल और यह मशीन नहीं। स्टेजिंग पर एक लें और प्रोडक्शन पर एक और उनकी तुलना कहीं भी करें। स्टेजिंग अलग क्यों है का जवाब पाने के लिए किसी भी मशीन का मौजूद होना ज़रूरी नहीं।
  • +
+
+

विंडो यही काम Audit... के तहत करती है। Take snapshot... वही फ़ाइल लिखता है, एक नोट के साथ अगर आप टाइप करें, और Compare with this machine... या Compare two snapshots... सूची की जगह दिखाता है कि क्या बदला, हर फ़ील्ड के लिए एक पंक्ति, और वह सब जो तुलना को पूरी तरह सटीक होने से रोकता है तालिका के ऊपर कहा गया होता है। Show उसे अंतरों तक या एक फ़ील्ड तक सीमित करता है, और Export... उसे CSV फ़ाइल में लिखता है।

+
+
+ +
+
+

एग्ज़िट कोड ही असली बात है

+

--exit-code कॉन्फ़िगरेशन अलग होने पर 5 के साथ खत्म होता है, यानी कोई प्रविष्टि जुड़ी या हटी हो, या किसी का सेटअप अलग हो। जो सेवा अपने आप सिर्फ़ रुकी या शुरू हुई उसकी रिपोर्ट होती है पर वह गिनी नहीं जाती, और Windows हर साइन-इन किए गए सत्र के लिए जो प्रति-उपयोगकर्ता प्रतियाँ बनाता है वे भी नहीं गिनी जातीं, उन्हें छोड़ दिया जाता है और गिना जाता है। यह विफलता नहीं है, क्योंकि ड्रिफ्ट वही है जिसे ढूँढने के लिए यह टूल बना है और उसे ढूँढना विफलता नहीं है, इसीलिए इसका अपना एक नंबर है, उस नंबर से उधार नहीं लिया गया जिसका मतलब है कि कुछ गलत हुआ।

+
# जिस दिन मशीन सेवा में जाती है
+bws snapshot create C:\baselines\web01.json --note "after the build"
+
+# हर रात, शेड्यूल किए गए टास्क से
+bws snapshot diff C:\baselines\web01.json --live --exit-code --json > C:\logs\drift.json
+#   0 - कोई कॉन्फ़िगरेशन ड्रिफ्ट नहीं
+#   5 - कॉन्फ़िगरेशन ड्रिफ्ट हुआ, और drift.json बताता है कि क्या
+#   3 - यह चला और सब कुछ नहीं पढ़ सका, इसलिए जवाब आंशिक है
+

यही पूरी व्यवस्था है: मशीन के ठीक होने पर ली गई एक बेसलाइन, और हर रात पूछा गया एक सवाल। जिस पहली रात यह 5 जवाब देता है, किसी को उसी रात पता चल जाता है, उस सुबह नहीं जब कुछ टूटता है।

+ इसे ऑडिट के लिए इस्तेमाल करना +
+
diff --git a/site/pages/snapshots-and-drift/th.html b/site/pages/snapshots-and-drift/th.html new file mode 100644 index 0000000..e49d9ba --- /dev/null +++ b/site/pages/snapshots-and-drift/th.html @@ -0,0 +1,65 @@ + + + + + +
+
+ สิ่งที่ services.msc ไม่เคยทำ +

สแนปช็อตและดริฟต์

+

เครื่องมืออื่นทุกตัวบอกแค่ว่าเครื่องหน้าตาเป็นอย่างไรตอนนี้ คำถามที่ผู้ดูแลระบบมีจริงๆ คือ ต่างจากตอนที่มันยังใช้งานได้อย่างไร และไม่มีอะไรบน Windows แบบปกติตอบได้

+
+
+ +
+
+

สแนปช็อตเก็บอะไรไว้

+

เครื่องทั้งเครื่อง ณ ช่วงเวลาหนึ่ง ทุกบริการและไดรเวอร์ พร้อมประเภทการเริ่มต้น บัญชี พาธการเปิดใช้งานและอาร์กิวเมนต์ แฮชและผู้ลงลายเซ็นของไฟล์ที่มันรัน การพึ่งพาและสิ่งที่ขึ้นอยู่กับมัน ทริกเกอร์ สิทธิพิเศษที่ต้องใช้ ประเภท SID และ security descriptor บวกชื่อเครื่อง บัญชีที่สร้างมัน และบัญชีนั้นเป็นผู้ดูแลระบบหรือไม่

+
bws snapshot create before.json --note "before the patch"
+

เป็น JSON ที่มีหนึ่งฟิลด์ต่อบรรทัด นี่ตั้งใจ: หมายความว่าสแนปช็อตเก็บในรีโพซิทอรีได้และ git diff อ่านได้ ดังนั้นการเปรียบเทียบในตัวเครื่องมือไม่ใช่วิธีเดียวที่จะดูมัน

+

เก็บมันตามสิ่งที่มันเป็น สแนปช็อตอธิบายทั้งเครื่อง ลงไปถึงทุกพาธการเปิดใช้งานและ security descriptor มันถูกเขียนด้วยสิทธิ์ที่ไดเรกทอรีมีอยู่แล้ว และเครื่องมือไม่จำกัดอะไรให้แคบลง ไดเรกทอรีที่คนอื่นอ่านได้จึงเป็นที่ที่พวกเขาอ่านทั้งหมดนั้นได้

+
+
+ +
+
+

แล้วถามว่าต่างอย่างไร

+
$ bws snapshot diff before.json --live --exit-code
+Changed (2):
+  Spooler  Print Spooler
+    startType: Manual -> Automatic
+    status: Stopped -> Running  (running state, not configuration)
+  wlidsvc  Microsoft Account Sign-in Assistant
+    status: Stopped -> Running  (running state, not configuration)
+
+Added 0, removed 0, changed 2. Fields differing: 1 in configuration, 2 in running state.
+
+
    +
  • การกำหนดค่าและสถานะการทำงานรายงานแยกกัน สแนปช็อตสองชุดที่ห่างกันหนึ่งวันต่างกันตรงสิ่งที่บังเอิญทำงานอยู่ และแทบไม่มีส่วนไหนเป็นดริฟต์ ถ้าปนกัน บรรทัดเดียวที่สำคัญ คือประเภทการเริ่มต้นที่ใครสักคนเปลี่ยน จะจมอยู่ใต้อีกสี่สิบบรรทัดที่ไม่สำคัญ
  • +
  • สิ่งที่เปรียบเทียบไม่ได้จะถูกแสดงไว้ ไม่ถูกซ่อน ฟิลด์ที่สแนปช็อตหนึ่งในสองชุดไม่เคยอ่าน เพราะเซสชันนั้นไม่มีสิทธิ์ จะแสดงเป็น not compared ใต้รายการนั้น และสรุปนับรายการเหล่านั้น ดังนั้น diff ที่บอกว่า ไม่มีอะไรเปลี่ยน หมายถึงไม่มีอะไรเปลี่ยนในสิ่งที่ทั้งสองฝั่งมองเห็น
  • +
+
    +
  • สแนปช็อตที่ยกระดับสิทธิ์เทียบกับอันที่ไม่ยกระดับจะโกหก โดยรายงานรายการว่าถูกลบทั้งที่ไม่มีใครลบ แต่ละไฟล์บันทึกว่าบัญชีที่สร้างมันเป็นผู้ดูแลระบบหรือไม่ และการเปรียบเทียบบอกเรื่องนี้
  • +
  • สองไฟล์ ไม่ใช่แค่ไฟล์กับเครื่องนี้ สร้างหนึ่งชุดบนสเตจจิงและหนึ่งชุดบนโปรดักชันแล้ว diff กันที่ไหนก็ได้ คำตอบของ ทำไมสเตจจิงต่างออกไป ไม่ต้องมีเครื่องไหนอยู่ตรงนั้น
  • +
+
+

หน้าต่างทำสิ่งเดียวกันภายใต้ Audit... Take snapshot... เขียนไฟล์แบบเดียวกัน พร้อมหมายเหตุถ้าคุณพิมพ์ และ Compare with this machine... หรือ Compare two snapshots... แสดงสิ่งที่เปลี่ยนแทนรายชื่อ หนึ่งแถวต่อฟิลด์ โดยทุกสิ่งที่ทำให้การเปรียบเทียบไม่แม่นยำเต็มที่จะบอกไว้เหนือตาราง Show จำกัดให้เหลือเฉพาะความต่างหรือฟิลด์เดียว และ Export... เขียนลงไฟล์ CSV

+
+
+ +
+
+

รหัสออกคือประเด็น

+

--exit-code จบด้วย 5 เมื่อการกำหนดค่าต่างกัน มีรายการที่ถูกเพิ่มหรือลบ หรือรายการหนึ่งตั้งค่าต่างไป บริการที่แค่หยุดหรือเริ่มเองจะถูกรายงานและไม่นับ สำเนาต่อผู้ใช้ที่ Windows สร้างสำหรับแต่ละเซสชันที่ลงชื่อเข้าใช้ก็ไม่นับ โดยถูกละไว้และนับจำนวน ไม่ใช่ความล้มเหลว ดริฟต์คือสิ่งที่เครื่องมือนี้มีไว้หา และการพบมันไม่ใช่ความล้มเหลว นั่นคือเหตุผลที่มันมีหมายเลขของตัวเอง แทนที่จะยืมหมายเลขที่หมายถึงมีบางอย่างผิดพลาด

+
# วันที่เครื่องเข้าสู่การใช้งาน
+bws snapshot create C:\baselines\web01.json --note "after the build"
+
+# ทุกคืน จากงานตามกำหนดเวลา
+bws snapshot diff C:\baselines\web01.json --live --exit-code --json > C:\logs\drift.json
+#   0 - ไม่มีดริฟต์ของการกำหนดค่า
+#   5 - การกำหนดค่าดริฟต์ และ drift.json บอกว่าอะไร
+#   3 - รันแล้วแต่อ่านไม่ได้ทั้งหมด คำตอบจึงไม่ครบ
+

นั่นคือกลไกทั้งหมด: เส้นฐานที่สร้างเมื่อเครื่องรู้ว่าดี และคำถามที่ถามทุกคืน ถ้าคืนแรกมันตอบ 5 จะมีคนรู้ในคืนแรก ไม่ใช่ในเช้าวันที่บางอย่างพัง

+ ใช้สิ่งนี้เพื่อการตรวจสอบ +
+
diff --git a/site/pages/stop-a-service-that-will-not-stop/ar.html b/site/pages/stop-a-service-that-will-not-stop/ar.html new file mode 100644 index 0000000..2377610 --- /dev/null +++ b/site/pages/stop-a-service-that-will-not-stop/ar.html @@ -0,0 +1,68 @@ + + + + + +
+
+ دليل +

خدمة عالقة على Stopping...

+

يعرض snap-in كلمة Stopping ولا يتحرك. والجواب المعتاد هو Task Manager، وتخمين أي svchost.exe تعيش فيه، ثم End task، وهذا ينهي كل خدمة أخرى في تلك العملية أيضًا، دون أن يخبرك أيها كانت.

+
+
+ +
+
+

لماذا يحدث هذا

+
    +
  • الخدمة لا تردّ على طلب الإيقاف. يطلب منها Windows بلطف وينتظر. والخدمة التي تعطلت، أو التي تنتظر شيئًا لن يعود، لا تردّ أبدًا.
  • +
  • شيء يعتمد عليها ما زال يعمل. يرفض المدير الإيقاف بدل أن يكسر الآخر، ويعرض snap-in ذلك على أنه انتظار.
  • +
  • تشارك عمليتها مع غيرها. تعيش معظم خدمات Windows داخل svchost.exe مشترك. وإنهاء تلك العملية ينهيها كلها، وهذا بالضبط ما يفعله Task Manager دون أن يسمّيها.
  • +
+
+
+ +
+
+

انظر قبل أن تنهي أي شيء

+

اسأل ما الذي سيذهب معها إن أُنهيت. لا يحدث شيء حتى تحذف --dry-run.

+
$ bws kill Spooler --dry-run
+

تسمّي المعاينة العملية برقمها، وتسمّي كل خدمة أخرى تعيش فيها، وتعرض خطوتين بدل واحدة: اطلب من الخدمة أن تتوقف، وفقط إذا لم ينجح ذلك أنهِ العملية. والخدمة التي تتوقف من تلقاء نفسها لا تُنهى أبدًا.

+
+
    +
  • الخيار --force يتخطى الخطوة المهذبة وينهي العملية فورًا. وهو يغيّر الخطة لا طريقة تشغيلها، فتعرض المعاينة خطوة واحدة بدل اثنتين ويظهر الفرق قبل أن يحدث أي شيء.
  • +
  • الخيار --restart يعيد كل شيء بعد ذهاب العملية: العنصر الذي سألت عنه وكل ما كان يشاركها عمليتها. وبدونه يُترك الجهاز وتلك الخدمات متوقفة، ويقول التقرير كيف تبدؤها من جديد.
  • +
+
    +
  • الرفض يسبق الزر. برنامج تشغيل، أو عملية يحميها النظام، أو خدمة لا يقبل المدير طلب إيقافها: يُرفض ذلك عند بناء الخطة مع بيان السبب، لا بعد انتظار ستين ثانية.
  • +
  • تحذير حين يهم الأمر. إذا كان العنصر مما لا يعمل الجهاز بدونه فإن الخطة تقول ذلك: إيقافه يُسقط الجهاز لا الخدمة وحدها.
  • +
+
+

إنهاء عملية هو الشيء الوحيد الذي تفعله هذه الأداة ولا يستطيع أحد رفضه نيابةً عن الجهاز. ولهذا هو أمر قائم بذاته، ولهذا تسمّي المعاينة كل خدمة تأخذها معها، ولهذا تأتي الخطوة المهذبة أولًا ما لم تقل غير ذلك.

+
+
+ +
+
+

الترتيب الأكثر أمانًا

+
    +
  1. انظر ما هي. bws show Spooler: العملية، وما يعتمد عليها، وما تعتمد عليه، وهل تقبل طلبات الإيقاف أصلًا.
  2. +
  3. جرّب الإيقاف العادي خطةً. bws stop Spooler --dry-run --dependents. فإن كان الجواب رفضًا فهو يقول أيّ الأسباب الثلاثة هو.
  4. +
  5. إن لم تتوقف فانظر كم يكلّف إنهاؤها. bws kill Spooler --dry-run، واقرأ قائمة الخدمات التي تشارك تلك العملية.
  6. +
  7. ثم افعل، مع طريق للعودة. bws kill Spooler --restart. وينتهي التقرير بما لم ينجح والأوامر التي تعيد الأشياء.
  8. +
+

وتعمل الأربع بالطريقة نفسها في النافذة: انقر بزر الفأرة الأيمن على صف، واختر Force stop...، واقرأ الخطة، والزر تحتها مسمّى بما سيفعله.

+
+
+ +
+
+

لماذا لا نستخدم Task Manager ببساطة

+

لأنه يجيب عن سؤال مختلف. يعرف Task Manager العمليات وهذه المشكلة عن الخدمات، والاثنتان لا تتطابقان واحدة بواحدة.

+

قد يضم svchost.exe المشترك اثنتي عشرة خدمة. وسينهيه Task Manager دون أن يقول أي اثنتي عشرة، ولا تعود أي منها من تلقاء نفسها، ولا شيء بعد ذلك يخبرك بما توقف. وبرنامج EDR الذي ينبّه إلى عملية تُنهي svchost.exe يؤدي عمله، ولا يستطيع أن يميّز نقرتك عن أي شيء آخر.

+ +
+
diff --git a/site/pages/stop-a-service-that-will-not-stop/hi.html b/site/pages/stop-a-service-that-will-not-stop/hi.html new file mode 100644 index 0000000..309929b --- /dev/null +++ b/site/pages/stop-a-service-that-will-not-stop/hi.html @@ -0,0 +1,68 @@ + + + + + +
+
+ गाइड +

Stopping... पर अटकी सेवा

+

Snap-in Stopping दिखाता है और हिलता नहीं। आम जवाब है Task Manager, इस अंदाज़े से कि वह किस svchost.exe में है, और End task, जो उस प्रक्रिया की हर दूसरी सेवा को भी खत्म कर देता है, बिना यह बताए कि वे कौन सी थीं।

+
+
+ +
+
+

ऐसा क्यों होता है

+
    +
  • सेवा रोकने के अनुरोध का जवाब नहीं दे रही। Windows उससे विनम्रता से कहता है और इंतज़ार करता है। जो सेवा हैंग हो गई है, या ऐसी चीज़ का इंतज़ार कर रही है जो लौटकर नहीं आएगी, वह कभी जवाब नहीं देती।
  • +
  • कुछ ऐसा अभी चल रहा है जो उस पर निर्भर है। प्रबंधक दूसरी सेवा को तोड़ने के बजाय रोकने से मना कर देता है, और snap-in उसे इंतज़ार के रूप में दिखाता है।
  • +
  • यह अपनी प्रक्रिया दूसरों के साथ साझा करती है। ज़्यादातर Windows सेवाएँ साझा svchost.exe के अंदर रहती हैं। उस प्रक्रिया को खत्म करना उन सबको खत्म करना है, और Task Manager ठीक यही करता है, उनके नाम बताए बिना।
  • +
+
+
+ +
+
+

कुछ भी खत्म करने से पहले देखें

+

पूछें कि उसे खत्म करने से साथ में क्या जाएगा। जब तक आप --dry-run नहीं हटाते, कुछ नहीं होता।

+
$ bws kill Spooler --dry-run
+

पूर्वावलोकन प्रक्रिया को नंबर से नाम देता है, उसमें रहने वाली हर दूसरी सेवा का नाम बताता है, और एक के बजाय दो चरण दिखाता है: सेवा से रुकने को कहें, और सिर्फ़ तब जब वह काम न करे, प्रक्रिया खत्म करें। जो सेवा अपने आप रुक जाती है उसे कभी खत्म नहीं किया जाता।

+
+
    +
  • --force विनम्र चरण छोड़ देता है और प्रक्रिया तुरंत खत्म कर देता है। यह योजना को बदलता है, उसके चलने को नहीं, इसलिए पूर्वावलोकन में दो के बजाय एक चरण दिखता है और अंतर कुछ होने से पहले ही दिख जाता है।
  • +
  • --restart सब कुछ वापस ले आता है जब प्रक्रिया चली जाती है: वह प्रविष्टि जिसके बारे में आपने पूछा और वह सब जो उसकी प्रक्रिया साझा करता था। इसके बिना मशीन उन सेवाओं के रुके हुए रहने के साथ छूट जाती है, और रिपोर्ट बताती है कि उन्हें दोबारा कैसे शुरू करें।
  • +
+
    +
  • इनकार बटन से पहले आता है। ड्राइवर, सिस्टम द्वारा सुरक्षित प्रक्रिया, ऐसी सेवा जिसे बंद करने का अनुरोध प्रबंधक स्वीकार नहीं करता: योजना बनते समय ही कारण के साथ मना कर दिया जाता है, साठ सेकंड के इंतज़ार के बाद नहीं।
  • +
  • जब मायने रखता है तब चेतावनी। अगर प्रविष्टि ऐसी है जिसके बिना मशीन काम नहीं करती, तो योजना यह कहती है: इसे रोकने से मशीन बंद हो जाती है, सिर्फ़ सेवा नहीं।
  • +
+
+

प्रक्रिया खत्म करना इस टूल की वह अकेली चीज़ है जिसे मशीन की ओर से कोई मना नहीं कर सकता। इसीलिए यह अपना अलग कमांड है, इसीलिए पूर्वावलोकन उसके साथ जाने वाली हर सेवा का नाम बताता है, और इसीलिए जब तक आप कुछ और न कहें विनम्र चरण पहले आता है।

+
+
+ +
+
+

ज़्यादा सुरक्षित क्रम

+
    +
  1. देखें कि यह क्या है। bws show Spooler: प्रक्रिया, उस पर क्या निर्भर है, वह किस पर निर्भर है, और क्या वह रोकने के अनुरोध स्वीकार भी करती है।
  2. +
  3. सामान्य रोक को योजना के रूप में आज़माएँ। bws stop Spooler --dry-run --dependents। अगर जवाब इनकार है, तो वह बताता है कि तीन कारणों में से कौन सा है।
  4. +
  5. अगर वह नहीं रुकती, तो देखें कि उसे खत्म करने की क्या कीमत है। bws kill Spooler --dry-run, और उस प्रक्रिया को साझा करने वाली सेवाओं की सूची पढ़ें।
  6. +
  7. फिर करें, वापसी के रास्ते के साथ। bws kill Spooler --restart। रिपोर्ट इस पर खत्म होती है कि क्या काम नहीं किया और वे कमांड जो चीज़ों को वापस रखते हैं।
  8. +
+

चारों विंडो में उसी तरह काम करते हैं: किसी पंक्ति पर राइट-क्लिक करें, Force stop... चुनें, योजना पढ़ें, और उसके नीचे का बटन उसी के नाम पर है जो वह करेगा।

+
+
+ +
+
+

सीधे Task Manager क्यों न इस्तेमाल करें

+

क्योंकि वह एक अलग सवाल का जवाब देता है। Task Manager प्रक्रियाओं के बारे में जानता है और यह समस्या सेवाओं की है, और दोनों एक-से-एक नहीं मिलतीं।

+

एक साझा svchost.exe में एक दर्जन सेवाएँ हो सकती हैं। Task Manager उसे खत्म कर देगा बिना बताए कि कौन सी बारह, उनमें से कोई अपने आप वापस नहीं आती, और बाद में कुछ भी नहीं बताता कि क्या रुका। जो EDR svchost.exe को खत्म करने वाली प्रक्रिया को चिह्नित करता है वह अपना काम कर रहा है, और वह आपके क्लिक को किसी और चीज़ से अलग नहीं पहचान सकता।

+ +
+
diff --git a/site/pages/stop-a-service-that-will-not-stop/th.html b/site/pages/stop-a-service-that-will-not-stop/th.html new file mode 100644 index 0000000..2bb8b17 --- /dev/null +++ b/site/pages/stop-a-service-that-will-not-stop/th.html @@ -0,0 +1,68 @@ + + + + + +
+
+ คู่มือ +

บริการที่ค้างที่ Stopping...

+

สแนปอินแสดง Stopping แล้วไม่ขยับอีก คำตอบปกติคือ Task Manager การเดาว่ามันอยู่ใน svchost.exe ตัวไหน และ End task ซึ่งจบทุกบริการอื่นในกระบวนการนั้นด้วยโดยไม่บอกคุณว่าตัวไหนบ้าง

+
+
+ +
+
+

ทำไมจึงเกิด

+
    +
  • บริการไม่ตอบคำขอหยุด Windows ขอดีๆ แล้วรอ บริการที่ค้าง หรือกำลังรอบางอย่างที่จะไม่กลับมา จะไม่มีวันตอบ
  • +
  • มีบางอย่างที่ขึ้นอยู่กับมันยังทำงานอยู่ ตัวจัดการปฏิเสธการหยุดแทนที่จะทำให้อีกตัวพัง และสแนปอินแสดงเรื่องนี้เป็นการรอ
  • +
  • มันใช้กระบวนการร่วมกับตัวอื่น บริการ Windows ส่วนใหญ่อยู่ภายใน svchost.exe ที่ใช้ร่วมกัน การจบกระบวนการนั้นจบทั้งหมดของพวกมัน ซึ่งเป็นสิ่งที่ Task Manager ทำโดยไม่บอกชื่อ
  • +
+
+
+ +
+
+

ดูก่อนจะจบอะไร

+

ถามว่าการจบมันจะพาอะไรไปด้วย ไม่มีอะไรเกิดขึ้นจนกว่าคุณจะเอา --dry-run ออก

+
$ bws kill Spooler --dry-run
+

ตัวอย่างระบุกระบวนการด้วยหมายเลข บอกชื่อทุกบริการอื่นที่อยู่ในนั้น และแสดงสองขั้นตอนแทนที่จะเป็นหนึ่ง: ขอให้บริการหยุด และเฉพาะเมื่อวิธีนั้นไม่ได้ผล จบกระบวนการ บริการที่หยุดเองได้จะไม่ถูกจบ

+
+
    +
  • --force ข้ามขั้นตอนที่สุภาพ และจบกระบวนการทันที มันเปลี่ยนแผนไม่ใช่การรันแผน ตัวอย่างจึงแสดงหนึ่งขั้นตอนแทนที่จะเป็นสอง และเห็นความต่างได้ก่อนจะมีอะไรเกิดขึ้น
  • +
  • --restart นำทุกอย่างกลับมา เมื่อกระบวนการหายไป รายการที่คุณถามถึงและทุกอย่างที่ใช้กระบวนการร่วมกัน ถ้าไม่มี เครื่องจะเหลือบริการเหล่านั้นที่หยุดอยู่ และรายงานบอกวิธีเริ่มมันอีกครั้ง
  • +
+
    +
  • การปฏิเสธมาก่อนปุ่ม ไดรเวอร์ กระบวนการที่ระบบป้องกัน บริการที่ตัวจัดการไม่ยอมรับคำขอหยุด จะถูกปฏิเสธตั้งแต่สร้างแผนพร้อมเหตุผล ไม่ใช่หลังรอ 60 วินาที
  • +
  • คำเตือนเมื่อสำคัญ ถ้ารายการนั้นเป็นสิ่งที่เครื่องทำงานไม่ได้ถ้าไม่มี แผนจะบอกไว้ การหยุดมันทำให้ทั้งเครื่องล้ม ไม่ใช่แค่บริการ
  • +
+
+

การจบกระบวนการเป็นสิ่งเดียวที่เครื่องมือนี้ทำซึ่งไม่มีใครปฏิเสธแทนเครื่องได้ นั่นคือเหตุผลที่มันเป็นคำสั่งของตัวเอง เหตุผลที่ตัวอย่างบอกชื่อทุกบริการที่มันพาไปด้วย และเหตุผลที่ขั้นตอนที่สุภาพมาก่อนเสมอเว้นแต่คุณบอกเป็นอย่างอื่น

+
+
+ +
+
+

ลำดับที่ปลอดภัยกว่า

+
    +
  1. ดูว่ามันคืออะไร bws show Spooler กระบวนการ สิ่งที่ขึ้นอยู่กับมัน สิ่งที่มันขึ้นอยู่กับ และมันรับคำขอหยุดหรือไม่
  2. +
  3. ลองการหยุดธรรมดา ในรูปแบบแผน bws stop Spooler --dry-run --dependents ถ้าคำตอบคือการปฏิเสธ มันบอกว่าเป็นหนึ่งในสามเหตุผลข้อไหน
  4. +
  5. ถ้ามันหยุดไม่ลง ดูว่าการจบมันมีราคาเท่าไร bws kill Spooler --dry-run และอ่านรายชื่อบริการที่ใช้กระบวนการนั้นร่วมกัน
  6. +
  7. แล้วลงมือ พร้อมทางกลับ bws kill Spooler --restart รายงานจบด้วยสิ่งที่ไม่สำเร็จและคำสั่งที่นำสิ่งต่างๆ กลับคืน
  8. +
+

ทั้งสี่ขั้นทำงานแบบเดียวกันในหน้าต่าง: คลิกขวาที่แถว เลือก Force stop... อ่านแผน และปุ่มใต้แผนตั้งชื่อตามสิ่งที่มันจะทำ

+
+
+ +
+
+

ทำไมไม่ใช้ Task Manager

+

เพราะมันตอบคำถามอื่น Task Manager รู้เรื่องกระบวนการ และปัญหานี้เกี่ยวกับบริการ ซึ่งสองอย่างนี้ไม่ตรงกันแบบหนึ่งต่อหนึ่ง

+

svchost.exe ที่ใช้ร่วมกันหนึ่งตัวรองรับบริการได้เป็นโหล Task Manager จะจบมันโดยไม่บอกว่า 12 ตัวไหน ไม่มีตัวไหนกลับมาเอง และไม่มีอะไรหลังจากนั้นบอกคุณว่าอะไรหยุด EDR ที่แจ้งเตือนกระบวนการที่จบ svchost.exe กำลังทำหน้าที่ของมัน และมันแยกการคลิกของคุณออกจากอย่างอื่นไม่ได้

+ +
+
diff --git a/site/pages/what-should-be-running/ar.html b/site/pages/what-should-be-running/ar.html new file mode 100644 index 0000000..3193ba2 --- /dev/null +++ b/site/pages/what-should-be-running/ar.html @@ -0,0 +1,86 @@ + + + + + +
+
+ دليل +

ما الخدمات التي يجب أن تعمل؟

+

الجواب الصريح أن أحدًا لا يستطيع إخبارك، وكل قائمة تدّعي ذلك تصف جهازًا ليس جهازك. أما ما يمكن الإجابة عنه فأضيق وأنفع بكثير: ما الذي لا يستقيم على هذا الجهاز، وما الذي يختلف عما كان عليه حين كان يعمل.

+
+
+ +
+
+

لماذا لا جواب عن السؤال العام

+
    +
  • المجموعة تختلف باختلاف إصدار Windows ونسخته ودوره. وحدة التحكم بالمجال والحاسوب المحمول ومضيف الحاويات تختلف في كل شيء تقريبًا، والقائمة المكتوبة لواحد خاطئة للبقية.
  • +
  • نصف ما هو مثبّت ليس من Windows. برامج التشغيل والوكلاء وخدمات التحديث وخوادم الترخيص: كل واحد منها وضعه شيء ما هناك، ولا قائمة عامة تعرف ما هو.
  • +
  • معظم الخدمات مقصود أن تكون متوقفة. يبدأ Windows الحديث جزءًا صغيرًا مما يسجّله: والباقي ينتظر مشغّلًا، كوصول جهاز أو فتح منفذ أو الانضمام إلى مجال، والتوقف هو حالته الصحيحة.
  • +
  • قوائم «عطّل هذه لتحسين الأداء» هي طريقة تعطّل الأجهزة. فالخدمة التي تبدو خاملة هي التي يبدؤها شيء آخر عند الطلب، ويظهر العطل بعد أسبوع في مكان لا علاقة له.
  • +
+
+
+ +
+
+

الأسئلة التي لها جواب

+
+
+

ما يجب أن يعمل ولا يعمل

+

start:auto !status:running

+

طُلب من Windows بدء هذه ولا تعمل. على جهاز سليم تكون قائمة قصيرة: عنصران يبدآن متأخرين ثم يتوقفان. وأي شيء آخر يستحق النظر.

+
+
+

ما هو معطّل ويعمل مع ذلك

+

mismatch:running

+

التكوين والحالة لا يتفقان. وعادةً عطّله أحدهم دون أن يوقفه، وستكون إعادة التشغيل التالية مفاجأة.

+
+
+

ما يشير إلى ملف اختفى

+

file:missing

+

إزالة تثبيت تركت التسجيل خلفها. ولا ضرر منها حتى يحاول شيء بدء تشغيلها، وهي دليل على ما كان موجودًا على هذا الجهاز.

+
+
+

ما لم يوقّعه أحد

+

signed:no peruser:no

+

ليس دليلًا على شيء بحد ذاته، وهو المكان الصحيح لبدء القراءة. والشرط الثاني يُسقط العائلات الخاصة بكل مستخدم، التي تملأ القائمة بما يكاد يتطابق.

+
+
+

ما يطلب أقوى الامتيازات

+

privilege:SeDebugPrivilege

+

امتياز يتيح لعملية فتح أي عملية أخرى. وتطلبه حفنة من الخدمات المشروعة، ومن المفيد أن تعرف أيها على جهازك.

+
+
+

ما ينتظر مشغّلًا

+

trigger:any status:stopped

+

متوقفة لأن شيئًا لم يطلبها بعد، لا لأن شيئًا خاطئ. ومعرفة أيها هذه هي ما يجعل القائمة الأولى غير مفزعة.

+
+
+
+
+ +
+
+

الأفضل من كل ما سبق

+

اسأل الجهاز نفسه، حين كان يعمل.

+

خذ لقطة يوم يدخل الجهاز الخدمة. عندها يتحول هل ينبغي أن يعمل هذا إلى هل كان هذا يعمل حين كان كل شيء يعمل، وهو سؤال عن جهازك لا عن جهاز في مقال.

+
bws snapshot create C:\baselines\web01.json --note "after the build"
+# ... بعد أسبوع، أو تحديث، أو حادثة
+bws snapshot diff C:\baselines\web01.json --live
+

يُبلَّغ عن التكوين منفصلًا عن حالة التشغيل، فلا يكون الجواب أربعين خدمة تعمل مصادفةً، بل نوع بدء التشغيل الذي غيّره أحدهم.

+ تدقيق جهاز بحثًا عن الانحراف +
+
+ +
+
+

قبل أن توقف أي شيء

+

كل إيقاف في هذه الأداة يعرض خطته أولًا: الخطوات، وما يسقط معها، وتحذيرًا حين تكون إحداها مما لا يعمل الجهاز بدونه. وقائمة هذه قائمة أولية من سبع: مكوّنا RPC ومشغّل DCOM، ومدير الحسابات، وعزل المفاتيح، ومدير الجلسات، والتوصيل والتشغيل. وسطح المكتب البعيد ليس فيها، فإن كنت تعمل عبر جلسة بعيدة فاقرأ الخطة.

+ +
+
diff --git a/site/pages/what-should-be-running/hi.html b/site/pages/what-should-be-running/hi.html new file mode 100644 index 0000000..83bd35b --- /dev/null +++ b/site/pages/what-should-be-running/hi.html @@ -0,0 +1,86 @@ + + + + + +
+
+ गाइड +

कौन सी सेवाएँ चलनी चाहिए?

+

ईमानदार जवाब यह है कि कोई नहीं बता सकता, और जो भी सूची ऐसा दावा करती है वह ऐसी मशीन का वर्णन कर रही है जो आपकी नहीं है। जिसका जवाब दिया जा सकता है वह ज़्यादा संकरा और कहीं ज़्यादा उपयोगी है: इस मशीन पर क्या मेल नहीं खाता, और जब यह काम करती थी तब से क्या अलग है।

+
+
+ +
+
+

सामान्य सवाल का जवाब क्यों नहीं है

+
    +
  • सेट Windows के संस्करण, वर्ज़न और भूमिका के अनुसार अलग होता है। डोमेन कंट्रोलर, लैपटॉप और कंटेनर होस्ट लगभग हर चीज़ पर असहमत होते हैं, और एक के लिए लिखी गई सूची बाकियों के लिए गलत है।
  • +
  • जो इंस्टॉल है उसका आधा Windows का नहीं है। ड्राइवर, एजेंट, अपडेट सेवाएँ, लाइसेंस डेमन: इनमें से हर एक को किसी चीज़ ने वहाँ रखा, और कोई सामान्य सूची नहीं जानती कि किसने।
  • +
  • ज़्यादातर सेवाओं का रुका रहना ही अपेक्षित है। आधुनिक Windows जितना रजिस्टर करता है उसका एक छोटा हिस्सा ही शुरू करता है: बाकी किसी ट्रिगर का इंतज़ार करती हैं, जैसे डिवाइस का आना, पोर्ट का खुलना, डोमेन से जुड़ना, और रुका होना उनकी सही स्थिति है।
  • +
  • “परफ़ॉर्मेंस के लिए इन्हें disable करें” वाली सूचियों से ही मशीनें टूटती हैं। जो सेवा निष्क्रिय दिखती है वही वह है जिसे कोई और चीज़ माँग पर शुरू करती है, और विफलता एक हफ़्ते बाद किसी असंबंधित जगह दिखती है।
  • +
+
+
+ +
+
+

वे सवाल जिनके जवाब हैं

+
+
+

जो चालू होना चाहिए और नहीं है

+

start:auto !status:running

+

Windows को इन्हें शुरू करने को कहा गया था और ये चल नहीं रहीं। स्वस्थ मशीन पर यह एक छोटी सूची है: कुछ प्रविष्टियाँ जो देर से शुरू होती हैं और फिर रुक जाती हैं। इसके अलावा कुछ भी देखने लायक है।

+
+
+

जो Disabled है और फिर भी चल रही है

+

mismatch:running

+

कॉन्फ़िगरेशन और स्थिति मेल नहीं खातीं। आमतौर पर किसी ने उसे रोके बिना disable कर दिया, और अगला रीस्टार्ट एक आश्चर्य होगा।

+
+
+

जो गायब फ़ाइल की ओर इशारा करती है

+

file:missing

+

ऐसा अनइंस्टॉल जिसने रजिस्ट्रेशन पीछे छोड़ दिया। तब तक हानिरहित जब तक कोई उसे शुरू करने की कोशिश न करे, और इस बात का सुराग कि इस मशीन पर पहले क्या था।

+
+
+

जिस पर किसी ने हस्ताक्षर नहीं किए

+

signed:no peruser:no

+

अपने आप में किसी चीज़ का प्रमाण नहीं, और पढ़ना शुरू करने की सही जगह। दूसरा शब्द प्रति-उपयोगकर्ता परिवारों को हटा देता है, जो वरना सूची को लगभग-एक-जैसी प्रविष्टियों से भर देते हैं।

+
+
+

जो सबसे मज़बूत विशेषाधिकार माँगती है

+

privilege:SeDebugPrivilege

+

एक विशेषाधिकार जो किसी प्रक्रिया को दूसरी किसी भी प्रक्रिया को खोलने देता है। मुट्ठी भर वैध सेवाएँ इसे माँगती हैं, और यह जानना ज़रूरी है कि आपकी मशीन पर कौन सी माँगती हैं।

+
+
+

जो ट्रिगर का इंतज़ार कर रही है

+

trigger:any status:stopped

+

इसलिए रुकी हुई कि अभी किसी ने उन्हें माँगा नहीं, इसलिए नहीं कि कुछ गलत है। यह जानना कि ये कौन सी हैं, वही तरीका है जिससे पहली सूची डरावनी नहीं रहती।

+
+
+
+
+ +
+
+

वह जो इन सबसे बेहतर है

+

मशीन से ही पूछें, जब वह काम कर रही थी।

+

मशीन के सेवा में जाने के दिन एक स्नैपशॉट लें। तब क्या यह चलना चाहिए बदलकर क्या यह तब चल रही थी जब सब काम करता था बन जाता है, एक सवाल आपकी मशीन के बारे में, किसी लेख की मशीन के बारे में नहीं।

+
bws snapshot create C:\baselines\web01.json --note "after the build"
+# ... एक हफ़्ते, एक पैच या एक घटना के बाद
+bws snapshot diff C:\baselines\web01.json --live
+

कॉन्फ़िगरेशन को चलने की स्थिति से अलग बताया जाता है, इसलिए जवाब चालीस सेवाएँ नहीं हैं जो संयोग से चल रही हैं, वह स्टार्टअप प्रकार है जिसे किसी ने बदला।

+ ड्रिफ्ट के लिए मशीन का ऑडिट +
+
+ +
+
+

कुछ भी रोकने से पहले

+

इस टूल में हर स्टॉप पहले अपनी योजना दिखाता है: चरण, उनके साथ क्या बंद होता है, और चेतावनी जब उनमें से कोई ऐसी चीज़ हो जिसके बिना मशीन काम नहीं करती। उनकी सूची सात की एक शुरुआती सूची है: RPC के दोनों हिस्से और DCOM लॉन्चर, खाता प्रबंधक, कुंजी अलगाव, सत्र प्रबंधक और प्लग एंड प्ले, और रिमोट डेस्कटॉप उसमें नहीं है, इसलिए रिमोट सत्र में योजना पढ़ें।

+ +
+
diff --git a/site/pages/what-should-be-running/th.html b/site/pages/what-should-be-running/th.html new file mode 100644 index 0000000..8871a16 --- /dev/null +++ b/site/pages/what-should-be-running/th.html @@ -0,0 +1,86 @@ + + + + + +
+
+ คู่มือ +

บริการตัวไหนควรทำงาน

+

คำตอบที่ตรงไปตรงมาคือไม่มีใครบอกคุณได้ และทุกรายชื่อที่อ้างว่าบอกได้กำลังอธิบายเครื่องที่ไม่ใช่ของคุณ สิ่งที่ตอบได้แคบกว่าและมีประโยชน์กว่ามาก: อะไรบนเครื่องนี้ที่ไม่ลงตัว และอะไรต่างจากตอนที่มันยังใช้งานได้

+
+
+ +
+
+

ทำไมคำถามทั่วไปจึงไม่มีคำตอบ

+
    +
  • ชุดของบริการต่างกันตามรุ่น เวอร์ชัน และบทบาทของ Windows โดเมนคอนโทรลเลอร์ แล็ปท็อป และโฮสต์คอนเทนเนอร์ไม่เหมือนกันในแทบทุกเรื่อง และรายชื่อที่เขียนไว้สำหรับอย่างหนึ่งผิดสำหรับอย่างอื่น
  • +
  • ครึ่งหนึ่งของสิ่งที่ติดตั้งไม่ได้มาจาก Windows ไดรเวอร์ เอเจนต์ บริการอัปเดต เดมอนใบอนุญาต ทุกตัวถูกบางอย่างวางไว้ที่นั่น และไม่มีรายชื่อทั่วไปที่รู้ว่าอะไร
  • +
  • บริการส่วนใหญ่ตั้งใจให้หยุดอยู่ Windows สมัยใหม่เริ่มแค่เศษเสี้ยวของสิ่งที่ลงทะเบียน ที่เหลือรอทริกเกอร์ อุปกรณ์มาถึง พอร์ตเปิด การเข้าร่วมโดเมน และหยุดคือสถานะที่ถูกต้องของมัน
  • +
  • รายชื่อ “ปิดสิ่งเหล่านี้เพื่อประสิทธิภาพ” คือวิธีที่เครื่องพัง บริการที่ดูเหมือนว่างคือตัวที่มีบางอย่างเริ่มตามความต้องการ และความล้มเหลวปรากฏหลังจากนั้นหนึ่งสัปดาห์ในที่ที่ไม่เกี่ยวข้อง
  • +
+
+
+ +
+
+

คำถามที่มีคำตอบ

+
+
+

อะไรที่ควรทำงานแต่ไม่ได้ทำงาน

+

start:auto !status:running

+

Windows ถูกสั่งให้เริ่มสิ่งเหล่านี้และพวกมันไม่ได้ทำงาน บนเครื่องที่แข็งแรงนี่คือรายชื่อสั้นๆ รายการสองสามตัวที่เริ่มช้าแล้วหยุดอีก อย่างอื่นก็ควรดูสักหน่อย

+
+
+

อะไรที่ปิดใช้งานแต่ยังทำงาน

+

mismatch:running

+

การกำหนดค่าและสถานะขัดแย้งกัน มักเป็นเพราะมีคนปิดใช้งานมันโดยไม่ได้หยุด และการรีสตาร์ตครั้งถัดไปจะเป็นเรื่องแปลกใจ

+
+
+

อะไรที่ชี้ไปยังไฟล์ที่หายไป

+

file:missing

+

การถอนการติดตั้งที่ทิ้งการลงทะเบียนไว้ ไม่เป็นอันตรายจนกว่าจะมีอะไรพยายามเริ่มมัน และเป็นเบาะแสว่าเคยมีอะไรอยู่บนเครื่องนี้

+
+
+

อะไรที่ไม่มีใครลงลายเซ็น

+

signed:no peruser:no

+

ไม่ใช่หลักฐานของอะไรด้วยตัวเอง และเป็นที่ที่เหมาะจะเริ่มอ่าน คำค้นที่สองตัดตระกูลต่อผู้ใช้ออก ซึ่งไม่เช่นนั้นจะทำให้รายชื่อเต็มไปด้วยรายการที่เกือบซ้ำกัน

+
+
+

อะไรที่ขอสิทธิพิเศษที่แรงที่สุด

+

privilege:SeDebugPrivilege

+

สิทธิพิเศษที่ให้กระบวนการเปิดกระบวนการอื่นได้ทุกตัว บริการที่ถูกต้องไม่กี่ตัวขอมัน และควรรู้ว่าตัวไหนบนเครื่องของคุณที่ขอ

+
+
+

อะไรที่กำลังรอทริกเกอร์

+

trigger:any status:stopped

+

หยุดอยู่เพราะยังไม่มีอะไรขอพวกมัน ไม่ใช่เพราะมีบางอย่างผิด การรู้ว่าตัวไหนเป็นแบบนี้คือวิธีที่รายชื่อแรกหยุดน่าตกใจ

+
+
+
+
+ +
+
+

อันที่ชนะทุกอย่าง

+

ถามเครื่องเอง ตอนที่มันยังใช้งานได้

+

สร้างสแนปช็อตในวันที่เครื่องเข้าสู่การใช้งาน แล้ว สิ่งนี้ควรทำงานไหม จะกลายเป็น สิ่งนี้ทำงานตอนที่ทุกอย่างปกติไหม คำถามเกี่ยวกับเครื่องของคุณ ไม่ใช่เกี่ยวกับเครื่องในบทความ

+
bws snapshot create C:\baselines\web01.json --note "after the build"
+# ... หนึ่งสัปดาห์ แพตช์ หรือเหตุการณ์ผ่านไป
+bws snapshot diff C:\baselines\web01.json --live
+

การกำหนดค่ารายงานแยกจากสถานะการทำงาน คำตอบจึงไม่ใช่บริการสี่สิบตัวที่บังเอิญทำงานอยู่ แต่เป็นประเภทการเริ่มต้นที่ใครสักคนเปลี่ยน

+ ตรวจสอบดริฟต์ของเครื่อง +
+
+ +
+
+

ก่อนจะหยุดอะไร

+

ทุกการหยุดในเครื่องมือนี้แสดงแผนก่อน: ขั้นตอน สิ่งที่ล้มตามไปด้วย และคำเตือนเมื่อหนึ่งในนั้นเป็นสิ่งที่เครื่องทำงานไม่ได้ถ้าไม่มี รายชื่อของสิ่งเหล่านั้นเป็นรายชื่อตั้งต้น 7 ตัว ได้แก่ RPC สองส่วนและตัวเปิด DCOM ตัวจัดการบัญชี การแยกคีย์ ตัวจัดการเซสชัน และ plug and play และ รีโมตเดสก์ท็อปไม่อยู่ในนั้น ดังนั้นเมื่อทำผ่านเซสชันระยะไกล ให้อ่านแผน

+ +
+
diff --git a/site/site.json b/site/site.json index 31e3f03..80a8b43 100644 --- a/site/site.json +++ b/site/site.json @@ -7,7 +7,7 @@ "support": "https://donislawdev.com/support/", "_languages": "The languages that are PUBLISHED, in the order the switch lists them. The first is the default and lives at the root. The others live under /{code}/. A language that is in language_registry and not here is prepared and unreachable, which is how it is written and built before it goes live.", - "languages": ["en", "cs", "de", "es", "fr", "id", "it", "ja", "ko", "nl", "pl", "pt-br", "ro", "ru", "tr", "uk", "vi", "zh-hans", "zh-hant"], + "languages": ["en", "cs", "de", "es", "fr", "hi", "id", "it", "ja", "ko", "nl", "pl", "pt-br", "ro", "ru", "th", "tr", "uk", "vi", "zh-hans", "zh-hant", "ar"], "_language_registry": "How each language is written, in one place. The key is the address code in lower case and the name of its files (site/i18n/{code}.json, site/pages/{id}/{code}.html). tag is what lang and hreflang carry, locale is og:locale, name is the language in its OWN alphabet and is never translated, short is what the switch shows for the language you are in. dir is written only when it is rtl. slugs is own when the language has a slug of its own for every page in each page.json, and english when its pages live at the default language's slugs - the choice for alphabets that cannot be an ASCII address without being transliterated.", "language_registry": { diff --git a/src/Bws.Core/Bws.Core.csproj b/src/Bws.Core/Bws.Core.csproj index 46b39ed..d927c00 100644 --- a/src/Bws.Core/Bws.Core.csproj +++ b/src/Bws.Core/Bws.Core.csproj @@ -17,7 +17,7 @@ build time and leaves nothing behind at runtime, which is why ADR-15 accepts it while the project otherwise keeps its dependency list short. --> - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/src/Bws.Gui/Bws.Gui.csproj b/src/Bws.Gui/Bws.Gui.csproj index 5db4803..6207062 100644 --- a/src/Bws.Gui/Bws.Gui.csproj +++ b/src/Bws.Gui/Bws.Gui.csproj @@ -16,15 +16,16 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/src/Bws.Gui/ExternalLinks.cs b/src/Bws.Gui/ExternalLinks.cs index 0b808f7..5b1f407 100644 --- a/src/Bws.Gui/ExternalLinks.cs +++ b/src/Bws.Gui/ExternalLinks.cs @@ -296,9 +296,29 @@ internal static string Refused(Exception failure) => desktop.QueryService(PInvoke.SID_STopLevelBrowser, out var browser); browser.QueryActiveShellView(out var view); + // The shell is asked for IDispatch, as in the sequence Microsoft published. Asking for the + // dual interface by name instead would put a different question to the shell than the one + // that sequence is written for, and nothing here has measured how the shell answers it. + // + // The answer comes back as a raw pointer, because CsWin32 stopped turning it into an object + // somewhere between 0.3.298 and 0.3.363 and this call is the one place the window feels it. + // So the object is made here, the way the marshaller used to make it - wrap the pointer, + // then give back the reference the shell's answer carried, whether or not the wrapping or + // the cast threw. var dispatch = DispatchInterface; view.GetItemObject(_SVGIO.SVGIO_BACKGROUND, &dispatch, out var background); - return ((IShellFolderViewDual)background).Application as IShellDispatch2; + IShellFolderViewDual folderView; + + try + { + folderView = (IShellFolderViewDual)Marshal.GetObjectForIUnknown((nint)background); + } + finally + { + Marshal.Release((nint)background); + } + + return folderView.Application as IShellDispatch2; } } diff --git a/tests/Bws.Architecture.Tests/Bws.Architecture.Tests.csproj b/tests/Bws.Architecture.Tests/Bws.Architecture.Tests.csproj index 3afa25e..fa3c165 100644 --- a/tests/Bws.Architecture.Tests/Bws.Architecture.Tests.csproj +++ b/tests/Bws.Architecture.Tests/Bws.Architecture.Tests.csproj @@ -2,13 +2,19 @@ false + + + Exe - - - + + + + Exe @@ -12,10 +18,10 @@ properties over what a command line gets from outside: the arguments somebody types, the line the plan hands them to paste, and every JSON document this tool prints. --> - - - - + + + + diff --git a/tests/Bws.Core.Tests/BulkRunTests.cs b/tests/Bws.Core.Tests/BulkRunTests.cs index 9b69f58..5f1adc2 100644 --- a/tests/Bws.Core.Tests/BulkRunTests.cs +++ b/tests/Bws.Core.Tests/BulkRunTests.cs @@ -189,7 +189,7 @@ public void A_step_announces_its_place_in_the_whole_selection() var control = Running("MRxSmb20", "LanmanWorkstation", "SessionEnv", "Netlogon"); new BulkRunner(new PlanRunner(control, new FakeClock())).Run( - plan, Minute, starting: (_, number) => announced.Add(number)); + plan, Minute, starting: (_, number) => announced.Add(number), cancellation: TestContext.Current.CancellationToken); Assert.Equal(Enumerable.Range(1, plan.Steps.Count()), announced); } @@ -228,7 +228,7 @@ public void A_selection_with_nothing_in_it_is_never_carried_out() { var runner = new BulkRunner(new PlanRunner(new FakeScmControl(), new FakeClock())); - Assert.Throws(() => runner.Run(Bulk(ActionKind.Stop, []), Minute)); + Assert.Throws(() => runner.Run(Bulk(ActionKind.Stop, []), Minute, cancellation: TestContext.Current.CancellationToken)); } /// @@ -257,7 +257,7 @@ public void A_selection_holding_a_plan_with_problems_is_never_carried_out() var control = Running("Spooler"); var runner = new BulkRunner(new PlanRunner(control, new FakeClock())); - Assert.Throws(() => runner.Run(bulk, Minute)); + Assert.Throws(() => runner.Run(bulk, Minute, cancellation: TestContext.Current.CancellationToken)); // Nothing was touched, which is the half that makes the check worth putting up front. Assert.Empty(control.Requested); diff --git a/tests/Bws.Core.Tests/Bws.Core.Tests.csproj b/tests/Bws.Core.Tests/Bws.Core.Tests.csproj index 7ca4fff..8c8469a 100644 --- a/tests/Bws.Core.Tests/Bws.Core.Tests.csproj +++ b/tests/Bws.Core.Tests/Bws.Core.Tests.csproj @@ -2,13 +2,19 @@ false + + + Exe - - - + + + - + diff --git a/tests/Bws.Core.Tests/EndingRightsTests.cs b/tests/Bws.Core.Tests/EndingRightsTests.cs index 6c609ac..e0e4262 100644 --- a/tests/Bws.Core.Tests/EndingRightsTests.cs +++ b/tests/Bws.Core.Tests/EndingRightsTests.cs @@ -135,7 +135,7 @@ public void The_ending_is_handed_the_identity_the_plan_froze() var plan = Plan(catalog, new FakeEndingFacts().StartedAt(4444, 4242), immediate: true); var control = new FakeScmControl().RunningIn("MRxSmb20", 4444); - _ = new PlanRunner(control, new FakeClock()).Run(plan, TimeSpan.FromMinutes(1)); + _ = new PlanRunner(control, new FakeClock()).Run(plan, TimeSpan.FromMinutes(1), cancellation: TestContext.Current.CancellationToken); Assert.Equal(4444, Assert.Single(control.Ended)); Assert.Equal(4242, Assert.Single(control.EndedWith)); diff --git a/tests/Bws.Core.Tests/EscalationRunTests.cs b/tests/Bws.Core.Tests/EscalationRunTests.cs index 0ab6287..c4c0320 100644 --- a/tests/Bws.Core.Tests/EscalationRunTests.cs +++ b/tests/Bws.Core.Tests/EscalationRunTests.cs @@ -30,7 +30,7 @@ public void The_process_is_ended_when_the_stop_before_it_ran_out_of_time() .RunningIn("Spooler", Held) .Reaching("Spooler", new ServiceProgress(EntryStatus.StopPending, 0, TimeSpan.Zero, Held)); - var run = new PlanRunner(control, new FakeClock()).Run(Forced(), TimeSpan.FromSeconds(30)); + var run = new PlanRunner(control, new FakeClock()).Run(Forced(), TimeSpan.FromSeconds(30), cancellation: TestContext.Current.CancellationToken); Assert.Equal(StepOutcome.TimedOut, run.Results[0].Outcome); Assert.Equal(StepOutcome.Succeeded, run.Results[1].Outcome); @@ -45,7 +45,7 @@ public void Nothing_is_ended_when_the_stop_before_it_worked() // a stop that worked does nothing at all. var control = new FakeScmControl().At("Spooler", EntryStatus.Running).RunningIn("Spooler", Held); - var run = new PlanRunner(control, new FakeClock()).Run(Forced(), TimeSpan.FromSeconds(30)); + var run = new PlanRunner(control, new FakeClock()).Run(Forced(), TimeSpan.FromSeconds(30), cancellation: TestContext.Current.CancellationToken); Assert.Equal(StepOutcome.Succeeded, run.Results[0].Outcome); Assert.Equal(SkipReason.AlreadyThere, run.Results[1].SkippedBecause); @@ -83,7 +83,7 @@ public void A_process_that_is_no_longer_the_one_the_plan_named_is_left_alone() .RunningIn("Spooler", 9999) .Reaching("Spooler", new ServiceProgress(EntryStatus.StopPending, 0, TimeSpan.Zero, 9999)); - var run = new PlanRunner(control, new FakeClock()).Run(Forced(), TimeSpan.FromSeconds(30)); + var run = new PlanRunner(control, new FakeClock()).Run(Forced(), TimeSpan.FromSeconds(30), cancellation: TestContext.Current.CancellationToken); Assert.Equal(StepOutcome.Failed, run.Results[1].Outcome); Assert.Empty(control.Ended); @@ -110,7 +110,7 @@ public void A_run_whose_escalation_arrived_is_a_run_that_worked() .RunningIn("Spooler", Held) .Reaching("Spooler", new ServiceProgress(EntryStatus.StopPending, 0, TimeSpan.Zero, Held)); - var run = new PlanRunner(control, new FakeClock()).Run(Forced(), TimeSpan.FromSeconds(30)); + var run = new PlanRunner(control, new FakeClock()).Run(Forced(), TimeSpan.FromSeconds(30), cancellation: TestContext.Current.CancellationToken); Assert.Equal(StepOutcome.TimedOut, run.Results[0].Outcome); Assert.Equal(StepOutcome.Succeeded, run.Results[1].Outcome); @@ -134,7 +134,7 @@ public void A_process_that_survives_being_ended_is_reported_as_a_step_that_ran_o .SurvivingTermination(Held) .Reaching("Spooler", new ServiceProgress(EntryStatus.StopPending, 0, TimeSpan.Zero, Held)); - var run = new PlanRunner(control, new FakeClock()).Run(Forced(), TimeSpan.FromSeconds(30)); + var run = new PlanRunner(control, new FakeClock()).Run(Forced(), TimeSpan.FromSeconds(30), cancellation: TestContext.Current.CancellationToken); Assert.Equal(Held, Assert.Single(control.Ended)); Assert.Equal(StepOutcome.TimedOut, run.Results[1].Outcome); diff --git a/tests/Bws.Core.Tests/PlanRunClockTests.cs b/tests/Bws.Core.Tests/PlanRunClockTests.cs index 4bc96f4..fd2f3ff 100644 --- a/tests/Bws.Core.Tests/PlanRunClockTests.cs +++ b/tests/Bws.Core.Tests/PlanRunClockTests.cs @@ -42,7 +42,7 @@ public void A_clock_jumping_forward_does_not_give_up_on_a_service_that_is_still_ new ServiceProgress(EntryStatus.Stopped, 0, TimeSpan.Zero, ProcessId: 0)); var run = new PlanRunner(control, new JumpingClock(TimeSpan.FromHours(1))) - .Run(Stopping(), TimeSpan.FromMinutes(1)); + .Run(Stopping(), TimeSpan.FromMinutes(1), cancellation: TestContext.Current.CancellationToken); var result = Assert.Single(run.Results); @@ -64,7 +64,7 @@ public void A_clock_jumping_backward_does_not_report_a_step_as_having_taken_less new ServiceProgress(EntryStatus.Stopped, 0, TimeSpan.Zero, ProcessId: 0)); var run = new PlanRunner(control, new JumpingClock(TimeSpan.FromHours(-1))) - .Run(Stopping(), TimeSpan.FromMinutes(1)); + .Run(Stopping(), TimeSpan.FromMinutes(1), cancellation: TestContext.Current.CancellationToken); var result = Assert.Single(run.Results); diff --git a/tests/Bws.Core.Tests/PlanRunHaltTests.cs b/tests/Bws.Core.Tests/PlanRunHaltTests.cs index d938017..cbd0fb9 100644 --- a/tests/Bws.Core.Tests/PlanRunHaltTests.cs +++ b/tests/Bws.Core.Tests/PlanRunHaltTests.cs @@ -26,7 +26,7 @@ public void Abandoning_during_the_watch_ends_it_rather_than_waiting_out_the_limi .Reaching(Name, PlanRunProgressTests.Pending(0, TimeSpan.Zero)); var run = new PlanRunner(control, clock) - .Run(PlanRunProgressTests.Stopping(), TimeSpan.FromSeconds(60), abandonment: abandonment.Token); + .Run(PlanRunProgressTests.Stopping(), TimeSpan.FromSeconds(60), abandonment: abandonment.Token, cancellation: TestContext.Current.CancellationToken); // The watching ended, the entry may still arrive - which is what the outcome says, on the // owner's decision of 2026-09-30, rather than a new value of it. @@ -44,7 +44,7 @@ public void Abandoning_before_the_request_asks_nothing() .OnItsWay(Name, TimeSpan.FromSeconds(90), PlanRunProgressTests.Pending(1, TimeSpan.Zero)); var run = new PlanRunner(control, clock) - .Run(PlanRunProgressTests.Starting(), TimeSpan.FromSeconds(60), abandonment: abandonment.Token); + .Run(PlanRunProgressTests.Starting(), TimeSpan.FromSeconds(60), abandonment: abandonment.Token, cancellation: TestContext.Current.CancellationToken); Assert.Equal(SkipReason.Cancelled, Assert.Single(run.Results).SkippedBecause); Assert.Empty(control.Requested); @@ -61,7 +61,7 @@ public void Abandoning_while_an_entry_already_on_its_way_is_watched_reports_a_st .OnItsWay(Name, TimeSpan.FromSeconds(90), PlanRunProgressTests.Pending(1, TimeSpan.Zero)); var run = new PlanRunner(control, clock) - .Run(PlanRunProgressTests.Stopping(), TimeSpan.FromSeconds(60), abandonment: abandonment.Token); + .Run(PlanRunProgressTests.Stopping(), TimeSpan.FromSeconds(60), abandonment: abandonment.Token, cancellation: TestContext.Current.CancellationToken); Assert.Equal(SkipReason.Cancelled, Assert.Single(run.Results).SkippedBecause); Assert.Empty(control.Requested); diff --git a/tests/Bws.Core.Tests/PlanRunProgressTests.cs b/tests/Bws.Core.Tests/PlanRunProgressTests.cs index 8082df8..4296d7a 100644 --- a/tests/Bws.Core.Tests/PlanRunProgressTests.cs +++ b/tests/Bws.Core.Tests/PlanRunProgressTests.cs @@ -150,7 +150,7 @@ public void The_time_the_manager_sits_on_a_request_is_what_outruns_the_limit() .At(Name, EntryStatus.Stopped) .SlowToAnswer(Name, TimeSpan.FromSeconds(30)); - var run = new PlanRunner(control, clock).Run(Starting(), TimeSpan.FromSeconds(1)); + var run = new PlanRunner(control, clock).Run(Starting(), TimeSpan.FromSeconds(1), cancellation: TestContext.Current.CancellationToken); Assert.Equal(StepOutcome.Succeeded, run.Results[0].Outcome); Assert.Equal(30_000, Assert.Single(run.OutranTheCeiling).Answered); diff --git a/tests/Bws.Core.Tests/PlanRunnerTests.cs b/tests/Bws.Core.Tests/PlanRunnerTests.cs index 9136667..e79ec00 100644 --- a/tests/Bws.Core.Tests/PlanRunnerTests.cs +++ b/tests/Bws.Core.Tests/PlanRunnerTests.cs @@ -332,7 +332,7 @@ public void A_step_announces_its_place_in_the_plan_rather_than_its_place_in_the_ new PlanRunner(control, new FakeClock()).Run( Plan(ActionKind.Restart, "MRxSmb20"), Minute, - starting: (_, number) => announced.Add(number)); + starting: (_, number) => announced.Add(number), cancellation: TestContext.Current.CancellationToken); // Three and four are missing, because the forward path stopped at the refusal, and // five to seven since 2026-09-30, because what they would put back was never taken @@ -392,7 +392,7 @@ public void A_plan_that_has_problems_is_never_carried_out() var runner = new PlanRunner(new FakeScmControl(), new FakeClock()); - Assert.Throws(() => runner.Run(plan, Minute)); + Assert.Throws(() => runner.Run(plan, Minute, cancellation: TestContext.Current.CancellationToken)); } // -- fixtures -------------------------------------------------------------------------- diff --git a/tests/Bws.Core.Tests/StartFellOverTests.cs b/tests/Bws.Core.Tests/StartFellOverTests.cs index 51f8838..70d3f56 100644 --- a/tests/Bws.Core.Tests/StartFellOverTests.cs +++ b/tests/Bws.Core.Tests/StartFellOverTests.cs @@ -75,7 +75,7 @@ public void A_stop_that_still_reads_running_just_after_the_request_is_watched_ra new ServiceProgress(EntryStatus.Running, 0, TimeSpan.Zero, ProcessId: FakeScmControl.FakeProcess), new ServiceProgress(EntryStatus.Stopped, 0, TimeSpan.Zero, ProcessId: 0)); - var run = new PlanRunner(control, clock).Run(PlanRunProgressTests.Stopping(), TimeSpan.FromSeconds(60)); + var run = new PlanRunner(control, clock).Run(PlanRunProgressTests.Stopping(), TimeSpan.FromSeconds(60), cancellation: TestContext.Current.CancellationToken); var result = Assert.Single(run.Results); Assert.Equal(StepOutcome.Succeeded, result.Outcome); diff --git a/tests/Bws.Gui.Tests/AnswerLineTests.cs b/tests/Bws.Gui.Tests/AnswerLineTests.cs index f07d3cd..d9cf59e 100644 --- a/tests/Bws.Gui.Tests/AnswerLineTests.cs +++ b/tests/Bws.Gui.Tests/AnswerLineTests.cs @@ -123,7 +123,7 @@ public async Task A_shown_column_still_being_read_is_said_under_an_empty_box() var refresh = model.RefreshAsync(); - Assert.True(reader.Entered.Wait(TimeSpan.FromSeconds(10)), "The memory pass never started, so the rest of this proves nothing."); + Assert.True(reader.Entered.Wait(TimeSpan.FromSeconds(10), TestContext.Current.CancellationToken), "The memory pass never started, so the rest of this proves nothing."); Assert.Equal(string.Empty, model.QueryText); Assert.Equal(Texts.Of("gui.query.readingMemory"), model.Says.AnswerLine); diff --git a/tests/Bws.Gui.Tests/Bws.Gui.Tests.csproj b/tests/Bws.Gui.Tests/Bws.Gui.Tests.csproj index d97f1a3..851028e 100644 --- a/tests/Bws.Gui.Tests/Bws.Gui.Tests.csproj +++ b/tests/Bws.Gui.Tests/Bws.Gui.Tests.csproj @@ -3,6 +3,12 @@ false + + Exe + - - - - + + + + diff --git a/tests/Bws.Gui.Tests/CatalogueViewGuards.cs b/tests/Bws.Gui.Tests/CatalogueViewGuards.cs index 6d752bc..d40ddf1 100644 --- a/tests/Bws.Gui.Tests/CatalogueViewGuards.cs +++ b/tests/Bws.Gui.Tests/CatalogueViewGuards.cs @@ -1,6 +1,5 @@ using System.Windows.Controls; using Bws.Gui.ViewModels; -using Xunit.Abstractions; namespace Bws.Gui.Tests; @@ -185,7 +184,7 @@ public async Task Disposing_the_prepared_models_lets_the_stalled_reads_go() // Awaited rather than polled: the task is kept exactly so that somebody can. With a limit, // because a gate that stays shut is the fault this guards against, and a guard that // waited forever for it would hang the whole run instead of going red. - await ready.StillReading.WaitAsync(TimeSpan.FromSeconds(10)); + await ready.StillReading.WaitAsync(TimeSpan.FromSeconds(10), TestContext.Current.CancellationToken); Assert.NotEqual(Texts.Of("gui.status.reading"), loading.Says.Status); Assert.Empty(loading.Rows); diff --git a/tests/Bws.Gui.Tests/DiffExportingTests.cs b/tests/Bws.Gui.Tests/DiffExportingTests.cs index f0ff831..957d57e 100644 --- a/tests/Bws.Gui.Tests/DiffExportingTests.cs +++ b/tests/Bws.Gui.Tests/DiffExportingTests.cs @@ -82,7 +82,7 @@ public async Task The_window_writes_it_with_the_mark_a_spreadsheet_needs_and_say Assert.Null(await model.Snapshotting.ExportAsync(path, rows)); - var bytes = await File.ReadAllBytesAsync(path); + var bytes = await File.ReadAllBytesAsync(path, TestContext.Current.CancellationToken); Assert.Equal([0xEF, 0xBB, 0xBF], bytes.Take(3)); Assert.Equal(DiffExporting.Done(rows.Count, "comparison.csv"), model.Says.Done); diff --git a/tests/Bws.Gui.Tests/ExportingGuards.cs b/tests/Bws.Gui.Tests/ExportingGuards.cs index a080ed9..5bcf0c8 100644 --- a/tests/Bws.Gui.Tests/ExportingGuards.cs +++ b/tests/Bws.Gui.Tests/ExportingGuards.cs @@ -226,13 +226,13 @@ public async Task What_lands_on_disk_carries_the_mark_a_spreadsheet_needs() { Assert.Null(WpfHost.On(() => window.WriteShownTo(path))); - var bytes = await File.ReadAllBytesAsync(path); + var bytes = await File.ReadAllBytesAsync(path, TestContext.Current.CancellationToken); Assert.True( bytes.Length > 3 && bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF, "The file has no byte order mark, so a spreadsheet will guess the encoding."); - var lines = await File.ReadAllLinesAsync(path); + var lines = await File.ReadAllLinesAsync(path, TestContext.Current.CancellationToken); Assert.Equal(2, lines.Length); Assert.Contains("Spooler", lines[1], StringComparison.Ordinal); diff --git a/tests/Bws.Gui.Tests/ExternalLinksGuards.cs b/tests/Bws.Gui.Tests/ExternalLinksGuards.cs index 2b38bfb..383a53f 100644 --- a/tests/Bws.Gui.Tests/ExternalLinksGuards.cs +++ b/tests/Bws.Gui.Tests/ExternalLinksGuards.cs @@ -161,7 +161,7 @@ public async Task A_shell_that_does_not_answer_is_a_sentence_once_the_bound_has_ // The test's own limit is far past the bound, so reaching it means the bound was not // kept - which is the window waiting on a shell that never answers. - Assert.Same(asking, await Task.WhenAny(asking, Task.Delay(TimeSpan.FromSeconds(30)))); + Assert.Same(asking, await Task.WhenAny(asking, Task.Delay(TimeSpan.FromSeconds(30), TestContext.Current.CancellationToken))); Assert.Equal("slow", await asking); } finally diff --git a/tests/Bws.Gui.Tests/HistoryExportingTests.cs b/tests/Bws.Gui.Tests/HistoryExportingTests.cs index 5ac6b95..b0992b5 100644 --- a/tests/Bws.Gui.Tests/HistoryExportingTests.cs +++ b/tests/Bws.Gui.Tests/HistoryExportingTests.cs @@ -90,7 +90,7 @@ public async Task The_window_writes_it_with_the_mark_a_spreadsheet_needs_and_say Assert.Null(await model.History.ExportAsync(path, rows)); - var bytes = await File.ReadAllBytesAsync(path); + var bytes = await File.ReadAllBytesAsync(path, TestContext.Current.CancellationToken); Assert.Equal([0xEF, 0xBB, 0xBF], bytes.Take(3)); Assert.Contains(HistoryLog.SystemSid, Encoding.UTF8.GetString(bytes), StringComparison.Ordinal); diff --git a/tests/Bws.Gui.Tests/HistoryWindowGuards.cs b/tests/Bws.Gui.Tests/HistoryWindowGuards.cs index 5a03879..2a0b883 100644 --- a/tests/Bws.Gui.Tests/HistoryWindowGuards.cs +++ b/tests/Bws.Gui.Tests/HistoryWindowGuards.cs @@ -168,7 +168,7 @@ public async Task Escape_over_a_history_read_again_and_found_empty_puts_it_away_ WpfHost.On(() => model.History.Shown!.Filter.SearchText = "bits"); log.History = HistoryLog.Empty(); - await WpfHost.On(() => model.History.Fresh()).WaitAsync(TimeSpan.FromSeconds(10)); + await WpfHost.On(() => model.History.Fresh()).WaitAsync(TimeSpan.FromSeconds(10), TestContext.Current.CancellationToken); WpfHost.Settled(); Assert.False(model.History.Shown!.Filter.Offered); @@ -214,7 +214,7 @@ public async Task The_export_waits_for_a_reading() Assert.False(WpfHost.On(() => window.ChangeHistory.ExportButton.IsEnabled)); log.Release(); - await model.History.Out.WaitAsync(TimeSpan.FromSeconds(10)); + await model.History.Out.WaitAsync(TimeSpan.FromSeconds(10), TestContext.Current.CancellationToken); WpfHost.Settled(); Assert.True(WpfHost.On(() => window.ChangeHistory.ExportButton.IsEnabled)); diff --git a/tests/Bws.Gui.Tests/KeptColumnGuards.cs b/tests/Bws.Gui.Tests/KeptColumnGuards.cs index 7c0e52f..e6b6d11 100644 --- a/tests/Bws.Gui.Tests/KeptColumnGuards.cs +++ b/tests/Bws.Gui.Tests/KeptColumnGuards.cs @@ -333,7 +333,7 @@ public async Task The_order_somebody_put_the_list_in_comes_back_the_next_time_it Assert.Contains( "\"sort\"", - await File.ReadAllTextAsync(file.Where), + await File.ReadAllTextAsync(file.Where, TestContext.Current.CancellationToken), StringComparison.Ordinal); var second = await Opened(file); diff --git a/tests/Bws.Gui.Tests/KeptOrderGuards.cs b/tests/Bws.Gui.Tests/KeptOrderGuards.cs index 945a606..2715f9d 100644 --- a/tests/Bws.Gui.Tests/KeptOrderGuards.cs +++ b/tests/Bws.Gui.Tests/KeptOrderGuards.cs @@ -180,7 +180,7 @@ [.. ColumnLayout.DefaultFor(EntryScope.Services).Columns], Assert.DoesNotContain( "\"sort\"", - await File.ReadAllTextAsync(file.Where), + await File.ReadAllTextAsync(file.Where, TestContext.Current.CancellationToken), StringComparison.Ordinal); // A small machine of its own, handed over BEFORE the window, for the reason WpfHost gives: diff --git a/tests/Bws.Gui.Tests/MemoryBudgetTests.cs b/tests/Bws.Gui.Tests/MemoryBudgetTests.cs index 97f4220..00d8468 100644 --- a/tests/Bws.Gui.Tests/MemoryBudgetTests.cs +++ b/tests/Bws.Gui.Tests/MemoryBudgetTests.cs @@ -1,6 +1,5 @@ using Bws.Core; using Bws.Gui.ViewModels; -using Xunit.Abstractions; namespace Bws.Gui.Tests; diff --git a/tests/Bws.Gui.Tests/MinimisedWindowGuards.cs b/tests/Bws.Gui.Tests/MinimisedWindowGuards.cs index cd32004..8c5f052 100644 --- a/tests/Bws.Gui.Tests/MinimisedWindowGuards.cs +++ b/tests/Bws.Gui.Tests/MinimisedWindowGuards.cs @@ -48,12 +48,12 @@ public async Task A_minimised_window_stops_asking_and_asks_at_once_when_it_comes // A reading already out when the window went away is let finish, or it would be counted // against the minimised window. - await Task.Delay(200); + await Task.Delay(200, TestContext.Current.CancellationToken); WpfHost.Settled(); var minimised = Asked(machine); - await Task.Delay(1500); + await Task.Delay(1500, TestContext.Current.CancellationToken); Assert.Equal(minimised, Asked(machine)); @@ -64,7 +64,7 @@ public async Task A_minimised_window_stops_asking_and_asks_at_once_when_it_comes while (Asked(machine) == minimised && clock.ElapsedMilliseconds < 600) { - await Task.Delay(10); + await Task.Delay(10, TestContext.Current.CancellationToken); } Assert.True( @@ -101,12 +101,12 @@ public async Task A_window_opened_minimised_reads_once_and_waits_to_be_looked_at // The model was read once before the window, and the first look reads it again. WpfHost.Until(() => machine.FullReads >= 2, "the first look read the machine"); - await Task.Delay(200); + await Task.Delay(200, TestContext.Current.CancellationToken); WpfHost.Settled(); var looked = Asked(machine); - await Task.Delay(1500); + await Task.Delay(1500, TestContext.Current.CancellationToken); Assert.Equal(looked, Asked(machine)); @@ -116,7 +116,7 @@ public async Task A_window_opened_minimised_reads_once_and_waits_to_be_looked_at while (Asked(machine) == looked && clock.ElapsedMilliseconds < 600) { - await Task.Delay(10); + await Task.Delay(10, TestContext.Current.CancellationToken); } Assert.True(Asked(machine) > looked, "Coming back to a window opened minimised asked the machine nothing for 600 ms."); diff --git a/tests/Bws.Gui.Tests/PanelReadingTests.cs b/tests/Bws.Gui.Tests/PanelReadingTests.cs index 68242ad..9a1b570 100644 --- a/tests/Bws.Gui.Tests/PanelReadingTests.cs +++ b/tests/Bws.Gui.Tests/PanelReadingTests.cs @@ -168,7 +168,7 @@ public async Task A_memory_read_for_a_process_that_has_since_restarted_is_read_a Assert.Equal(ReadOutcome.NotRead, row.Entry.Memory.Outcome); memory.Release(); - await first.WaitAsync(TimeSpan.FromSeconds(10)); + await first.WaitAsync(TimeSpan.FromSeconds(10), TestContext.Current.CancellationToken); Assert.Equal(4321, row.Entry.ProcessId.Value); Assert.True(row.Entry.Memory.IsPresent, "The memory was dropped for the old process and never read for the new one."); @@ -199,7 +199,7 @@ public async Task A_failure_is_said_for_the_entry_that_failed_and_not_for_the_ne model.Chosen.Show(); inspector.Release(); - await first.WaitAsync(TimeSpan.FromSeconds(10)); + await first.WaitAsync(TimeSpan.FromSeconds(10), TestContext.Current.CancellationToken); Assert.True(next.Entry.Signature.IsPresent); Assert.Equal(string.Empty, model.Chosen.Notice); diff --git a/tests/Bws.Gui.Tests/Parallelism.cs b/tests/Bws.Gui.Tests/Parallelism.cs index 952bd16..3819de6 100644 --- a/tests/Bws.Gui.Tests/Parallelism.cs +++ b/tests/Bws.Gui.Tests/Parallelism.cs @@ -14,4 +14,12 @@ // // Cost: this assembly held 39 tests running in 414 ms when the line was added, so serialising // them is not a trade anybody has to think about. -[assembly: CollectionBehavior(DisableTestParallelization = true)] +// +// Written as Parallelization(Mode = None) since xUnit.net v3 4.0, whose documentation gives the old +// DisableTestParallelization = true as equivalent to none, and which turned the old spelling into +// a compile error. The attribute lives in Xunit.v3 and the mode in Xunit.Sdk, neither of which the +// project imports for everything else. +using Xunit.Sdk; +using Xunit.v3; + +[assembly: Parallelization(Mode = ParallelMode.None)] diff --git a/tests/Bws.Gui.Tests/SnapshotFormTests.cs b/tests/Bws.Gui.Tests/SnapshotFormTests.cs index c0e3f12..34fcec9 100644 --- a/tests/Bws.Gui.Tests/SnapshotFormTests.cs +++ b/tests/Bws.Gui.Tests/SnapshotFormTests.cs @@ -71,7 +71,7 @@ public async Task A_refused_target_keeps_the_form_with_its_note_for_another_fold var model = Model(); var path = Path.Combine(_folder, "somebody-elses.json"); - await File.WriteAllTextAsync(path, "this is not a snapshot"); + await File.WriteAllTextAsync(path, "this is not a snapshot", TestContext.Current.CancellationToken); model.Snapshotting.Prepare(); model.Snapshotting.Form!.Note = "Before the patch"; @@ -79,7 +79,7 @@ public async Task A_refused_target_keeps_the_form_with_its_note_for_another_fold await model.Snapshotting.TakeAsync(path); Assert.Equal("Before the patch", model.Snapshotting.Form?.Note); - Assert.Equal("this is not a snapshot", await File.ReadAllTextAsync(path)); + Assert.Equal("this is not a snapshot", await File.ReadAllTextAsync(path, TestContext.Current.CancellationToken)); } [Fact] @@ -117,7 +117,7 @@ public async Task The_save_button_is_off_while_the_machine_is_read_for_the_snaps machine.ReleaseReadings(); } - await taking.WaitAsync(TimeSpan.FromSeconds(10)); + await taking.WaitAsync(TimeSpan.FromSeconds(10), TestContext.Current.CancellationToken); } private static MainViewModel Model() => new(new LiveMachine(Rows.Entry("Spooler"), Rows.Entry("BITS")), new SteppedClock(), new Inspector()); diff --git a/tests/Bws.Gui.Tests/SnapshotWindowGuards.cs b/tests/Bws.Gui.Tests/SnapshotWindowGuards.cs index 7aa8dd4..98987e5 100644 --- a/tests/Bws.Gui.Tests/SnapshotWindowGuards.cs +++ b/tests/Bws.Gui.Tests/SnapshotWindowGuards.cs @@ -113,7 +113,7 @@ public async Task The_button_is_off_while_the_machine_is_read_and_says_why_on_it Assert.Equal(Texts.Of("gui.action.audit.busy"), WpfHost.On(() => window.Actions.AuditButton.ToolTip)); machine.ReleaseReadings(); - await taking.WaitAsync(TimeSpan.FromSeconds(10)); + await taking.WaitAsync(TimeSpan.FromSeconds(10), TestContext.Current.CancellationToken); Assert.True(WpfHost.On(() => window.Actions.AuditButton.IsEnabled)); } diff --git a/tests/Bws.Gui.Tests/SnapshottingTests.cs b/tests/Bws.Gui.Tests/SnapshottingTests.cs index 0b828ca..f4418ea 100644 --- a/tests/Bws.Gui.Tests/SnapshottingTests.cs +++ b/tests/Bws.Gui.Tests/SnapshottingTests.cs @@ -40,11 +40,11 @@ public async Task A_file_that_is_not_a_snapshot_is_never_written_over_and_is_lef var model = Model(new LiveMachine(Rows.Entry("Spooler"))); var path = Path.Combine(_folder, "somebody-elses.json"); - await File.WriteAllTextAsync(path, "this is not a snapshot"); + await File.WriteAllTextAsync(path, "this is not a snapshot", TestContext.Current.CancellationToken); await model.Snapshotting.TakeAsync(path); - Assert.Equal("this is not a snapshot", await File.ReadAllTextAsync(path)); + Assert.Equal("this is not a snapshot", await File.ReadAllTextAsync(path, TestContext.Current.CancellationToken)); Assert.Contains(Texts.Of("gui.snapshot.fault.notReplaced", string.Empty).Trim(), model.Says.Problem, StringComparison.Ordinal); Assert.Equal(string.Empty, model.Says.Done); } @@ -58,7 +58,7 @@ public async Task A_target_that_will_be_refused_costs_no_reading_of_the_machine( var model = Model(machine); var path = Path.Combine(_folder, "refused-early.json"); - await File.WriteAllTextAsync(path, "this is not a snapshot"); + await File.WriteAllTextAsync(path, "this is not a snapshot", TestContext.Current.CancellationToken); var reads = machine.FullReads; @@ -86,22 +86,22 @@ public async Task A_file_that_appears_while_the_machine_is_read_is_still_never_w { for (var waited = 0; machine.FullReads == reads && waited < 10_000; waited += 10) { - await Task.Delay(10); + await Task.Delay(10, TestContext.Current.CancellationToken); } // Past the first ask by now - the reading counts itself before it waits on the hold. Assert.True(machine.FullReads > reads, "the reading never started"); - await File.WriteAllTextAsync(path, "somebody else's, written meanwhile"); + await File.WriteAllTextAsync(path, "somebody else's, written meanwhile", TestContext.Current.CancellationToken); } finally { machine.ReleaseReadings(); } - await taking.WaitAsync(TimeSpan.FromSeconds(10)); + await taking.WaitAsync(TimeSpan.FromSeconds(10), TestContext.Current.CancellationToken); - Assert.Equal("somebody else's, written meanwhile", await File.ReadAllTextAsync(path)); + Assert.Equal("somebody else's, written meanwhile", await File.ReadAllTextAsync(path, TestContext.Current.CancellationToken)); Assert.Contains(Texts.Of("gui.snapshot.fault.notReplaced", string.Empty).Trim(), model.Says.Problem, StringComparison.Ordinal); } @@ -152,7 +152,7 @@ public async Task A_file_that_is_not_a_snapshot_is_said_at_the_foot_and_nothing_ var model = Model(new LiveMachine(Rows.Entry("Spooler"))); var path = Path.Combine(_folder, "not-a-snapshot.json"); - await File.WriteAllTextAsync(path, "{}"); + await File.WriteAllTextAsync(path, "{}", TestContext.Current.CancellationToken); await model.Snapshotting.CompareAsync(path); diff --git a/tests/Bws.Gui.Tests/TwoSnapshotsTests.cs b/tests/Bws.Gui.Tests/TwoSnapshotsTests.cs index 37dca7c..08941a5 100644 --- a/tests/Bws.Gui.Tests/TwoSnapshotsTests.cs +++ b/tests/Bws.Gui.Tests/TwoSnapshotsTests.cs @@ -70,7 +70,7 @@ public async Task A_second_file_that_is_not_a_snapshot_is_named_and_nothing_take var bad = Path.Combine(_folder, "bad.json"); var model = new MainViewModel(new LiveMachine(Rows.Entry("BITS")), new SteppedClock()); - await File.WriteAllTextAsync(bad, "{}"); + await File.WriteAllTextAsync(bad, "{}", TestContext.Current.CancellationToken); await model.Snapshotting.CompareFilesAsync(good, bad); Assert.Null(model.Snapshotting.Shown); diff --git a/tests/Bws.Integration.Tests/Bws.Integration.Tests.csproj b/tests/Bws.Integration.Tests/Bws.Integration.Tests.csproj index bf6b0b2..63e400f 100644 --- a/tests/Bws.Integration.Tests/Bws.Integration.Tests.csproj +++ b/tests/Bws.Integration.Tests/Bws.Integration.Tests.csproj @@ -3,6 +3,12 @@ false + + Exe + + Exe - - - + + +
你想要在 services.msc 中在這裡