Làm cách nào để tắt một bổ trợ trong Word?


3

Word có chức năng bổ trợ bị vô hiệu hóa (Trợ giúp | Giới thiệu | Các mục bị vô hiệu hóa).

Làm cách nào để thêm bổ trợ vào danh sách bị vô hiệu hóa mà không phải gặp sự cố bổ trợ và chờ lỗi xuất hiện?


Phiên bản nào của từ?
Sam Cogan

2003, nhưng kỹ thuật tôi đã đưa ra hoạt động vào năm 2007 và XP / 2002, chứ không phải vào năm 2000. Xin lỗi, tôi nên đưa ra câu hỏi rằng tôi đã biết câu trả lời nhưng muốn đưa nó lên vì nó dường như không được ghi lại ở bất cứ đâu trên mạng.
Richard Gadsden

Hmm, tôi đã cân nhắc việc hỏi điều này trên superuser và quyết định rằng serverfault phù hợp hơn vì đây là trường hợp có độ phân giải dễ dàng (Sam) cho môi trường người dùng đơn lẻ, nhưng tôi đang sử dụng máy chủ Citrix và tôi cần vô hiệu hóa cho một người dùng chứ không phải toàn bộ máy chủ (do đó hack registry phức tạp của tôi).
Richard Gadsden

Câu trả lời:


5

Tôi đã cố gắng tìm ra định dạng nhị phân của các giá trị trong khóa DisablesItems và bài đăng của bạn ở đây đã đưa tôi đi đúng hướng. Tuy nhiên tôi nghĩ định dạng này hơi khác so với cách bạn nhìn thấy, ít nhất là trong Office 2010.

Theo như tôi có thể nói định dạng là như thế này:

  • Bốn byte đầu tiên là một số nguyên 32 bit. Nó thường có giá trị 1. Tôi không chắc nó có mục đích gì.

  • Bốn byte tiếp theo là số nguyên 32 bit cho chúng ta biết độ dài của đường dẫn dll tính bằng byte, bao gồm ký tự kết thúc (null hoặc 0x0000).

  • Bốn byte tiếp theo là một số nguyên 32 bit cho chúng ta biết độ dài của tên thân thiện tính bằng byte, bao gồm ký tự kết thúc (null hoặc 0x0000).

  • Chuỗi byte tiếp theo là một chuỗi unicode end-endian kết thúc null có chứa đường dẫn đến dll bổ trợ. Vì một số lý do, đường dẫn này dường như chỉ chứa các ký tự chữ thường.

  • Chuỗi byte tiếp theo là một chuỗi unicode end-endian end-end kết thúc có chứa tên thân thiện của bổ trợ.

Tôi đã có thể vô hiệu hóa thành công bổ trợ bằng cách sử dụng mã C # sau:

string path = "<full path to add-in dll>".ToLower();
string friendlyName = "<add-in friendly name>";

MemoryStream stream = new MemoryStream();
BinaryWriter writer = new BinaryWriter(stream);
writer.Write(1); // Unknown
writer.Write((path.Length * 2) + 2); // Path length, 2 bytes per character
writer.Write((friendlyName.Length * 2) + 2); // Friendly name length
writer.Write(Encoding.Unicode.GetBytes(path)); // Path
writer.Write(Convert.ToInt16(0)); // null terminator
writer.Write(Encoding.Unicode.GetBytes(friendlyName)); // Friendly name
writer.Write(Convert.ToInt16(0)); // null terminator
writer.Close();

// Version numbers: 11.0 = Office 2003, 12.0 = Office 2007, 14.0 = Office 2010
RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Office\14.0\Word\Resiliency\DisabledItems", true);
key.SetValue("63CB962", stream.ToArray(), RegistryValueKind.Binary);
key.Close();

Một cách tiếp cận tương tự có thể được sử dụng để giải mã đường dẫn dll của một giá trị hiện có như sau:

// Let 'bytes' be a byte array containing the binary registry value
BinaryReader binaryReader = new BinaryReader(new MemoryStream(bytes));
binaryReader.ReadInt32(); // Read the first four bytes and ignore
int pathLength = binaryReader.ReadInt32(); // The next four bytes are the length of the path
binaryReader.Close();
if (bytes.Length >= 12 + pathLength)
{
    string path = Encoding.Unicode.GetString(bytes, 12, pathLength - 2);
}

2

Trả lời câu hỏi của riêng tôi.

Nó nằm trong sổ đăng ký, trong HKCU \ Software \ Microsoft \ Office [phiên bản] & gt; \ Word \ Resiliency \ DisablesItems (trong đó [phiên bản] là 10.0 cho XP, 11.0 cho 2003 và 12.0 cho 2007).

Các khóa là các khóa nhị phân có tên gồm sáu ký tự (ngẫu nhiên, theo như tôi có thể nói).

Giá trị là: 01,00,00,00, x, 00,00,00, y, [đường dẫn], 00,00, [tên], 00,00,00 x là số byte trong đường dẫn (bao gồm hai byte terminator) và y là số byte trong tên (mà "tên thân thiện"). x + y phải là tổng số byte trừ mười. x và y đều ở dạng hex. Tôi cho rằng chúng thực sự là DWORD, nhưng tôi chỉ cần LSB.

Đường dẫn được mã hóa trong UCS-2, endian nhỏ, vì vậy để đưa ra một ví dụ, "c: \" là 00,63,00,3a, 00,5c

Đúng, mã hóa nhị phân dường như là mã hóa cực kỳ xuất sắc của "Lấy chuỗi ASCII kết thúc null, dịch sang Unicode, sau đó lấy các byte của điều đó và kết thúc null

Lưu ý rằng x và y là số byte, không phải ký tự; có 2 byte cho mỗi ký tự trong UCS-2.

Nếu bạn muốn chặn một mẫu (tức là .dot chứ không phải là một), sau đó đặt 00 cho y và bỏ qua phần tử tên và chấm dứt (để nó kết thúc bằng ba byte null, không phải năm).


1

Theo đó Trang web MS , để tắt một bổ trợ trong word 2007, hãy làm như sau:

  1. Bấm vào hình ảnh Nút Microsoft Office, bấm Tùy chọn Word, rồi bấm Bổ trợ.
  2. Trong hộp Bổ trợ, xác định bổ trợ mà bạn muốn bật hoặc tắt và lưu ý loại Bổ trợ nằm trong cột Loại.
  3. Chọn loại Bổ trợ trong hộp Quản lý, rồi bấm Đi.
  4. Chọn hoặc xóa hộp kiểm cho Bổ trợ mà bạn muốn bật hoặc tắt rồi bấm OK.

Vâng, đó là một cách để làm điều đó, nhưng đối với COM Add-in, nó chỉ hoạt động nếu chúng được tham chiếu trong HKCU; nếu chúng ở HKLM, như thường lệ, thì bạn phải xóa khóa thủ công khỏi HKLM \ SOFTWARE \ Microsoft \ Office \ Word \ Addins. Để vô hiệu hóa việc sử dụng màn hình các mục bị vô hiệu hóa đó, điều này sẽ cho phép bạn vô hiệu hóa một addin HKLM trên cơ sở mỗi người dùng, bạn cần sử dụng hack registry trong câu trả lời của tôi.
Richard Gadsden

1

Lưu ý rằng mã của Eirikur chỉ hoạt động nếu có khóa con Resiliency \ DisconnectItems. Có vẻ như Word sẽ thêm / xóa toàn bộ khóa con này khi tắt / bật. Vì vậy, nếu bạn nhận được một ngoại lệ chạy mã, có lẽ bạn cần thêm khóa con trước.

(Bài đăng của tôi ở đây có lẽ nên được kiểm duyệt, nó thuộc về một nhận xét nhưng tôi không có đủ điểm! Khởi đầu tồi tệ)


Ở đây, có +1 sẽ giúp bạn có một số điểm.
Richard Gadsden
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.